Configuração de CI para Rust
A configuração de CI do lado do Git mantém os portões de qualidade do Rust próximos ao controle de versão: .github/workflows/ci.yml espelha o que os revisores esperam antes do merge.
Receita
name: ci
on:
pull_request:
push:
branches: [main]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: 1.97.0
components: rustfmt, clippy
- uses: Swatinem/rust-cache@v2
- run: cargo fmt --all -- --check
- run: cargo clippy --all-targets --all-features -- -D warnings
- run: cargo test --all-features
- run: cargo build --release --locked
env:
SQLX_OFFLINE: trueQuando usar isso:
- Inicialização de novo repositório Rust
- CI mais lenta que 15 minutos sem cache
- Testes instáveis devido à falta de dados offline do sqlx
Exemplo de Trabalho
jobs:
msrv:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@1.97.0
- run: cargo test --locked
miri:
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@nightly
with:
components: miri
- run: cargo +nightly miri test -p unsafe-crateO que isso demonstra:
- O job MSRV valida a toolchain mínima
- Job Miri opcional para crates
unsafe SQLX_OFFLINEevita banco de dados ao vivo na CI de PR
Mergulho Profundo
Paridade com Pré-commit
# Hook .pre-commit-config.yaml
- repo: local
hooks:
- id: cargo-fmt
entry: cargo fmt --all -- --check
language: system
pass_filenames: falseOs hooks devem corresponder exatamente aos comandos da CI.
Armadilhas
- Sem
--locked- CI não determinística. Correção: falhar quando o lockfile estiver desatualizado. - Cache de
targetsem chave de lock - artefatos desatualizados. Correção: rust-cache lida com chaves. - Testes de integração precisam de postgres - use um container de serviço ou marque
#[ignore]para divisão da CI. - Clippy sem
-D warnings- avisos se acumulam. - Nightly apenas em
main- PRs não devem exigir nightly, a menos que documentado.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
cargo nextest | Relatórios de teste mais rápidos | Contagem mínima de testes |
| Runners auto-hospedados | Grande espaço de trabalho | OSS simples |
| Inclui GitLab | Padrão da organização | Repositório GitHub |
FAQs
Onde fica a CI de deploy?
Arquivo release.yml separado em tags; mantenha o ci.yml de PR rápido.
Como cachear dados sqlx?
Faça commit de .sqlx/; defina SQLX_OFFLINE=true no ambiente do workflow.
CI de Workspace?
Execute a partir da raiz do repositório; cargo test --workspace --all-features.
Relacionado
Versões de Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4 e Polars 0.46+.