Rust 项目的 CI/CD:配置 GitHub Actions

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么 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/toolchain action 或官方的 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 --                

博客

书籍推荐