加速 30 倍!巧用 GitHub Actions 优化 Rust 项目构建

文摘   科技   2024-10-07 10:05   四川  

引言

Rust 作为一门安全高效的系统级编程语言,正受到越来越多开发者的青睐。然而,Rust 编译器为了保证内存安全和并发安全,需要进行大量检查,这导致了编译速度较慢的问题。对于使用 GitHub 托管项目的开发者来说,如何优化 GitHub Actions 中的 Rust 构建流程就显得尤为重要。本文将介绍一种利用缓存机制大幅提升 Rust 项目构建速度的方法,让你的 CI/CD 流程更加高效。

主要特性

  1. 利用 GitHub Actions 的缓存功能加速 Rust 项目构建
  2. 优化 cargo 工具的安装和使用
  3. 通过 Docker 构建缓存进一步提升性能
  4. 可重用的工作流配置,便于在多个项目中应用

快速上手

1. 设置 Rust 检查工作流

首先,我们来看一个优化过的 Rust 检查工作流配置:

name: Rust Check

on:
  workflow_call:
    inputs:
      rust-version:
        type: string
        required: false
        default: nightly

jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - name: 检出代码
        uses: actions/checkout@v3

      - name: 安装 Rust
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: ${{ inputs.rust-version }}
          override: true
          components: rustfmt, clippy

      - name: 设置 cargo 缓存
        uses: actions/cache@v3
        continue-on-error: false
        with:
          path: |
            ~/.cargo/bin/
            ~/.cargo/registry/index/
            ~/.cargo/registry/cache/
            ~/.cargo/git/db/
            target/
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: ${{ runner.os }}-cargo-

      - name: 代码风格检查
        run: |
          cargo fmt --all -- --check
          cargo clippy -- -D warnings

      - name: 安装 cargo 检查工具
        run: |
          cargo install --locked cargo-deny || true
          cargo install --locked cargo-outdated || true
          cargo install --locked cargo-udeps || true
          cargo install --locked cargo-audit || true
          cargo install --locked cargo-pants || true

      - name: 依赖检查
        run: |
          cargo deny check
          cargo outdated --exit-code 1
          cargo udeps
          rm -rf ~/.cargo/advisory-db
          cargo audit
          cargo pants

      - name: 运行测试
        run: cargo test

这个工作流配置实现了以下功能:

  • 检出代码并安装指定版本的 Rust
  • 设置 cargo 缓存,加快后续构建速度
  • 进行代码风格检查和静态分析
  • 安装并运行各种 cargo 工具进行依赖检查
  • 运行项目测试

2. 在项目中使用工作流

要在你的 Rust 项目中使用这个工作流,可以创建一个 .github/workflows/rust.yml 文件,内容如下:

name: Rust Pipeline

on:
  push:
  pull_request:
  workflow_dispatch:

jobs:
  check:
    uses: your-username/your-repo/.github/workflows/rust-check.yaml@main
    # 如果需要,可以在这里指定 Rust 版本
    # with:
    #   rust-version: stable

3. 优化 Docker 构建

如果你的项目需要构建 Docker 镜像,可以使用以下工作流配置来加速构建过程:

name: Docker Build

on:
  workflow_call:
    inputs:
      image:
        type: string
        required: true
    secrets:
      container-registry-username:
        required: true
      container-registry-password:
        required: true

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: 检出代码
        uses: actions/checkout@v3

      - name: 设置 Docker Buildx
        uses: docker/setup-buildx-action@v2.0.0

      - name: 登录容器仓库
        uses: docker/login-action@v2.0.0
        with:
          username: ${{ secrets.container-registry-username }}
          password: ${{ secrets.container-registry-password }}

      - name: 构建并推送镜像
        uses: docker/build-push-action@v3.0.0
        with:
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ inputs.image }}:latest
          cache-from: type=registry,ref=${{ inputs.image }}:buildcache
          cache-to: type=registry,ref=${{ inputs.image }}:buildcache,mode=max

这个工作流利用了 Docker 的构建缓存功能,可以显著减少重复构建的时间。

总结

通过合理配置 GitHub Actions 工作流,我们可以大幅提升 Rust 项目的构建速度。主要优化点包括:

  1. 利用 cargo 缓存加速依赖下载和编译
  2. 使用可重用的工作流配置,便于在多个项目中应用
  3. 优化 Docker 构建过程,利用镜像缓存提高效率

这些优化措施可以将构建时间从原来的数十分钟缩短到几分钟,极大地提高了开发效率。希望这篇文章能够帮助你优化自己的 Rust 项目 CI/CD 流程,如果你有任何问题或建议,欢迎在评论区留言讨论。

参考文章

  1. How I speeded up my Rust builds on GitHub ~30 times:https://ectobit.com/blog/speed-up-github-actions-rust-pipelines
  2. GitHub Actions 文档:https://docs.github.com/cn/actions
  3. Rust 官方文档:https://www.rust-lang.org/zh-CN/learn

书籍推荐

各位 Rust 爱好者,今天为大家介绍一本《Programming Rust: Fast, Safe Systems Development》(第二版) 是由 Jim Blandy、Jason Orendorff 和 Leonora Tindall 合著的 Rust 编程指南。本书深入探讨了 Rust 语言在系统编程中的应用,着重介绍如何利用 Rust 的独特特性来平衡性能和安全性。书中涵盖了 Rust 的基础数据类型、所有权和借用概念、特征和泛型、并发编程、闭包、迭代器以及异步编程等核心内容。这本更新版基于 Rust 2021 版本,为系统程序员提供了全面而实用的 Rust 编程指导。

  1.  Rust:横扫 C/C++/Go 的性能之王?

  2.  从 Rust 开发者视角看 C++:优缺点大揭秘

  3.  Rust vs Zig:新兴系统编程语言之争

数据科学研习社
带你走进数据科学的世界🚀
 最新文章