{"id":20757840,"url":"https://github.com/amdmi3/reprise","last_synced_at":"2026-02-24T00:05:01.829Z","repository":{"id":139658693,"uuid":"477703687","full_name":"AMDmi3/reprise","owner":"AMDmi3","description":"FreeBSD Port/Package test system","archived":false,"fork":false,"pushed_at":"2022-12-27T18:33:31.000Z","size":274,"stargazers_count":4,"open_issues_count":17,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-30T03:41:30.771Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AMDmi3.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-04-04T13:03:11.000Z","updated_at":"2023-08-20T13:19:56.000Z","dependencies_parsed_at":null,"dependency_job_id":"99e20a0b-3844-4d88-91fd-f803bdbe531d","html_url":"https://github.com/AMDmi3/reprise","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/AMDmi3/reprise","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AMDmi3%2Freprise","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AMDmi3%2Freprise/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AMDmi3%2Freprise/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AMDmi3%2Freprise/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AMDmi3","download_url":"https://codeload.github.com/AMDmi3/reprise/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AMDmi3%2Freprise/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29761972,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-23T21:02:23.375Z","status":"ssl_error","status_checked_at":"2026-02-23T20:58:31.539Z","response_time":90,"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":[],"created_at":"2024-11-17T09:45:34.653Z","updated_at":"2026-02-24T00:05:01.812Z","avatar_url":"https://github.com/AMDmi3.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![CI](https://github.com/AMDmi3/reprise/actions/workflows/ci.yml/badge.svg)](https://github.com/AMDmi3/reprise/actions/workflows/ci.yml)\n[![Github commits (since latest release)](https://img.shields.io/github/commits-since/AMDmi3/reprise/latest.svg)](https://github.com/AMDmi3/reprise)\n\n# reprise\n\n![Screenshot](docs/screenshot.png)\n\nreprise is a tool primarily designed to test package production\non FreeBSD.\n\nIts goals are to use modern facilities present in FreeBSD (such as\nZFS, jails), to be easy to use and to depend only on base.\n\nUnlike [poudriere](https://github.com/freebsd/poudriere), it is\nfocused on port testing only, without support for repository\nproduction, and has important features still lacking in poudriere,\nsuch as `make test` support, and more eager use of prebuilt packages.\nAs a result, with reprise you test your ports, not rebuild llvm\nand other heavy dependencies over and over again.\n\n## Features against poudriere\n\n- **Automatic jail management**\n  Jails are automatically created on demand, no preparation steps\n  are needed to run a build.\n- **Automatic port trees management**\n  No need to specify port trees explicitly, ports are tested in\n  their native ports trees.\n- **Any number of simultaneous runs**\n  No `jail is already running` errors, any number of builds at\n  once are possible.\n- **Uses prebuilt packages eagerly**\n  By default uses only prebuilt packages for all dependencies.\n- **`make test` support**\n  Running upstream unit and integration tests is crucial for providing\n  high quality software through the Ports Tree, and this tool allows\n  to do it without polluting the host system. It also properly supports\n  `TEST_DEPENDS`, even when they create dependency loops.\n- **Support for testing options combinations**\n  It is possible to automatically test a lot of options combinations\n  for a given ports.\n\n## Drawbacks compared to poudriere\n\nMost of these will hopefully be solved at some point.\n\n- Not currently able to build and reuse packages, so dependencies\n  which are set to be rebuilt are rebuilt for every run that need\n  them.\n- Not completely clean builds because of that: jail is polluted\n  by build-time dependencies of many ports.\n- No sanity checking (stage Q/A, shlibs and plist problem detection).\n- No automatic rebuilds of dependencies.\n- No support for workdir preservation.\n- No support for custom `make.conf` injection.\n- No support for manually setting options.\n\n## Requirements\n\n- Python 3.9+\n- Python modules: `PyYAML`, `aiohttp`, `jsonslicer`, `pydantic`, `termcolor`\n- ZFS\n- Root privileges\n\n## Installation\n\nInstall from FreeBSD ports or packages:\n\n```shell\ncd /usr/ports/ports-mgmt/reprise \u0026\u0026 make install clean\n```\n```shell\npkg install reprise\n```\n\n...or run from the git checkout:\n\n```shell\ngit clone https://github.com/AMDmi3/reprise\ncd reprise\nenv PYTHONPATH=. python3 -m reprise.cli --help\n```\n\n## Quick start\n\nJust run `reprise` in any port directory.\n\n```shell\ncd /usr/ports/category/port \u0026\u0026 reprise\n```\n\nIt will create a ZFS dataset for itself, create a default jail by\nfetching and extracting a tarball from FreeBSD https and run a test\nof a given port in this jail. Try `-j`/`--jails` to run more jails,\n`-O`/`--options` to test options combinations `-V`/`--vars` to pass\n`make.conf` variables, `-d`/`--debug` for verbose logs and\n`-n`/`--dry-run` to check what's it going to do without actual\nbuilding.\n\n## Usage\n\n### Configuration file\n\nSome (see below) aspects of reprise may be configured through the\nconfig file. It is searched in `~/.config/reprise/reprise.conf`\nor (if reprise is installed from the Ports Collection) in\n`/usr/local/etc/reprise/reprise.conf`, or may be specified explicitly\nwith the `-c` option.\n\n### Specifying ports\n\nMost common patter is to build/test a single port from the current\ndirectory:\n\n```shell\ncd /usr/ports/category/port \u0026\u0026 reprise\n```\n\nYou may also specify list of ports (in `category/port` format)\nexplicitly, on command line or through a file (one port per line,\nwhitespace ignored, #-comments supported). You may want to specify\npath to ports tree as well, otherwise `/usr/ports` will be used.\n\n```shell\nreprise cat1/port1 cat2/port2                    # from /usr/ports\nreprise -p /path/to/ports cat1/port1 cat2/port2\ncat \u003e portlist \u003c\u003c__END\ncat1/port1\ncat2/port2\n# comments are ignored\n_END\nreprise -f portlist                              # from /usr/ports\nreprise -p /path/to/ports -f portlist\n```\n\n### Specifying jails\n\nBy default, **reprise** generates a single jail with the same\narchitecture and system version as the host. You may override\nthis behavior and specify jails through the config, for example:\n\n```yaml\njails:\n  13-amd64: { version: 13.1-RELEASE, arch: amd64, tags: [13, amd64, default] }\n  13-i386:  { version: 13.1-RELEASE, arch: i386,  tags: [13, i386 ] }\n  12-amd64: { version: 12.3-RELEASE, arch: amd64, tags: [12, amd64] }\n  12-i386:  { version: 12.3-RELEASE, arch: i386,  tags: [12, i386 ] }\n```\n\nCurrently, only version/arch combinations available on\n[download.freebsd.org](https://download.freebsd.org/releases/) are\nsupported.\n\nYou may select jails to use for the build with `-j`/`--jails`\nargument, specifying any number of jail names or tags. If `-j` is\nnot specified, only jails with `default` tag are used (or all jails\nif none of them has the tag). If `-j` is specified without an\nargument, all jails are used.\n\nExamples:\n\n```shell\nreprise cat1/port1                   # 13-amd64\nreprise -j -- cat1/port1             # all four jails\nreprise -j all -- cat1/port1         # the same\nreprise -j 12-i386 13 -- cat1/port1  # 13-amd64, 13-i386, 12-i386\n```\n\n### Option combinations testing\n\nWhen `-O`/`--options` flag is specified, **reprise** generates\na bunch of options combinations for each port and builds all of\nthese.\n\nIt is not possible to test all combinations as it would lead to\n2^n variants to build, so generation is limited to a set of patterns:\n- variant with each free option toggled\n- for each GROUP, variant with each option toggled, and variants with\n  all options in the group enabled and disabled\n- each possible variant for for each SINGLE and RADIO group\n- for MULTI group, variants with each option toggled, each single\n  option variant and all options enabled variant\n\nIt's possible to limit the number of variants with `--excluded-options`\nand `--included-options` options.\n\nIt's also possible to exclude default options combination (for instance,\nif you've already tested it another way) with `--exclude-default-options`.\n\n### Rebuilding dependencies\n\nAs mentioned **reprise** always uses prebuilt packages for dependencies.\nIn the case such package does not exist, a dependency is built in\nthe same jail. You may specify a list of ports to forcibly rebuild\nthe same way, for example when you want to test consumers of a\nspecific port.\n\n```sh\nreprise -r cat1/port-to-rebuild1 cat2/port2 -- target/port\n```\n\nNote that you need `--` to separate lists of ports.\n\n### Networking isolation\n\nPort are not allowed to access network during build. The same should\nbe true for testing, but is not on practice: a lot of tests require\nsocket and network operation. It's possible to control network\nisolation for test with `--networking-test` option which\ntakes `DISABLED` (no network possible), `RESTRICTED` (only localhost)\nor `UNRESTRICTED` (full network access) values. Currently it defaults\nto `RESTRICTED`, but you may try different values for some ports.\n\n```sh\nreprise --networking-test UNRESTRICTED\n```\n\n### tmpfs support\n\nIt is possible to enable tmpfs independently for workdirs and\nlocalbase, and it is possible to limit tmpfs size.\n\n```sh\nreprise --tmpfs-work --tmpfs-localbase --tmpfs-limit-mb 1024\n```\n\n## Author\n\n  - [Dmitry Marakasov](https://github.com/AMDmi3) \u003camdmi3@amdmi3.ru\u003e\n\n## License\n\nGPLv3 or later, see [COPYING](COPYING).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famdmi3%2Freprise","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famdmi3%2Freprise","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famdmi3%2Freprise/lists"}