Введение: Почему 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, который