kpcyrd/repro-env

GitHub: kpcyrd/repro-env

通过锁定容器镜像和依赖包的精确版本,实现可复现的容器化构建环境。

Stars: 48 | Forks: 5

# repro-env 想象一下,你有一个工具,可以接收像这样的配置: ``` # repro-env.toml [container] image = "rust:1-alpine3.18" ``` 并将其转换成这样的内容: ``` # repro-env.lock [container] image = "rust@sha256:22760a18d52be83a74f5df8b190b8e9baa1e6ce7d9bda40630acc8ba5328a2fd" ``` 你将这两个文件提交到你的 git 仓库以记录: - **repro-env.toml**:你打算遵循的容器镜像标签(类似于 `Cargo.toml`) - **repro-env.lock**:你用于发布构建的具体镜像(类似于 `Cargo.lock`) .lock 文件是自动生成的,可以通过一个简单的命令来刷新: ``` repro-env update ``` 构建是在一个用户命名空间中使用 **podman** 执行的(请确保已安装),当前目录被挂载到 `/build/`,并在该目录内执行给定的命令: ``` repro-env build -- cargo build ``` 我们希望分发我们的二进制文件而无需担心系统库,因此我们让 cargo 创建静态二进制文件(同时启用 release 优化): ``` repro-env build -- cargo build --release --target x86_64-unknown-linux-musl ``` 这样我们也确保使用了不同的构建文件夹(`target/x86_64-unknown-linux-musl` 而不是 `target/`),这样就不会干扰我们的正常开发。 最终的可执行文件位于此位置: ``` ./target/x86_64-unknown-linux-musl/release/repro-env --help ``` ## 下载 - [repro-env x86_64 静态链接](https://github.com/kpcyrd/repro-env/releases/download/v0.4.3/repro-env) (sha256: `2a00b21ac5e990e0c6a0ccbf3b91e34a073660d1f4553b5f3cda2b09cc4d4d8a`) [![](https://repology.org/badge/vertical-allrepos/repro-env.svg)](https://repology.org/project/repro-env/versions) 使用 github actions: ``` - name: Install repro-env run: | wget 'https://github.com/kpcyrd/repro-env/releases/download/v0.4.3/repro-env' echo '2a00b21ac5e990e0c6a0ccbf3b91e34a073660d1f4553b5f3cda2b09cc4d4d8a repro-env' | sha256sum -c - sudo install -m755 repro-env -t /usr/bin ``` 使用 github actions (>= Ubuntu 24.04): ``` - name: Install repro-env run: sudo apt-get install -y repro-env ``` ## 集成 | 软件包集成 | 状态 | 归档基础设施 | | -------------------------------------- | ------ | ---------------------- | | [Arch Linux](#packages-arch-linux) | ✅ 完全支持,无已知问题 | ✅ 极佳,由 Arch Linux 运营 | | [Debian](#packages-debian) | ✅ 无已知问题 | ✅ 极佳,由 Debian 运营 | | [Alpine Linux](#packages-alpine-linux) | ✅ 无已知问题 | ❌ 无公共归档,链接可能会变成 404 | ## 软件包:Arch Linux Arch Linux 在 https://archive.archlinux.org 托管了全面的最新编译器集合。你可以在 **repro-env.toml** 中创建一个 `[packages]` 部分,并设置 `system = "archlinux"`,以便使用 pacman 安装额外的软件包。 ``` # repro-env.toml [container] image = "docker.io/library/archlinux" [packages] system = "archlinux" dependencies = ["rust-musl", "lua"] ``` 解析后的 **repro-env.lock** 将包含你用作基础的已解析容器镜像的 sha256,以及应在启动构建之前在容器内安装/升级的 `[[package]]` 列表。 ``` # repro-env.lock [container] image = "docker.io/library/archlinux@sha256:6568d3f1f278827a4a7d8537f80c2ae36982829a0c6bccff4cec081774025472" # [...] [[package]] name = "rust" version = "1:1.69.0-3" system = "archlinux" url = "https://archive.archlinux.org/packages/r/rust/rust-1%3A1.69.0-3-x86_64.pkg.tar.zst" sha256 = "b8eb31a2eb80efab27bb68beab80436ed3e1d235a217c3e24ba973936c95839e" signature = "iIsEABYIADMWIQQGaHodnU+rCLUP2Ss7lKgOUKR3xwUCZExVKBUcaGVmdGlnQGFyY2hsaW51eC5vcmcACgkQO5SoDlCkd8fQkAD6AudRi2qP3WxSn38OOkSRSITciqRevPaVJgrz03JUBEAA/12h9z8dReD07Lqnltx9QTa3Cxppbv7VpJlTCQuavoMG" [[package]] name = "rust-musl" version = "1:1.69.0-3" system = "archlinux" url = "https://archive.archlinux.org/packages/r/rust-musl/rust-musl-1%3A1.69.0-3-x86_64.pkg.tar.zst" sha256 = "5a4854cdac8312dbf72fb87795bcc36bfb34e9218944966e5ac2e62319bbcf22" signature = "iIsEABYIADMWIQQGaHodnU+rCLUP2Ss7lKgOUKR3xwUCZExVKRUcaGVmdGlnQGFyY2hsaW51eC5vcmcACgkQO5SoDlCkd8cCMQD/W59RkOVPZDXlnmyY27jW61GC86hXOkSLOKa7XMQtpBoBALSugCkG1clSo/EQDbnuS+UY3268HNBvz6mF6i/hhEsB" ``` ## 软件包:Debian Debian 是一个广泛接受的选择,并在 https://snapshot.debian.org/ 托管了其所有软件包的归档。你可以在 **repro-env.toml** 中创建一个 `[packages]` 部分,并设置 `system = "debian"`,以便使用 apt-get 安装额外的软件包。 ``` # repro-env.toml [container] image = "debian:bookworm" [packages] system = "debian" dependencies = ["gcc", "libc6-dev"] ``` 请注意,这仅适用于**官方** debian 软件包(不适用于 ubuntu)。 解析后的 **repro-env.lock** 将包含你用作基础的已解析容器镜像的 sha256,以及应在启动构建之前在容器内安装/升级的 `[[package]]` 列表。 ``` # repro-env.lock [container] image = "debian@sha256:3d868b5eb908155f3784317b3dda2941df87bbbbaa4608f84881de66d9bb297b" [[package]] name = "binutils" version = "2.40-2" system = "debian" url = "https://snapshot.debian.org/archive/debian/20230115T211934Z/pool/main/b/binutils/binutils_2.40-2_amd64.deb" sha256 = "83c3e20b53e1fbd84d764c3ba27d26a0376e361ae5d7fb37120196934dd87424" [[package]] name = "binutils-common" version = "2.40-2" system = "debian" url = "https://snapshot.debian.org/archive/debian/20230115T211934Z/pool/main/b/binutils/binutils-common_2.40-2_amd64.deb" sha256 = "ab314134f43a0891a48f69a9bc33d825da748fa5e0ba2bebb7a5c491b026f1a0" # [...] ``` ## 软件包:Alpine Linux Alpine 在容器领域非常流行,基于 musl libc,并拥有广泛的新版本编译器选择。你可以在 **repro-env.toml** 中创建一个 `[packages]` 部分,并设置 `system = "alpine"`,以便使用 apk 安装额外的软件包。遗憾的是,目前没有旧版 Alpine 软件包的公共归档,你应该记住这一点,因为你的 repro-env 构建环境**很可能会变得无法安装!** ``` # repro-env.toml [container] image = "docker.io/library/alpine" [packages] system = "alpine" dependencies = ["gcc", "make", "musl-dev"] ``` 解析后的 **repro-env.lock** 将包含你用作基础的已解析容器镜像的 sha256,以及应在启动构建之前在容器内安装/升级的 `[[package]]` 列表。 ``` # repro-env.lock [container] image = "docker.io/library/alpine@sha256:eece025e432126ce23f223450a0326fbebde39cdf496a85d8c016293fc851978" [[package]] name = "binutils" version = "2.40-r7" system = "alpine" url = "https://dl-cdn.alpinelinux.org/alpine/v3.18/main/x86_64/binutils-2.40-r7.apk" sha256 = "6b1bf117b8f0a15862b27ff77a412eaccf2e7d8048a9cc0e3903e44930547c80" [[package]] name = "busybox" version = "1.36.1-r4" system = "alpine" url = "https://dl-cdn.alpinelinux.org/alpine/v3.18/main/x86_64/busybox-1.36.1-r4.apk" sha256 = "abccb59dd5b9e64b782bbfd97b08c79a2214cc53567fb334aa003815505a007f" # [...] ``` ## 引导 没有固有的引导挑战,你可以使用任何最新的 Rust 编译器来构建一个可工作的 **repro-env** 二进制文件。然后,该二进制文件可以设置任何其他构建环境(包括它自己的),并且能够构建托管在 github 上的官方发布二进制文件的逐位相同副本。 ## 可复现构建 所有[预编译二进制文件](https://github.com/kpcyrd/repro-env/releases)都可以从源代码复现: ``` % wget https://github.com/kpcyrd/repro-env/releases/download/v0.4.3/repro-env [...] % sha256sum repro-env 2a00b21ac5e990e0c6a0ccbf3b91e34a073660d1f4553b5f3cda2b09cc4d4d8a repro-env ``` 由于构建环境已完全文档化并跟踪在 git 中,我们只需要检出相应的 git 标签并运行 `make`: ``` % git clone https://github.com/kpcyrd/repro-env % cd repro-env % git checkout v0.4.3 % make % sha256sum target/x86_64-unknown-linux-musl/release/repro-env 2a00b21ac5e990e0c6a0ccbf3b91e34a073660d1f4553b5f3cda2b09cc4d4d8a target/x86_64-unknown-linux-musl/release/repro-env ``` ## 许可证 `MIT OR Apache-2.0`
标签:DNS 反向解析, Docker, Github Actions, lockfile, musl, Podman, Python安全, Rust, SOC Prime, 二进制分发, 依赖锁定, 可视化界面, 可重现构建, 哈希校验, 安全构建, 安全防御评估, 容器化构建, 开发工具, 构建环境, 版本锁定, 网络流量审计, 软件供应链, 通知系统, 通知系统, 通知系统, 静态编译