引言:为什么 CI/CD 对 Rust 项目至关重要?
\n使用 Rust 开发不仅关乎内存安全和高性能,也关乎严格的纪律。Rust 编译器在构建阶段能捕获大量错误,但这并不能替代高质量测试、代码检查(linting)和依赖兼容性验证的需求。这时,CI/CD(持续集成 / 持续部署)就派上了用场。
\nGitHub Actions 是一个内置的自动化系统,非常适合 Rust 项目。它允许你在每次推送到仓库时自动运行测试、格式化代码、检查漏洞,甚至将 crate 发布到 crates.io 注册表。在本文中,我们将介绍完整的流水线:从基础的 cargo build 到生产环境部署。
1. 基础:为 Rust 配置基本工作流
\nGitHub Actions 中的任何 CI/CD 流水线都始于在 .github/workflows/ 目录下创建一个 YAML 文件。让我们创建一个 ci.yml 文件,用于 Rust 项目的基本检查。
1.1. 第一个工作流:构建和测试
\n我们从最小集合开始:克隆仓库、安装 Rust 并运行测试。
\nname: Rust CI\n\non:\n push:\n branches: [ "main", "develop" ]\n pull_request:\n branches: [ "main" ]\n\nenv:\n CARGO_TERM_COLOR: always\n\njobs:\n build:\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v4\n - name: Install Rust\n uses: dtolnay/rust-toolchain@stable\n - name: Build\n run: cargo build --verbose\n - name: Run tests\n run: cargo test --verbose\n这里发生了什么?
\n- \n
actions/checkout@v4— 克隆你的代码。 \n dtolnay/rust-toolchain@stable— 用于安装 Rust 的官方 action(支持 nightly、beta 和 stable)。 \n cargo build和cargo test— 用于检查项目的主要命令。 \n
此工作流将在每次推送到 main 和 develop 分支以及创建 Pull Request 时运行。
1.2. 缓存依赖以加速构建
\nRust 项目通常有很多依赖。为了避免每次都下载它们,请使用缓存。这可以将构建时间从 5-10 分钟缩短到 30-60 秒。
\n - name: Cache Cargo registry\n uses: actions/cache@v3\n with:\n path: |\n ~/.cargo/registry\n ~/.cargo/git\n target/\n key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}\n restore-keys: |\n ${{ runner.os }}-cargo-\n在运行 cargo build 之前添加此步骤。来自 Cargo.lock 文件的哈希确保仅在依赖项更改时更新缓存。
2. 高级代码质量检查
\n仅靠测试不足以维持高代码质量。让我们添加代码检查(linting)、格式化(formatting)和安全检查。
\n\n2.1. 格式化(rustfmt)和代码检查(clippy)
\nRust 拥有用于维护统一代码风格的内置工具。将它们添加到一个单独的 job 中:
\n lint:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n - uses: dtolnay/rust-toolchain@stable\n with:\n components: clippy, rustfmt\n - name: Check formatting\n run: cargo fmt --check\n - name: Run clippy\n run: cargo clippy -- -D warnings\n- \n
cargo fmt --check— 检查代码是否按照rustfmt标准格式化。 \n cargo clippy -- -D warnings— 运行 linter 并将警告转为错误(使用-D标志)。 \n
这将有助于避免仓库中出现“脏”代码。
\n\n