{"id":13990543,"url":"https://github.com/timofurrer/minion-ci","last_synced_at":"2026-01-14T09:39:30.337Z","repository":{"id":57441825,"uuid":"53281569","full_name":"timofurrer/minion-ci","owner":"timofurrer","description":"minimalist, decentralized, flexible Continuous Integration Server for hackers.","archived":true,"fork":false,"pushed_at":"2017-06-15T15:00:23.000Z","size":156,"stargazers_count":44,"open_issues_count":6,"forks_count":4,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-09-22T12:25:19.099Z","etag":null,"topics":["continuous-integration","decentralized","flexible","hacker","minimalist","python","server"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/timofurrer.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGELOG","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-03-06T23:21:43.000Z","updated_at":"2025-09-13T14:52:54.000Z","dependencies_parsed_at":"2022-09-06T02:42:05.194Z","dependency_job_id":null,"html_url":"https://github.com/timofurrer/minion-ci","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/timofurrer/minion-ci","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timofurrer%2Fminion-ci","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timofurrer%2Fminion-ci/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timofurrer%2Fminion-ci/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timofurrer%2Fminion-ci/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/timofurrer","download_url":"https://codeload.github.com/timofurrer/minion-ci/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timofurrer%2Fminion-ci/sbom","scorecard":{"id":886392,"data":{"date":"2025-08-11","repo":{"name":"github.com/timofurrer/minion-ci","commit":"411d0ea6638fb37d7e170cc8c8c5815304cc9f5c"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 2/29 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":0,"reason":"project is archived","details":["Warn: Repository is archived."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 3 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"10 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2018-66 / GHSA-562c-5r94-xh97","Warn: Project is vulnerable to: PYSEC-2019-179 / GHSA-5wv5-4vpf-pj6m","Warn: Project is vulnerable to: PYSEC-2023-62 / GHSA-m2qf-hxjv-5gpq","Warn: Project is vulnerable to: PYSEC-2021-142 / GHSA-8q59-q68h-6hv4","Warn: Project is vulnerable to: PYSEC-2018-49 / GHSA-rprw-h62v-c2w7","Warn: Project is vulnerable to: PYSEC-2014-14 / GHSA-652x-xj99-gmcc","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2014-13 / GHSA-cfj3-7x9c-4p3h","Warn: Project is vulnerable to: PYSEC-2018-28 / GHSA-x84v-xcm2-53pg"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-24T10:13:24.549Z","repository_id":57441825,"created_at":"2025-08-24T10:13:24.549Z","updated_at":"2025-08-24T10:13:24.549Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28416120,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T08:38:59.149Z","status":"ssl_error","status_checked_at":"2026-01-14T08:38:43.588Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["continuous-integration","decentralized","flexible","hacker","minimalist","python","server"],"created_at":"2024-08-09T13:02:54.227Z","updated_at":"2026-01-14T09:39:30.318Z","avatar_url":"https://github.com/timofurrer.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"minion-ci\n=========\n|pypi| |license|\n\n**minion-ci** is a minimalist, decentralized, flexible Continuous Integration Server for hackers.\n\n|screenshot_index|\n\n\n.. contents::\n    :local:\n    :depth: 2\n    :backlinks: none\n\nQuickstart\n----------\n\nMaking your repository *minion compatible* is as easy as running this command in the root of your repository:\n\n.. code::\n\n    minion init\n\nAfter that you should modify the ``minion.yml`` file in your repository to fit your needs. Make a nice commit and run the following command to start your first job:\n\n.. code::\n\n    git minion\n    \nIf the *minion server* successfully started you can browse the web interface at http://localhost:5000\n\nInstallation\n------------\n\nIt's recommended to use pip to install minion-ci:\n\n.. code::\n\n    pip3 install minion-ci\n\n\n**MongoDB:**\nTo persist the job data *minion-ci* uses MongoDB.\nMake sure you have MongoDB installed ...\n\n.. code::\n\n    apt-get install mongodb\n    yum install mongodb\n\n... and an instance is running:\n\n.. code::\n\n    ps -ef | grep mongod\n\n... eventually start one with:\n\n.. code::\n\n    mongod\n\nminion.yml File Format\n----------------------\n\nThe **minion-ci** server will clone your repository and parse a file called **minion.yml** located\nin the root of the cloned repository. The format is really simple:\n\n.. code:: yaml\n\n    # command which is run before the real command\n    precondition: \"echo 'I was run before the test ...'\"\n    # the test command\n    command: \"echo 'This is my test...'\"\n    on:\n      # command which is run if the command was successful\n      success: \"echo 'I was run because the test was successful ...'\"\n      # command which is run if the command failed\n      failure: \"echo 'I was run because the test failed ...'\"\n\nminion.yml Receipts\n-------------------\n\nThe following few sections explain how to setup a ``minion.yml`` file for different\nkind of environments and technologies, like python virtualenvs, docker containers, etc.\n\n**Why so complicated?** ... Well it's not really complicated, isn't it? There are just to many\ndifferent styles of test environments and approaches ... I don't want to give full attention to all\nof them and support them.\nAnd anyway ... In the end your Use-Case wouldn't be supported. Thus, we provide each developer the full\ncontrol over their own test setup and environment. Setup it up how you like and run your test how you like it.\n**But**: Here are some receipts which might help you to come up with a nice minion.yml configuration:\n\nPython virtualenv\n~~~~~~~~~~~~~~~~~\n\nTo test your code in a python virtualenv base your minion.yml on the following example:\n\n.. code:: yaml\n\n    precondition: \u003e\n      /bin/bash -c 'virtualenv env -p python3.4 \u0026\u0026\n      source env/bin/activate \u0026\u0026 python -m pip install . -r requirements-dev.txt'\n    command: /bin/bash -c 'source env/bin/activate \u0026\u0026 make test'\n\nMake sure you change the actual *test* command which in the example's case is ``make test``.\nYou can also easily integrate it with ``tox``. Just make sure ``tox`` is installed and run as your\ntest command.\n\nDocker\n~~~~~~\n\nTo test your code in a docker container follow the following example to setup your minion.yml:\n\n.. code:: yaml\n\n    precondition: /bin/bash -c 'docker pull ubuntu'\n    command: /bin/bash -c 'docker run -t ubuntu /bin/bash -c \"make test\"'\n\nThis will pull a new ubuntu docker image from docker hub and run ``make test`` in the container.\nYou might want to setup your own docker image in the ``precondition`` and the run this container\nin the actual ``command``:\n\n.. code:: yaml\n\n    precondition: /bin/bash -c 'docker build -t testing .'\n    command: /bin/bash -c 'docker run -t testing /bin/bash -c \"make test\"'\n\nMake sure you mount your repository, source code, test code or whatever in the container before running\nany tests.\n\nServer API\n----------\n\n+----------------+-------------+-----------------+--------------------------+\n| Route          | HTTP Method | Parameter       | Description              |\n+================+=============+=================+==========================+\n| /status        | GET         |                 | Get status of the server |\n+----------------+-------------+-----------------+--------------------------+\n| /jobs          | GET         | page,           | Get a list of all jobs   |\n|                |             | page_size       |                          |\n+----------------+-------------+-----------------+--------------------------+\n| /jobs          | POST        | repo_url,       | Create a new job         |\n|                |             | commit_hash,    |                          |\n|                |             | branch,         |                          |\n|                |             | keep_data,      |                          |\n|                |             | arbitrary data  |                          |\n+----------------+-------------+-----------------+--------------------------+\n| /jobs          | DELETE      |                 | Remove all jobs          |\n+----------------+-------------+-----------------+--------------------------+\n| /jobs/\u003cjob_id\u003e | GET         |                 | Get a single job         |\n+----------------+-------------+-----------------+--------------------------+\n| /jobs/\u003cjob_id\u003e | DELETE      |                 | Remove a single job      |\n+----------------+-------------+-----------------+--------------------------+\n| /stop          | POST        |                 | Stop the minion-server   |\n+----------------+-------------+-----------------+--------------------------+\n\n\n.. |pypi| image:: https://img.shields.io/pypi/v/minion-ci.svg?style=flat\u0026label=version\n    :target: https://pypi.python.org/pypi/minion-ci\n    :alt: Latest version released on PyPi\n\n.. |license| image:: https://img.shields.io/badge/license-MIT-blue.svg?style=flat\n    :target: https://raw.githubusercontent.com/timofurrer/minion-ci/master/LICENSE\n    :alt: Package license\n\n.. |screenshot_index| image:: https://raw.githubusercontent.com/timofurrer/minion-ci/master/screenshots/index_0.0.6.jpg\n    :alt: Index Page\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimofurrer%2Fminion-ci","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftimofurrer%2Fminion-ci","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimofurrer%2Fminion-ci/lists"}