Введение: Почему 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
-