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

Download history 116/week @ 2024-07-27 5/week @ 2024-08-03

每月下载量 121

MIT/ApacheLGPL-2.0-or-later

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

下载

使用 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