引言:为什么 CI/CD 对 Rust 项目至关重要
Rust 是一种系统编程语言,以其高性能和内存安全性而闻名。然而,即使是最可靠的代码也需要持续验证。手动测试和构建既耗时又容易出错。CI/CD(持续集成/持续部署)可以自动化这些流程,确保每次代码更改在合并到主分支之前,都经过编译器、测试和 linter 的检查。
GitHub Actions 是 GitHub 内置的工作流自动化平台。由于其灵活性、对公共仓库的免费分钟数限制以及庞大的现成操作生态系统,它非常适合 Rust 项目。在本文中,我们将介绍为 Rust 配置 CI/CD 的完整流程:从基础构建到通过缓存和部署进行优化。
1. 基础:用于构建和测试的第一个工作流
让我们从创建一个最小的工作流开始。在您的仓库根目录下,创建文件夹 .github/workflows 和文件 ci.yml。
基础 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@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Build
run: cargo build --verbose
- name: Run tests
run: cargo test --verbose
关键元素解析:
- on: 触发器 — 在推送到 main 分支以及创建 Pull Request 时运行。
- env:
CARGO_TERM_COLOR变量启用彩色日志输出。 - actions/checkout: 用于克隆仓库的标准操作。
- dtolnay/rust-toolchain: 最流行的 Rust 安装操作。使用
stable、nightly或特定版本。
这个工作流已经很有用:它确保代码能够编译并且所有测试通过。但对于实际项目来说,这还不够。
2. 优化:依赖缓存和多平台构建
每次 CI 运行都会重新下载所有依赖。对于包含大量 crate 的 Rust 项目,这可能需要几分钟。解决方案是缓存 ~/.cargo 和 target 文件夹。
添加缓存
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache dependencies
uses: actions/cache@v3
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
target/
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Build
run: cargo build --verbose
- name: Run tests
run: cargo test --verbose
关键点:
- hashFiles('**/Cargo.lock'): 仅当
Cargo.lock更改时,缓存才会失效。 - path: 缓存二进制文件、注册表索引和
target文件夹。 - 恢复: 如果键匹配,则恢复缓存,cargo 跳过下载。
多平台构建
Rust 支持多种平台。为了确保您的代码在所有平台上都能运行,请使用构建矩阵:
jobs:
build:
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
```