{"id":28543625,"url":"https://github.com/prefix-dev/reproducible-builds","last_synced_at":"2026-02-02T13:01:24.840Z","repository":{"id":239129177,"uuid":"798607298","full_name":"prefix-dev/reproducible-builds","owner":"prefix-dev","description":"Testing reproducible builds for the conda ecosystem (using rattler-build)","archived":false,"fork":false,"pushed_at":"2025-05-28T15:07:03.000Z","size":9511,"stargazers_count":11,"open_issues_count":28,"forks_count":6,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-09-17T22:54:39.059Z","etag":null,"topics":["conda","package-manager","reproducible-builds"],"latest_commit_sha":null,"homepage":"https://prefix-dev.github.io/reproducible-builds/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/prefix-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2024-05-10T05:46:06.000Z","updated_at":"2025-05-28T15:07:48.000Z","dependencies_parsed_at":"2024-05-10T07:40:46.862Z","dependency_job_id":"024a6205-0ec5-4853-963c-66b0ed8421ef","html_url":"https://github.com/prefix-dev/reproducible-builds","commit_stats":null,"previous_names":["nichmor/reproducible-builds-rattler-build","prefix-dev/reproducible-builds"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/prefix-dev/reproducible-builds","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prefix-dev%2Freproducible-builds","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prefix-dev%2Freproducible-builds/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prefix-dev%2Freproducible-builds/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prefix-dev%2Freproducible-builds/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/prefix-dev","download_url":"https://codeload.github.com/prefix-dev/reproducible-builds/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prefix-dev%2Freproducible-builds/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278872154,"owners_count":26060525,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-07T02:00:06.786Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["conda","package-manager","reproducible-builds"],"created_at":"2025-06-09T21:30:48.785Z","updated_at":"2025-10-08T00:52:44.940Z","avatar_url":"https://github.com/prefix-dev.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Are we reproducible yet?\n\n![License][license-badge]\n[![Project Chat][chat-badge]][chat-url]\n\n[license-badge]: https://img.shields.io/badge/license-BSD--3--Clause-blue?style=flat-square\n[chat-badge]: https://img.shields.io/discord/1082332781146800168.svg?label=\u0026logo=discord\u0026logoColor=ffffff\u0026color=7389D8\u0026labelColor=6A7EC2\u0026style=flat-square\n[chat-url]: https://discord.gg/kKV8ZxyzY4\n\n# 🏁🏁 Build Status 🏁🏁\nYou can view the current build status for the different packages [here](https://prefix-dev.github.io/reproducible-builds/).\n\n## Introduction\nThis project aims to see if we can create reproducible builds for a variety of software packages.\nThe project is based on definitions of the [Reproducible Builds](https://reproducible-builds.org/) project.\nIt uses The [Rattler Build](https://github.com/prefix-dev/rattler-build) project, to build [Conda](https://docs.conda.io/projects/conda-build/en/latest/resources/package-spec.html) packages.\nThis repository has CI setup to build packages for the latests: windows, linux and osx platforms.\nIt then tries to vary the build environment to see if the build is reproducible.\n\n## What is a reproducible build?\nWe want to create a build process that reproduces bit-for-bit identical packages when run from the same build environment, while allowing for minor variations in the build environment. Mainly to test said reproducibility.\n\n## How do we validate reproducibility?\nWe validate that rattler-build is a reproducible build tool by ensuring that it can recreate identical packages given the same recipe and build environment. We verify this by comparing the SHA256 hash of the original build and the rebuild. If the hashes differ, we inspect the packages with `diffoscope` to identify the differences. Common issues affecting reproducibility include unsorted files, differing archive timestamps, and reset script permissions during the archiving step.\n\n### Platform variations\nThe following variations are tested (per platform):\n* **Linux**: Locale, timezone\n* **OSX**: Locale, timezone\n* **Windows**: None yet (TODO). Open to suggestions!\n\nThis is similar to what other projects in the [Reproducible Builds](https://reproducible-builds.org/) project do, but for Conda packages.\nIf you have any more suggestions for variations, please let us know!\n\n## Getting Started 🚀\nThis project uses [pixi](https://github.com/prefix-dev/pixi) for project management.\n\n### Prerequisite\nComplete the following steps only once:\n\n1. Install Pixi by following the instructions on https://prefix.dev/\n2. For building of local `rattler-build` versions install [rust](https://rustup.rs/). We might include this in the pixi configuration in the future.\n3. Clone the repository and navigate to the root directory:\n    ```bash\n    git clone https://github.com/prefix-dev/reproducible-builds # or ssh\n    cd reproducible-builds\n    ```\nEnsure that all subsequent commands are executed in the project's root directory. When running the commands, the necessary environment will be set up automatically.\n\n## Quick Start\nTo see if the project is setup correctly, run the following command:\n\n```bash\n# Build/Rebuild the boltons package\npixi r reproduce boltons\n# .. rattler-build output ..\n# ...🕒🕒🕒🕒🕒\n# ... a while later ...\nDone: 'boltons'\nVerifying if rebuilds are reproducible...\n                                       Build Info\n┏━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n┃ Platform ┃ Version ┃ Rattler Build Hash                                               ┃\n┡━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n│ darwin   │ 22.3.0  │ 1c47eafc2fbd6bc6d8d629b40c4d2950e7de35a3f26712dd5d4eeba26dd33aba │\n└──────────┴─────────┴──────────────────────────────────────────────────────────────────┘\n Is the Recipe Repro?\n┏━━━━━━━━━┳━━━━━━━━━━━┓\n┃ Name    ┃ Is Repro? ┃\n┡━━━━━━━━━╇━━━━━━━━━━━┩\n│ boltons │ Yes       │\n└─────────┴───────────┘\n# We have now successfully built the boltons package and verified that it is reproducible.\n```\nOnce this is done we can generate the html page to view the results, similar as to what is shown at [Results](https://prefix-dev.github.io/reproducible-builds/). To do this run the following command:\n\n```bash\npixi r serve-html\n✨ Pixi task (serve-html in html): livereload -d ./docs.local/\nServing on http://127.0.0.1:35729\n```\n\nYou can now view the html page at http://127.0.1.1:35729. Changes to this page will automatically be picked up.\n\n### Configuration\n#### Config.yaml (what recipes to build) ⚙️\nThe `config.yaml` file contains the configuration for the project. You can add `remote` or `local` recipes, that are local to the project or remote repositories.\nThe config also contains the rattler-build version that its using, this way we can depend on unreleased versions. This project automatically sets this up for you.\n\n#### SQLite Database (stores the build information) 📕\nThis project uses a Sqlite database to store the build information. The database is created automatically when the project is setup.\nWhen running locally a local version of the database is created, this will ensure that you have a clean database to work with.\nYou can also use the `--in-memory-sql` flag to use an in-memory database, which is useful for testing.\nE.g `pixi run repror --in-memory-sql build-recipe boltons`, this will build the boltons recipe in an in-memory database.\n\n## Running locally 🏃‍♂️\nThis project exposes a Python CLI called `repror` to interact with the project. We also re-expose the CLI using pixi tasks.\n\n### Using the pixi tasks 📋\nCurrently the following tasks are available for **building/reproducing**:\n* `reproduce` builds and rebuilds a recipe for the current platform.\n* `build-recipe \u003cname\u003e` to build a recipe.\n* `build-recipe-skip` same as above but uses the `rattler-build` defined in the `pixi.toml`.\n* `rebuild-recipe` rebuilds the recipe. Requires that it has been built once.\n* `rebuild-recipe-skip` same as above but uses the `rattler-build` defined in the `pixi.toml`.\n* `check` checks the database which recipes are reproducible.\nNote, that you can use the `--force` flag to force a rebuild of the recipe.\n\n#### Recipe conversion\nThere is also the following task for **converting recipes**:\n* `convert-recipe` that converts a `conda-build` `meta.yaml` to a `rattler-build` `recipe.yaml`.\n\n#### HTML generation\nA static html page is generated with the results of the builds, this can be found in the `docs` folder.\nto **create the html** page run the following task:\n* `generate-html` to generate the html page, from your local database.\n* `serve-html` to serve the html page. This will generate the html page first.\nThere are additional `-prod` tasks that work on the production data, e.g. `generate-html-prod`.\n\n#### Testing\nTesting the repository can be done by running the following task:\n* `test` to run the pytests.\n\n### Using the Python CLI directly 🐍\nSometimes, the tasks do not cover the full functionality of the CLI. In such cases, you can use the CLI directly. Make sure that the environment has been installed using `pixi install` or by running one of the tasks.\nTo use the CLI directly, run the following command:\n\n```bash\nUse `pixi r repror`\n```\n\nThis should give you some `--help` on how to use the CLI.\n\n## Running on CI 🌎\nThe project is setup to run on CI, and will build the recipes for the different platforms.\n\n### Caching strategy\nIf the recipe has been built and reproduced it will **only** be built again if the `rattler-build` version or the recipe has been changed.\nAfter a successful build, a new `index.html` will be generated.\n\n### CI Steps\nThe CI has the following stages:\n* `setup-rattler-build` to install the `rattler-build` version. Can use a cached version, if it was built before.\n* `generate-recipes` generates the build matrix recipe/platform, so we know what recipes to build.\n* `build-and-rebuld-recipe` builds and rebuilds the recipes per platform. This step is cached.\n* `patch-db` because the database is a SQLite database we cannot update per job, so we create metadata files that are `patched` into the database, the database is pushed to `main`, this step also generates the `index.html` file.\n\n\n## Contributing 🤝\nEasiest way to contribute is to create a PR with a new recipe, by adding it to the `config.yaml` file, either through a `remote` or a `local` source. This way we can check\nthe reproducibility for this specific recipe. This should also help us find `rattler-build` changes that we can make to produce more reproducible builds.\n\nYou can also help us by debugging packages that fail in build or reproducibility, we've tried to make it easy to run the project locally. We know how annoying it can be to wait for CI. Any improvements here are welcome as well!\n\n## Licensing Information\n\nThis repository contains modified recipe scripts derived from the conda-forge project. As these scripts are based on work from conda-forge, they are subject to the conda-forge BSD-3-Clause license. You can find the license details in the `LICENSE_PACKAGES.txt` file in this repository.\n\nBy using or redistributing the recipes or packages from this repository, you agree to adhere to the terms of the BSD-3-Clause license provided by conda-forge.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprefix-dev%2Freproducible-builds","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprefix-dev%2Freproducible-builds","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprefix-dev%2Freproducible-builds/lists"}