引言:为什么 CI/CD 对 Rust 项目很重要
Rust 开发不仅仅是关于内存安全和高性能。在现代世界中,任何严肃的项目都需要自动化构建、测试和部署流程。CI/CD(持续集成/持续部署) 使团队能够更快地发布更新,降低人为错误的风险,并确保代码库的稳定性。
GitHub Actions 是 GitHub 内置的工作流自动化工具。它非常适合 Rust 项目,因为它提供了现成的 actions 来安装编译器、缓存依赖项以及将 crate 发布到 crates.io。在本文中,我们将从头开始学习如何为 Rust 应用程序设置一个完整的 CI/CD 流水线。
1. Rust 的 GitHub Actions 基础
在深入代码之前,让我们先了解 GitHub Actions 的基本结构。每个 workflow 由一个 YAML 文件定义,该文件位于 .github/workflows/ 目录中。Workflow 由一个或多个 job(任务)组成,这些任务在虚拟机(runner)上顺序或并行执行。
对于 Rust 项目,最小的 workflow 包括以下步骤:
- Checkout — 从仓库获取最新版本的代码。
- 安装 Rust — 通过
actions-rs/toolchainaction 或官方的dtolnay/rust-toolchain。 - 缓存依赖项 — 通过保存
target/和~/.cargo/来加速构建。 - 构建和测试 — 执行
cargo build和cargo test。
基本 workflow 示例(文件 .github/workflows/ci.yml):
name: Rust CI
on: push: branches: [ main ] pull_request: branches: [ main ]
env: CARGO_TERM_COLOR: always
jobs: build: runs-on: ubuntu-latest
steps: - uses: actions/checkout@v3 - name: Install Rust uses: dtolnay/rust-toolchain@stable with: components: clippy, rustfmt - name: Cache dependencies uses: actions/cache@v3 with: path: | ~/.cargo/ target/ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - name: Build run: cargo build --verbose - name: Run tests run: cargo test --verbose - name: Lint with clippy run: cargo clippy -- -D warnings - name: Check formatting run: cargo fmt --check这个 workflow 在每次推送到 main 分支以及创建 pull request 时触发。它检查代码是否可以编译、通过测试、没有 lint 错误并且符合格式化风格。
2. 高级策略:矩阵构建和缓存
Rust 是一种跨平台语言,通常需要在多个操作系统或架构上检查构建。为此,我们使用 矩阵构建(matrix build)。
让我们将 Windows 和 macOS 的支持添加到我们的 workflow 中:
jobs: build: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] rust: [stable, beta] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v3 - name: Install Rust uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.rust }} components: clippy - name: Cache uses: actions/cache@v3 with: path: | ~/.cargo/registry/ ~/.cargo/git/ target/ key: ${{ matrix.os }}-cargo-${{ matrix.rust }}-${{ hashFiles('**/Cargo.lock') }} - name: Build run: cargo build --