Pipelines de CI/CD para Serviços Go
Um pipeline de microsserviços Go executa testes e verificações de segurança, constrói um binário ou imagem versionado, envia para um registro e atualiza o Kubernetes com a mesma tag ou digest imutável.
Busque em todas as páginas da documentação
Um pipeline de microsserviços Go executa testes e verificações de segurança, constrói um binário ou imagem versionado, envia para um registro e atualiza o Kubernetes com a mesma tag ou digest imutável.
Feedback rápido e artefatos reproduzíveis importam mais do que sintaxe exótica de orquestração.
Estágios padrão são verificar (go test, lint, govulncheck), construir (go build ou Docker multi-stage), publicar (enviar imagem com tag semver ou SHA) e implantar (kubectl apply, Helm upgrade ou Argo CD sync).
Fixe Go 1.26.x em CI para corresponder às toolchains de produção.
Promova o digest exato da imagem testada em staging; nunca reconstrua no momento da implantação com flags diferentes.
Cartão de receita de referência rápida - pronto para copiar e colar.
# .github/workflows/service.yml (excerto)
name: orders-api
on:
push:
branches: [main]
jobs:
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "1.26.x"
cache: true
- run: go test ./...
- run: go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest && golangci-lint run
- run: go install golang.org/x/vuln/cmd/govulncheck@latest && govulncheck ./...
build-push:
needs: verify
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: |
VERSION=$(git describe --tags --always)
docker build \
--build-arg VERSION="$VERSION" \
--build-arg COMMIT="${{ github.sha }}" \
-t ghcr.io/myorg/orders-api:$VERSION .
docker push ghcr.io/myorg/orders-api:$VERSION
deploy-staging:
needs: build-push
runs-on: ubuntu-latest
steps:
- run: kubectl set image deployment/orders-api api=ghcr.io/myorg/orders-api:$VERSIONQuando usar isso:
Fluxo de trabalho do GitHub Actions com matriz de testes, varredura de vulnerabilidade e implantação fixada por digest:
name: orders-api
on:
push:
branches: [main]
pull_request:
env:
REGISTRY: ghcr.io
IMAGE: ghcr.io/myorg/orders-api
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "1.26.x"
cache-dependency-path: go.sum
- run: go test -race -count=1 ./...
- run: go vet ./...
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "1.26.x"
- uses: golangci/golangci-lint-action@v6
with:
version: latest
vuln:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "1.26.x"
- run: go install golang.org/x/vuln/cmd/govulncheck@latest
- run: govulncheck ./...
image:
needs: [test, lint, vuln]
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
outputs:
digest: ${{ steps.build.outputs.digest }}
version: ${{ steps.meta.outputs.version }}
steps:
- uses: actions/checkout@v4
- id: meta
run: echo "version=$(git describe --tags --always)" >> "$GITHUB_OUTPUT"
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- id: build
uses: docker/build-push-action@v6
with:
push: true
tags: ${{ env.IMAGE }}:${{ steps.meta.outputs.version }}
build-args: |
VERSION=${{ steps.meta.outputs.version }}
COMMIT=${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max
deploy:
needs: image
runs-on: ubuntu-latest
environment: staging
steps:
- uses: azure/setup-kubectl@v4
- run: |
kubectl set image deployment/orders-api \
api=${{ env.IMAGE }}@${{ needs.image.outputs.digest }}
kubectl rollout status deployment/orders-api --timeout=120sO que isso demonstra:
govulncheck bloqueia merges com CVEs conhecidos alcançáveis em dependências.-race captura data races antes da produção.-ldflags embutem metadados de versão para logs em tempo de execução.| Estágio | Comando / ação | Critério de falha |
|---|---|---|
| Unitário/integração | go test ./... | falha de teste ou race |
| Análise estática | golangci-lint run | linters configurados |
| Varredura de Vuln | govulncheck ./... | vulns alcançáveis por política |
| Build | docker build ou go build | erro de compilação |
| Escanear imagem | trivy/grype na tag enviada | política de CVE crítica |
| Deploy | kubectl / sincronização GitOps | timeout de rollout |
# Alvos do Makefile para paridade local/CI
test:
go test -race -count=1 ./...
lint:
golangci-lint run
vuln:
govulncheck ./...
build:
CGO_ENABLED=0 go build -trimpath -ldflags="$(LDFLAGS)" -o bin/api ./cmd/apimage mantêm os comandos de CI idênticos aos fluxos de trabalho de desenvolvedor local.go.sum; execute go mod verify em CI para detectar adulteração.GOPRIVATE e .netrc ou helpers de credenciais para módulos privados.Em vez de kubectl set image do CI, envie alterações de manifesto para um repositório de deploy.
Argo CD ou Flux reconciliam o estado do cluster a partir do git.
O pipeline atualiza o digest da imagem em kustomization.yaml; humanos revisam os PRs de deploy separadamente dos PRs de aplicativo.
GOFLAGS ou módulos em cache podem produzir binários divergentes do build de CI.latest: impossível saber qual código está em execução; sempre fixe semver ou digest.main com verificações obrigatórias.Sim, para serviços onde a concorrência é importante; adiciona tempo, mas captura races cedo.
Particione pacotes entre jobs da matriz se o tempo de execução for muito grande.
Execute testes de handler httptest no estágio unitário; inicie testcontainers ou um namespace de staging para integração de banco de dados no main ou em execuções noturnas.
Bloqueie a promoção para produção em smoke tests de staging que atingem /readyz.
Use diretivas replace apenas localmente; CI deve construir a partir de versões de módulos com tag.
Defina GOPRIVATE=*.corp.example e configure credenciais git no runner.
Digest é a maior imutabilidade.
Tags Semver são amigáveis para humanos; combine ambos nos logs de CI: 1.4.2@sha256:....
Implantação automática em staging no merge do main; produção requer aprovação manual ou promoção agendada após verificações de orçamento de erro.
Versões de Stack: Esta página foi escrita para Go 1.26.x (padrão Green Tea GC, go fix modernizers - verifique o patch no build), chi (latest - verifique no build), gin (latest - verifique no build), echo (latest - verifique no build), google.golang.org/grpc (latest - verifique no build), sigs.k8s.io/controller-runtime (latest - verifique no build), kubebuilder (latest - verifique no build), tinygo (latest - verifique os alvos da placa no build), wazero (latest - verifique no build) e golangci-lint (latest - verifique o conjunto de linters no build).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026