8 个版本
0.4.1 | 2024年7月30日 |
---|---|
0.4.0 | 2024年2月29日 |
0.3.3 | 2024年2月17日 |
0.3.2 | 2023年9月20日 |
0.1.0 | 2023年7月6日 |
在 命令行工具 中排名 134
每月下载量 121
140KB
3K SLoC
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 创建静态二进制文件(同时启用发布优化)
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 静态链接 (sha256:
d6cefae67a91fc42546a2bae904fcb4bb169552229c11a328a0bc0becc212a6d
)
使用 GitHub Actions
- name: Install repro-env
run: |
wget 'https://github.com/kpcyrd/repro-env/releases/download/v0.4.1/repro-env'
echo 'd6cefae67a91fc42546a2bae904fcb4bb169552229c11a328a0bc0becc212a6d 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 | ✅ 完全支持,无已知问题 | ✅ 极佳,由 Arch Linux 运营 |
Debian | ✅ 无已知问题 | ⚠️ 快照服务经常很慢或不可用 |
Alpine Linux | ✅ 无已知问题 | ❌ 没有公开存档,链接可能变为 404 |
软件包:Arch Linux
Arch Linux 在 https://archive.archlinux.org 提供了丰富的最新编译器集合。您可以在 repro-env.toml 文件中创建一个 [packages]
部分,并使用 system = "archlinux"
来安装额外的软件包。
# 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"
来安装额外的软件包。
# 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"
来安装额外的软件包。不幸的是,目前没有旧 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 上托管的官方发布二进制文件完全相同的副本。
可重复构建
所有 预编译的二进制文件 都可以从源代码生成。
% wget https://github.com/kpcyrd/repro-env/releases/download/v0.4.1/repro-env
[...]
% sha256sum repro-env
d6cefae67a91fc42546a2bae904fcb4bb169552229c11a328a0bc0becc212a6d repro-env
由于构建环境完全在 git 中记录和跟踪,我们只需检出相应的 git 标签,然后运行 make
% git clone https://github.com/kpcyrd/repro-env
% cd repro-env
% git checkout v0.4.1
% make
% sha256sum target/x86_64-unknown-linux-musl/release/repro-env
d6cefae67a91fc42546a2bae904fcb4bb169552229c11a328a0bc0becc212a6d target/x86_64-unknown-linux-musl/release/repro-env
许可
MIT 或Apache-2.0
依赖项
~33–53MB
~850K SLoC