Rust 项目的 CI/CD:GitHub Actions 从 A 到 Z

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

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

开始课程
```html

引言:为什么 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
```                

博客

书籍推荐