Rust no GitHub Actions: CI/CD Completo

Configure CI/CD completo para Rust no GitHub Actions com testes, clippy, rustfmt, cache, matrix de builds e releases automáticas.

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:

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.