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/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, 二进制分发, 依赖锁定, 可视化界面, 可重现构建, 哈希校验, 安全构建, 安全防御评估, 容器化构建, 开发工具, 构建环境, 版本锁定, 网络流量审计, 软件供应链, 通知系统, 通知系统, 通知系统, 静态编译