CI/CD для Rust проектов: GitHub Actions от А до Я

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: Почему CI/CD критически важен для Rust-проектов

Rust — язык системного программирования, который славится своей производительностью и безопасностью памяти. Однако даже самый надежный код требует постоянной проверки. Ручное тестирование и сборка отнимают время и чреваты ошибками. CI/CD (Continuous Integration/Continuous Deployment) автоматизирует эти процессы, гарантируя, что каждое изменение в коде проходит проверку компилятором, тестами и линтерами до того, как попадет в основную ветку.

GitHub Actions — это встроенная платформа для автоматизации рабочих процессов в GitHub. Она идеально подходит для Rust-проектов благодаря гибкости, бесплатному лимиту минут для публичных репозиториев и огромной экосистеме готовых действий. В этой статье мы разберем полный цикл настройки CI/CD для Rust: от базовой сборки до оптимизации с помощью кэширования и деплоя.

1. Основы: Первый workflow для сборки и тестирования

Начнем с создания минимального рабочего процесса. В корне вашего репозитория создайте папку .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 или конкретную версию.

Этот workflow уже полезен: он гарантирует, что код компилируется и все тесты проходят. Но для реального проекта этого недостаточно.

2. Оптимизация: Кэширование зависимостей и мультиплатформенная сборка

Каждый запуск CI скачивает все зависимости заново. Для 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
    - name: Build
      run: cargo build --verbose
    - name: Run tests
      run: cargo test --verbose

Теперь ваш код будет проверяться на Linux, Windows и macOS одновременно.

3. Качество кода: Линтинг, форматирование и проверка безопасности

CI/CD — это не только сборка. Важно поддерживать единый стиль кода и выявлять потенциальные уязвимости.

Добавляем Clippy и rustfmt

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: Install Rust
      uses: dtolnay/rust-toolchain@stable
      with:
        components: clippy, rustfmt
    - name: Check formatting
      run: cargo fmt --check
    - name: Run Clippy
      run: cargo clippy -- -D warnings

Важно:

  • cargo fmt --check — проверяет, что код отформатирован по стандарту, не изменяя файлы.
  • cargo clippy -- -D warnings — запускает линтер и превращает все предупреждения в ошибки. Это жестко, но эффективно.

Проверка безопасности с cargo-audit

Устанавливаем и запускаем аудит зависимостей на известные уязвимости:

    - name: Install cargo-audit
      run: cargo install cargo-audit
    - name: Audit dependencies
      run: cargo audit

Добавьте этот шаг в отдельную job или в основную сборку. Это особенно важно для проектов, которые выкладываются в публичный доступ.

4. Деплой: Публикация на crates.io и создание релизов

Когда код прошел все проверки, можно автоматически публиковать новую версию.

Автоматическая публикация на crates.io

Для этого потребуется секрет CARGO_REGISTRY_TOKEN, который нужно добавить в настройках репозитория (Settings → Secrets and variables → Actions).

jobs:
  publish:
    if: startsWith(github.ref, 'refs/tags/v')
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: Install Rust
      uses: dtolnay/rust-toolchain@stable
    -                

Блоги

Рекомендаций по книгам