CI/CD para projetos Go: GitHub Actions do A ao Z
\n\nNo desenvolvimento de software moderno, a automação dos processos de compilação, teste e implantação (CI/CD) tornou-se não apenas uma conveniência, mas uma necessidade. Para projetos em Go (Golang), usar o GitHub Actions é uma das maneiras mais simples e eficazes de organizar a integração e entrega contínuas. Neste artigo, abordaremos o ciclo completo de configuração de um pipeline de CI/CD para aplicações Go, desde a configuração básica até o deploy automático.
\n\nO que é GitHub Actions e por que é importante para Go?
\n\nGitHub Actions é uma plataforma integrada para automatizar fluxos de trabalho (workflows) em repositórios do GitHub. Ela permite criar pipelines que são acionados por eventos específicos: push em um branch, criação de pull request, publicação de release, etc.
\n\nPara projetos Go, o GitHub Actions oferece várias vantagens importantes:
\n- \n
- Compilação rápida — Go compila muito rapidamente, reduzindo o tempo de execução do pipeline. \n
- Linkagem estática — Binários Go não exigem dependências externas, simplificando o deploy. \n
- Teste integrado — A ferramenta
go testse integra perfeitamente com sistemas de CI. \n - Multiplataforma — É fácil compilar binários para diferentes sistemas operacionais e arquiteturas. \n
Configuração do pipeline CI básico
\n\nVamos começar criando um workflow simples que executará testes e verificará se o código está em conformidade com os padrões Go. Para isso, na raiz do seu repositório, crie o diretório .github/workflows e o arquivo ci.yml.
Exemplo de configuração básica:
\n\nname: CI Pipeline for Go\n\non:\n push:\n branches: [ main, develop ]\n pull_request:\n branches: [ main ]\n\njobs:\n build-and-test:\n runs-on: ubuntu-latest\n \n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Setup Go\n uses: actions/setup-go@v5\n with:\n go-version: '1.22'\n\n - name: Cache Go modules\n uses: actions/cache@v4\n with:\n path: ~/go/pkg/mod\n key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}\n restore-keys: |\n ${{ runner.os }}-go-\n\n - name: Download dependencies\n run: go mod download\n\n - name: Run vet\n run: go vet ./...\n\n - name: Run tests\n run: go test -v -race -count=1 ./...\n\n - name: Build\n run: go build -o myapp ./cmd/app\n\nEste workflow executa as seguintes etapas:
\n- \n
- Clona o repositório. \n
- Instala o Go versão 1.22. \n
- Armazena em cache os módulos para acelerar execuções futuras. \n
- Baixa as dependências via
go mod download. \n - Executa
go vetpara análise estática. \n - Executa os testes com a flag
-racepara detectar condições de corrida. \n - Compila o arquivo binário. \n
Configuração avançada: compilação multiplataforma e linters
\n\nGo permite compilar aplicativos facilmente para diferentes plataformas. Vamos adicionar ao pipeline uma matriz de compilação (build matrix) e a execução do linter golangci-lint.
Arquivo ci.yml atualizado:
name: Advanced Go CI/CD\n\non:\n push:\n branches: [ main ]\n pull_request:\n branches: [ main ]\n\njobs:\n lint:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n - uses: actions/setup-go@v5\n with:\n go-version: '1.22'\n - name: golangci-lint\n uses: golangci/golangci-lint-action@v4\n with:\n version: latest\n args: --timeout=5m\n\n test:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n - uses: actions/setup-go@v5\n with:\n go-version: '1.22'\n - run: go test -v -race -coverprofile=covera