CI/CD для Rust проектов: GitHub Actions — часть 2: тестирование и деплой
В первой части мы настроили базовый пайплайн сборки Rust проекта. Теперь, углубляясь в программирование на Rust, мы рассмотрим автоматическое тестирование, линтинг и деплой. Это обязательный этап обучения Rust для начинающих, желающих писать профессиональный код. Сегодня вы узнаете, как сделать ваш CI/CD по-настоящему полезным.
1. Запуск тестов и проверка покрытия
Любой серьезный проект на Rust требует автоматического запуска тестов. В GitHub Actions это делается с помощью команды cargo test. Однако, чтобы получить максимальную пользу, добавьте проверку покрытия кода с помощью tarpaulin.
Настройка тестового окружения
Добавьте шаг в ваш workflow-файл (.github/workflows/ci.yml):
name: CI for Rust
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
override: true
- name: Run tests
run: cargo test --verbose
- name: Generate coverage
run: |
cargo install cargo-tarpaulin
cargo tarpaulin --out Xml
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
with:
token: ${{ secrets.CODECOV_TOKEN }}
Этот код показывает, как легко интегрировать Rust с внешними сервисами. cargo tarpaulin создаст отчет, который можно загрузить на Codecov или Coveralls. Для Rust для начинающих важно понимать: тесты — это ваш первый защитный барьер.
2. Линтинг и форматирование
Качественный код — это не только рабочий код, но и читаемый. В Rust есть два мощных инструмента: clippy (линтер) и rustfmt (форматировщик). Включите их в пайплайн.
Добавление Clippy и Rustfmt
Добавьте новый job или расширьте существующий:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
components: clippy, rustfmt
- name: Check formatting
run: cargo fmt -- --check
- name: Run Clippy
run: cargo clippy -- -D warnings
Флаг -D warnings превращает предупреждения в ошибки. Это жестко, но эффективно для обучения: вы сразу узнаете о потенциальных проблемах. Помните, что в программировании на Rust строгость — это преимущество.
3. Автоматический деплой на GitHub Pages
Когда тесты и линтинг пройдены, можно автоматически публиковать документацию. Rust генерирует документацию через cargo doc. Деплой на GitHub Pages — отличный способ показать результаты.
Workflow для деплоя
Создайте отдельный файл .github/workflows/deploy.yml:
name: Deploy Documentation
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
- name: Build documentation
run: cargo doc --no-deps --document-private-items
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./target/doc
Этот пайплайн срабатывает только при пуше в main. Он генерирует документацию и публикует её. Для Rust для начинающих это отличный способ показать свои проекты миру.
4. Оптимизация времени сборки: кэширование
Сборка Rust проектов может быть долгой. GitHub Actions позволяет кэшировать target директорию и ~/.cargo. Это ускоряет пайплайн в 2-3 раза.
Пример с кэшированием
Используйте action Swatinem/rust-cache:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: Swatinem/rust-cache@v2
- name: Build
run: cargo build --release
Этот шаг автоматически сохраняет и восстанавливает кэш. В программировании на Rust время — ценный ресурс, особенно при обучении.
Заключение
Мы рассмотрели, как расширить базовый CI/CD для Rust проектов: добавили тесты с покрытием, линтинг, автоматическую публикацию документации и кэширование. Эти навыки необходимы для любого разработчика, проходящего обучение Rust. Начните с малого — добавьте тесты, затем линтинг, и ваш код станет надежнее. Помните: Rust для начинающих — это путь постоянного улучшения. Используйте GitHub Actions, чтобы автоматизировать рутину и сосредоточиться на творчестве.
В следующей части мы рассмотрим многопоточные сборки и интеграцию с Docker. Оставайтесь с нами на pythonlib.ru!