Introdução ao CI/CD para Projetos Go
O desenvolvimento moderno em Go (Golang) exige não apenas código de qualidade, mas também automação confiável dos processos de build, teste e deploy. CI/CD (Continuous Integration / Continuous Deployment) é uma abordagem que permite verificar automaticamente cada alteração no código, executar testes e entregar a aplicação pronta aos usuários. Neste artigo, vamos detalhar como configurar um pipeline CI/CD para projetos Go usando GitHub Actions.
GitHub Actions é um sistema CI/CD integrado que permite criar workflows diretamente no repositório GitHub. Para desenvolvedores Go, isso é especialmente conveniente, pois não requer configuração de serviços externos e se integra facilmente com a infraestrutura existente.
Por que GitHub Actions para Go?
- Gratuito para repositórios públicos — até 2000 minutos de build por mês gratuitamente
- Suporte nativo a Go — actions oficiais para configuração do ambiente
- Flexibilidade — pode ser executado em Ubuntu, Windows, macOS
- Cache — aceleração de builds usando cache de Go modules
- Teste matricial — execução paralela em diferentes versões do Go
Criando um Pipeline CI/CD Básico
Vamos começar criando um workflow simples que será executado a cada push no repositório. Para isso, é necessário criar o arquivo .github/workflows/go.yml na raiz do seu projeto.
Exemplo de workflow básico
name: Go CI/CD
on: push: branches: [ main, develop ] pull_request: branches: [ main ]
jobs: build: runs-on: ubuntu-latest strategy: matrix: go-version: [ '1.21', '1.22' ]
steps: - uses: actions/checkout@v4
- name: Setup Go uses: actions/setup-go@v5 with: go-version: ${{ matrix.go-version }}
- name: Cache Go modules uses: actions/cache@v3 with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go-
- name: Install dependencies run: go mod download
- name: Build run: go build -v ./...
- name: Test run: go test -v -race -coverprofile=coverage.txt ./...
- name: Upload coverage uses: codecov/codecov-action@v3 with: file: ./coverage.txt flags: unittestsEste workflow faz o seguinte:
- Executa ao fazer push em main/develop ou ao criar um pull request
- Testa em duas versões do Go (1.21 e 1.22)
- Armazena em cache os módulos para acelerar builds subsequentes
- Compila o projeto e executa testes com as flags
-race(detector de data races) e-cover(cobertura de código) - Envia o relatório de cobertura para o Codecov
Configurações Avançadas: Linting e Segurança
Para um projeto Go profissional, não basta apenas compilar e testar o código. Vamos adicionar análise estática e verificação de segurança.
Adicionando Linting com golangci-lint
- name: Lint uses: golangci/golangci-lint-action@v3 with: version: latest args: --timeout=5m --out-format=colored-line-number skip-pkg-cache: truegolangci-lint combina dezenas de linters (govet, staticcheck, errcheck e outros) e gera um relatório unificado. Isso ajuda a encontrar erros potenciais, código não utilizado e problemas de estilo.
Verificação de Segurança com govulncheck
- name: Check vulnerabilities run: | go install golang.org/x/vuln/cmd/govulncheck@latest govulncheck ./...A ferramenta govulncheck analisa as dependências do projeto em busca de vulnerabilidades conhecidas no banco de dados Go Vulnerability Database. Isso é crítico para manter a segurança da aplicação.