Introdução: Por que CI/CD é criticamente importante para projetos Rust?
\nDesenvolver em Rust não é apenas sobre segurança de memória e alta performance, mas também sobre disciplina rigorosa. O compilador Rust captura muitos erros na fase de build, no entanto, isso não elimina a necessidade de testes de qualidade, linting e verificação de compatibilidade de dependências. É aqui que o CI/CD (Continuous Integration / Continuous Deployment) entra em ação.
\nGitHub Actions é um sistema de automação integrado que é ideal para projetos Rust. Ele permite executar automaticamente testes, formatar código, verificar vulnerabilidades e até publicar crates no registro crates.io a cada push no repositório. Neste artigo, abordaremos o pipeline completo: desde o básico cargo build até o deploy em produção.
1. Fundamentos: Configurando um workflow básico para Rust
\nQualquer pipeline CI/CD no GitHub Actions começa com a criação de um arquivo YAML no diretório .github/workflows/. Vamos criar o arquivo ci.yml para uma verificação básica de um projeto Rust.
1.1. Primeiro workflow: Build e testes
\nVamos começar com o conjunto mínimo: clonar o repositório, instalar o Rust e executar os testes.
\nname: Rust CI\n\non:\n push:\n branches: [ "main", "develop" ]\n pull_request:\n branches: [ "main" ]\n\nenv:\n CARGO_TERM_COLOR: always\n\njobs:\n build:\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v4\n - name: Install Rust\n uses: dtolnay/rust-toolchain@stable\n - name: Build\n run: cargo build --verbose\n - name: Run tests\n run: cargo test --verbose\nO que está acontecendo aqui?
\n- \n
actions/checkout@v4— clona seu código. \n dtolnay/rust-toolchain@stable— action oficial para instalar o Rust (suporta nightly, beta e stable). \n cargo buildecargo test— comandos principais para verificar o projeto. \n
Este workflow será executado a cada push nos branches main e develop, bem como ao criar um Pull Request.
1.2. Cache de dependências para acelerar o build
\nProjetos Rust geralmente têm muitas dependências. Para não precisar baixá-las toda vez, use cache. Isso reduzirá o tempo de build de 5 a 10 minutos para 30 a 60 segundos.
\n - name: Cache Cargo registry\n uses: actions/cache@v3\n with:\n path: |\n ~/.cargo/registry\n ~/.cargo/git\n target/\n key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}\n restore-keys: |\n ${{ runner.os }}-cargo-\nAdicione esta etapa antes de executar cargo build. O hash do arquivo Cargo.lock garante que o cache seja atualizado apenas quando as dependências mudarem.
2. Verificação avançada de qualidade de código
\nApenas testes não são suficientes para manter a alta qualidade do código. Vamos adicionar linting, formatação e verificação de segurança.
\n\n2.1. Formatação (rustfmt) e linting (clippy)
\nRust possui ferramentas integradas para manter um estilo de código consistente. Vamos adicioná-las em um job separado:
\n lint:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n - uses: dtolnay/rust-toolchain@stable\n with:\n components: clippy, rustfmt\n - name: Check formatting\n run: cargo fmt --check\n - name: Run clippy\n run: cargo clippy -- -D warnings\n- \n
cargo fmt --check— verifica se o código está formatado de acordo com o padrãorustfmt. \n cargo clippy -- -D warnings— executa o linter e transforma avisos em erros (flag-D). \n
Isso ajudará a evitar código "sujo" no repositório.
\n\n