Canales de CI/CD para Servicios Go
Un canal de microservicios Go ejecuta pruebas y verificaciones de seguridad, construye un binario o imagen versionado, lo envía a un registro y actualiza Kubernetes con la misma etiqueta o digest inmutable.
Busca en todas las páginas de la documentación
Un canal de microservicios Go ejecuta pruebas y verificaciones de seguridad, construye un binario o imagen versionado, lo envía a un registro y actualiza Kubernetes con la misma etiqueta o digest inmutable.
La retroalimentación rápida y los artefactos reproducibles importan más que la sintaxis exótica de orquestación.
Las etapas estándar son verificar (go test, lint, govulncheck), construir (go build o multi-etapa de Docker), publicar (enviar imagen con etiqueta semver o SHA) y desplegar (kubectl apply, Helm upgrade o sincronización de Argo CD).
Fija Go 1.26.x en CI para que coincida con las cadenas de herramientas de producción.
Promociona el digest exacto de la imagen probado en staging; nunca reconstruyas en el momento del despliegue con indicadores diferentes.
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
# .github/workflows/service.yml (extracto)
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:$VERSIONCuándo usar esto:
Flujo de trabajo de GitHub Actions con matriz de pruebas, escaneo de vulnerabilidades y despliegue anclado 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=120sLo que esto demuestra:
govulncheck bloquea fusiones con CVE conocidos alcanzables en las dependencias.-race detecta carreras de datos antes de la producción.-ldflags incrusta metadatos de versión para los registros de tiempo de ejecución.| Etapa | Comando / acción | Criterio de fallo |
|---|---|---|
| Unidad/integración | go test ./... | fallo de prueba o de carrera |
| Análisis estático | golangci-lint run | linters configurados |
| Escaneo de vulnerabilidades | govulncheck ./... | vulnerabilidades alcanzables según la política |
| Construcción | docker build o go build | error de compilación |
| Escanear imagen | trivy/grype en la etiqueta enviada | política de CVE críticos |
| Despliegue | kubectl / sincronización GitOps | tiempo de espera de despliegue |
# Objetivos de Makefile para paridad 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 mantienen los comandos de CI idénticos a los flujos de trabajo de desarrollador local.go.sum; ejecuta go mod verify en CI para detectar manipulaciones.GOPRIVATE y .netrc o ayudantes de credenciales para módulos privados.En lugar de kubectl set image desde CI, envía cambios de manifiesto a un repositorio de despliegue.
Argo CD o Flux reconcilian el estado del clúster desde git.
El canal actualiza el digest de imagen de kustomization.yaml; los humanos revisan las PR de despliegue por separado de las PR de la aplicación.
GOFLAGS o módulos en caché pueden producir binarios divergentes de la compilación de CI.latest: imposible saber qué código se ejecuta; siempre fija semver o digest.main: etiqueta los canales solo en fusiones verdes; protege main con verificaciones requeridas.Sí, para servicios donde la concurrencia importa; añade tiempo pero detecta carreras temprano.
Divide los paquetes entre trabajos de matriz si el tiempo de ejecución es grande.
Ejecuta pruebas de manejador httptest en la etapa de unidad; inicia testcontainers o un espacio de nombres de staging para la integración de la base de datos en main o nocturnamente.
Bloquea la promoción a producción en pruebas de humo de staging que lleguen a /readyz.
Usa directivas replace solo localmente; CI debe construir a partir de versiones de módulos etiquetadas.
Establece GOPRIVATE=*.corp.example y configura las credenciales de git en el runner.
El digest es la inmutabilidad más fuerte.
Las etiquetas Semver son amigables para los humanos; combina ambas en los logs de CI: 1.4.2@sha256:....
Despliegue automático a staging en la fusión de main; la producción requiere aprobación manual o promoción programada después de las comprobaciones del presupuesto de errores.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado de Green Tea GC, modernizadores de go fix - verifica el parche en la compilación), chi (último - verifica en la compilación), gin (último - verifica en la compilación), echo (último - verifica en la compilación), google.golang.org/grpc (último - verifica en la compilación), sigs.k8s.io/controller-runtime (último - verifica en la compilación), kubebuilder (último - verifica en la compilación), tinygo (último - verifica objetivos de placa en la compilación), wazero (último - verifica en la compilación) y golangci-lint (último - verifica el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 16 jul 2026