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

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

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

Начать курс

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

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

GitHub Actions — это встроенная система автоматизации, которая идеально подходит для Rust-проектов. Она позволяет автоматически запускать тесты, форматировать код, проверять на наличие уязвимостей и даже публиковать крейты (crates) в реестр crates.io при каждом пуше в репозиторий. В этой статье мы разберем полный пайплайн: от базового cargo build до продакшн-деплоя.

1. Основы: Настройка базового workflow для Rust

Любой CI/CD пайплайн в GitHub Actions начинается с создания YAML-файла в директории .github/workflows/. Давайте создадим файл ci.yml для базовой проверки Rust-проекта.

1.1. Первый workflow: Сборка и тесты

Начнем с минимального набора: клонирование репозитория, установка Rust и запуск тестов.

name: Rust CI

on:
  push:
    branches: [ "main", "develop" ]
  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

Что здесь происходит?

  • actions/checkout@v4 — клонирует ваш код.
  • dtolnay/rust-toolchain@stable — официальный экшен для установки Rust (поддерживает nightly, beta и stable).
  • cargo build и cargo test — основные команды для проверки проекта.

Этот workflow будет запускаться при каждом пуше в ветки main и develop, а также при создании Pull Request.

1.2. Кэширование зависимостей для ускорения сборки

Rust-проекты часто имеют много зависимостей. Чтобы не скачивать их каждый раз, используйте кэширование. Это сократит время сборки с 5-10 минут до 30-60 секунд.

    - name: Cache Cargo registry
      uses: actions/cache@v3
      with:
        path: |
          ~/.cargo/registry
          ~/.cargo/git
          target/
        key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
        restore-keys: |
          ${{ runner.os }}-cargo-

Добавьте этот шаг перед запуском cargo build. Хеш от файла Cargo.lock гарантирует, что кэш обновится только при изменении зависимостей.

2. Продвинутая проверка качества кода

Одних тестов недостаточно для поддержания высокого качества кода. Добавим линтинг, форматирование и проверку безопасности.

2.1. Форматирование (rustfmt) и линтинг (clippy)

Rust имеет встроенные инструменты для поддержания единого стиля кода. Добавим их в отдельную job:

  lint:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - 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 — проверяет, что код отформатирован по стандарту rustfmt.
  • cargo clippy -- -D warnings — запускает линтер и превращает предупреждения в ошибки (флаг -D).

Это поможет избежать "грязного" кода в репозитории.

2.2. Проверка безопасности зависимостей (cargo-audit)

Rust-экосистема известна своей безопасностью, но уязвимости в зависимостях все еще возможны. Используйте cargo-audit для сканирования базы данных уязвимостей RustSec.

  security:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@stable
    - name: Install cargo-audit
      run: cargo install cargo-audit
    - name: Audit dependencies
      run: cargo audit

Если найдена уязвимость с высоким приоритетом, пайплайн упадет, и вы узнаете о проблеме до того, как она попадет в продакшн.

3. Тестирование на нескольких платформах и версиях Rust

Rust компилируется под множество платформ. Если ваш проект должен работать на Windows, macOS и Linux, добавьте матрицу сборки.

3.1. Матрица операционных систем

  cross-platform:
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
    runs-on: ${{ matrix.os }}
    steps:
    - uses: actions/checkout@v4
    - uses: dtolnay/rust-toolchain@stable
    - name: Build
      run: cargo build --verbose
    - name: Test
      run: cargo test --verbose

Этот job запустится трижды — для каждой ОС. Вы можете добавить проверку на nightly или beta каналы Rust, чтобы убедиться, что ваш код совместим с будущими версиями:

        toolchain: [stable, beta, nightly]
    runs-on: ubuntu-latest
    steps:
    - uses: dtolnay/rust-toolchain@${{ matrix.toolchain }}

4. Автоматический деплой: Публикация крейта и сборка бинарников

Финальный этап — Continuous Deployment. Автоматизируем публикацию пакета в crates.io или сборку бинарного файла для релиза.

4.1. Публикация на crates.io при создании тега

Создайте workflow, который

Блоги

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