在 CentOS 上落地 Rust 项目的持续集成
一、方案总览与适用场景
- 在 CentOS 自托管 Runner(如 Jenkins、GitLab Runner)上直接运行 Rust 工具链,适合需要访问本机资源、内网服务或遵循严格合规的场景。
- 使用 容器化 CI(Docker 镜像内置 Rust 工具链与依赖),适合标准化环境、快速启动与跨平台构建,减少“在我机器上能跑”的问题。
- 采用 GitHub Actions/GitLab CI 等托管平台,适合公共仓库与云上流水线,结合自托管 Runner 也可覆盖内网场景。
- 无论哪种方式,建议将流程固化为:代码检出 → 依赖管理 → 代码风格检查 → 静态分析 → 构建 → 测试 →(可选)覆盖率与报告 → 产物归档/部署,并在合并前强制执行“CI 通过”的准入规则。
二、在 CentOS 自托管 Runner 上搭建 CI(Jenkins 示例)
- 安装基础环境
- 更新系统并安装常用工具与 Rust 工具链(含 cargo):
- sudo yum update -y
- sudo yum install -y git cmake
- curl --proto ‘=https’ --tlsv1.2 -sSf https://sh.rustup.rs | sh
- source $HOME/.cargo/env
- 安装并启动 Jenkins
- 添加仓库与密钥、安装、启动与开机自启:
- sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
- sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
- sudo yum install -y jenkins
- sudo systemctl start jenkins && sudo systemctl enable jenkins
- 创建 Jenkins Job(Freestyle 项目)
- 源码管理:选择 Git,填写仓库 URL 与分支(如 main)。
- 构建触发器:如“Push 到 GitHub 时触发”等。
- 构建步骤(Execute shell)示例:
- cargo update
- cargo build --release
- cargo test --verbose
- cargo fmt --all – --check
- cargo clippy – -D warnings
- 构建后操作:配置 邮件/Slack 等通知,保存并触发首次构建。
- 运行与调试
- 通过控制台输出定位失败原因,必要时在 Job 中增加调试命令或本地复现步骤。
三、容器化与跨平台构建(Docker + Cross + GitLab Runner)
- 使用 cross-rs 官方 CentOS 基础镜像,内置目标工具链,简化交叉编译:
- Dockerfile 示例:
- FROM ghcr.io/cross-rs/x86_64-unknown-linux-gnu:main-centos
- RUN sed -i ‘s/mirrorlist/#mirrorlist/g’ /etc/yum.repos.d/CentOS-* &&
sed -i ‘s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g’ /etc/yum.repos.d/CentOS-*
- RUN yum -y install epel-release && yum -y install gcc gcc-c++ make openssl-devel perl perl-core bzip2 wget
- 在 .gitlab-ci.yml 中使用该镜像运行构建与测试(示例):
- build-centos:
- image: ghcr.io/cross-rs/x86_64-unknown-linux-gnu:main-centos
- script:
- cargo build --release
- cargo test --verbose
- 处理特殊依赖(如 PyO3)
- 在构建镜像中安装 Miniconda 并软链所需 libpython 到系统库目录,解决链接器找不到库的问题:
- wget https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-2-Linux-x86_64.sh -O /tmp/miniconda.sh
- bash /tmp/miniconda.sh -b -p /opt/conda
- find /opt/conda -name “libpython3.10*.so*” -exec ln -sf {} /usr/lib64/ ;
- 优势
- 环境标准化、构建速度快、易于扩展多目标(如 aarch64)、减少网络波动对 CI 的影响。
四、流水线关键实践与优化
- 质量关卡
- 代码风格:cargo fmt --all – --check
- 静态分析:cargo clippy – -D warnings
- 单元测试:cargo test(必要时按模块/名称筛选)
- 覆盖率(可选):cargo install cargo-tarpaulin && cargo tarpaulin
- 测试分层与性能
- 将用例按业务关键度与资源消耗分层(如 tier1 核心场景、tier2 覆盖、slow 慢测专用机),在 CI 中分别触发,避免慢测阻塞合并。
- 稳定性与可重复性
- 在 CI 中尽量减少外网依赖(使用预构建镜像、缓存依赖、内网镜像源),降低因网络抖动导致的偶发失败。
- 合并准入
- 强制“CI 通过方可合并”,并要求缺陷修复附带可复现的测试用例,新功能配套集成测试,提升长期可维护性。
五、CentOS 兼容性与常见问题处理
- 多版本 CentOS 上的工具链与依赖差异,可能导致构建或运行不一致。建议在 CI 中覆盖目标系统矩阵(如 CentOS 7/8/Stream),并在流水线中固定工具链版本与依赖版本,形成可复现的构建环境。
- 若项目涉及 CGO 或系统库(如 OpenSSL),需在 CI 镜像中预装对应 -devel 包,并配置正确的链接与搜索路径;交叉编译场景优先使用 cross-rs 提供的目标镜像,减少手工配置成本。