O GitHub Actions é a plataforma de CI/CD mais popular para projetos Rust open-source. Neste guia, vamos configurar um pipeline completo com testes, linting, formatação, cache de dependências e releases automáticas.
Pipeline Básico
Crie o arquivo .github/workflows/ci.yml:
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
CARGO_TERM_COLOR: always
jobs:
test:
name: Testes
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Instalar Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache de dependências
uses: Swatinem/rust-cache@v2
- name: Executar testes
run: cargo test --all-features
- name: Build
run: cargo build --release
Este pipeline básico executa testes e build a cada push ou pull request na branch main.
Pipeline Completo (Recomendado)
Para projetos profissionais, use este pipeline com verificações de qualidade completas:
name: CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
env:
CARGO_TERM_COLOR: always
RUSTFLAGS: -Dwarnings
jobs:
fmt:
name: Formatação (rustfmt)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- run: cargo fmt --all --check
clippy:
name: Linting (clippy)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- uses: Swatinem/rust-cache@v2
- run: cargo clippy --all-targets --all-features
test:
name: Testes
runs-on: ubuntu-latest
needs: [fmt, clippy]
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: cargo test --all-features --workspace
build:
name: Build Release
runs-on: ubuntu-latest
needs: test
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: cargo build --release
- name: Upload artefato
uses: actions/upload-artifact@v4
with:
name: binary
path: target/release/meu-app
Matrix de Plataformas
Para testar em múltiplos sistemas operacionais e versões do Rust:
test-matrix:
name: Teste (${{ matrix.os }}, ${{ matrix.rust }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
rust: [stable, beta, nightly]
exclude:
- os: windows-latest
rust: nightly
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust }}
- uses: Swatinem/rust-cache@v2
with:
key: ${{ matrix.os }}-${{ matrix.rust }}
- run: cargo test --all-features
Para entender as diferenças entre plataformas, consulte nossos guias de instalação para Ubuntu, macOS e Windows.
Cache Otimizado
O Swatinem/rust-cache é a forma mais eficiente de cache para projetos Rust:
- uses: Swatinem/rust-cache@v2
with:
# Cache separado para diferentes jobs
key: ${{ github.job }}
# Incluir Cargo.lock no hash do cache
cache-on-failure: true
# Caches compartilhados entre branches
shared-key: "rust-cache"
Cache Manual (Alternativa)
Se preferir controle total:
- name: Cache Cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-
Cobertura de Código
Adicione cobertura de código com cargo-tarpaulin:
coverage:
name: Cobertura de Código
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: Instalar tarpaulin
run: cargo install cargo-tarpaulin
- name: Gerar cobertura
run: cargo tarpaulin --out xml --all-features
- name: Upload para Codecov
uses: codecov/codecov-action@v4
with:
files: cobertura.xml
token: ${{ secrets.CODECOV_TOKEN }}
Auditoria de Segurança
Verifique vulnerabilidades nas dependências automaticamente:
audit:
name: Auditoria de Segurança
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Instalar cargo-audit
run: cargo install cargo-audit
- name: Executar auditoria
run: cargo audit
Release Automática (Cross-Platform)
Para publicar binários para múltiplas plataformas quando uma tag é criada:
name: Release
on:
push:
tags:
- 'v*'
jobs:
release:
name: Release (${{ matrix.target }})
runs-on: ${{ matrix.os }}
strategy:
matrix:
include:
- target: x86_64-unknown-linux-gnu
os: ubuntu-latest
archive: tar.gz
- target: x86_64-apple-darwin
os: macos-latest
archive: tar.gz
- target: aarch64-apple-darwin
os: macos-latest
archive: tar.gz
- target: x86_64-pc-windows-msvc
os: windows-latest
archive: zip
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- uses: Swatinem/rust-cache@v2
- name: Build
run: cargo build --release --target ${{ matrix.target }}
- name: Criar Release
uses: softprops/action-gh-release@v2
with:
files: |
target/${{ matrix.target }}/release/meu-app*
generate_release_notes: true
Para mais detalhes sobre compilação cruzada, veja o guia de Cross-Compilation em Rust.
Docker no CI
Para builds Docker automatizadas com cache:
docker:
name: Docker Build
runs-on: ubuntu-latest
needs: test
steps:
- uses: actions/checkout@v4
- name: Build e Push
uses: docker/build-push-action@v5
with:
context: .
push: ${{ github.ref == 'refs/heads/main' }}
tags: ghcr.io/${{ github.repository }}:latest
cache-from: type=gha
cache-to: type=gha,mode=max
Para padrões de Dockerfile otimizados, consulte o guia de Rust com Docker.
Solução de Problemas
Testes falhando apenas no CI
Verifique se há dependências de sistema necessárias:
- name: Instalar dependências
run: sudo apt-get update && sudo apt-get install -y libssl-dev pkg-config
Cache não está sendo utilizado
Certifique-se de que o Cargo.lock está commitado no repositório. Sem ele, o hash do cache muda a cada build.
Build muito lento
Use o Swatinem/rust-cache e considere separar jobs por tipo de verificação (fmt, clippy, test), executando-os em paralelo.
Próximos Passos
Com CI/CD configurado para Rust:
- Siga o tutorial de Primeiros Passos com Rust
- Configure seu editor com o guia de VS Code ou Neovim
- Consulte o Guia Completo do Cargo para profiles de build
- Veja o Cheatsheet Rust para referência rápida
- Acesse as Perguntas Frequentes para dúvidas comuns
Se você também configura CI para projetos Go, confira o golang.com.br para comparar workflows entre as linguagens.
Última atualização: 23 de fevereiro de 2026. Para gerenciar versões do Rust, veja o Guia Completo do Rustup.