GitHub Actions para Repositorios Go
GitHub Actions ejecuta las mismas comprobaciones de go test, lint y de higiene de módulos en cada push y pull request.
Busca en todas las páginas de la documentación
GitHub Actions ejecuta las mismas comprobaciones de go test, lint y de higiene de módulos en cada push y pull request.
Los flujos de trabajo bien diseñados almacenan módulos en caché, fijan versiones de Go y bloquean las fusiones antes de que los cambios incorrectos en go.mod lleguen al trunk.
Un flujo de trabajo mínimo de Go CI configura Go, descarga módulos con caché, ejecuta pruebas y vet, y falla si go mod tidy cambiara archivos.
Añade golangci-lint, detección de carreras y trabajos de lanzamiento que crean etiquetas semver cuando los mantenedores necesitan automatización.
Mantén los secretos limitados a la obtención de dependencias privadas (GOPRIVATE) y las credenciales de publicación.
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
# .github/workflows/ci.yml
name: CI
on:
push:
branches: [main]
pull_request:
permissions:
contents: read
jobs:
test:
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 vet ./...
- run: go mod tidy && git diff --exit-code go.mod go.sumCuándo usar esto:
go test solo local.git tag.CI completa más trabajo de linting para github.com/myorg/widget:
# .github/workflows/ci.yml
name: CI
on:
push:
branches: [main]
pull_request:
permissions:
contents: read
env:
GOTOOLCHAIN: local
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: go.mod
cache-dependency-path: |
go.sum
**/go.sum
- name: Test
run: go test -count=1 ./...
- name: Vet
run: go vet ./...
- name: Mod tidy check
run: go mod tidy && git diff --exit-code go.mod go.sum
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: go.mod
cache: true
- uses: golangci/golangci-lint-action@v6
with:
version: latestLo que esto demuestra:
go-version-file: go.mod alinea la CI con la versión mínima de la toolchain declarada en el módulo.go.sum anidados para repositorios multi-módulo.actions/checkout clona la referencia de fusión del PR o el SHA del push.setup-go instala la toolchain y calienta la caché de módulos y compilación../...) bajo la raíz del módulo.tidy asegura que los go.mod / go.sum confirmados coincidan con las importaciones.| Desencadenador | Uso Típico |
|---|---|
pull_request | Bloquear fusiones al trunk |
push a main | Validación post-fusión + lanzamiento |
push de etiquetas v* | Artefactos de lanzamiento o pruebas de humo de proxy |
workflow_dispatch | Reconstrucción manual o pipeline de hotfix |
env:
GOPRIVATE: github.com/myorg/*
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: go.mod
- run: git config --global url."https://${{ secrets.GH_PAT }}@github.com/".insteadOf "https://github.com/"
if: env.GOPRIVATE != ''Usa un PAT con ámbito reducido o un token de GitHub App legible solo por dependencias privadas.
Documenta el mismo prefijo GOPRIVATE para los desarrolladores localmente.
release:
if: github.ref_type == 'tag' && startsWith(github.ref_name, 'v')
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: go.mod
- run: go test ./...
- run: goreleaser release --clean
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}El push de etiquetas activa la compilación después de que las pruebas pasen; goreleaser es opcional pero común para binarios de Go.
on:
pull_request:
paths:
- '**.go'
- 'go.mod'
- 'go.sum'
- '.github/workflows/**'Omite trabajos de documentación cuando no cambian rutas que afectan al módulo, pero nunca omitas cuando cambian go.mod.
go.mod dice 1.26 - Errores de desajuste de toolchain. Solución: usa go-version-file: go.mod o un parche explícito coincidente.tidy - El trunk acumula requisitos huérfanos. Solución: siempre go mod tidy && git diff --exit-code.go.sum - Caché de módulos obsoleta después de incrementos de dependencias. Solución: incluye go.sum en cache-dependency-path.GOPRIVATE demasiado amplio - Omite accidentalmente sumdb para módulos públicos. Solución: limita solo a prefijos de organización.-count=1 - La caché a nivel de paquete inestable oculta fallos. Solución: usa -count=1 en CI o un paso de limpieza de caché de pruebas.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| GitLab CI / CircleCI | El estándar de la organización no es GitHub | Ya te has estandarizado en Actions para Go |
| Nightly completo con race/matriz | Cobertura profunda de concurrencia | Cada PR (demasiado lento) |
| Runners autoalojados | Hardware personalizado, aislado | Biblioteca pública simple |
| Solo hooks de pre-commit | Retroalimentación local rápida | Necesitas compuertas forzadas en el servidor |
La CI debe cumplir o superar la directiva go en go.mod.
La versión de tiempo de ejecución de producción es independiente de la toolchain utilizada para compilar.
Añade un trabajo: go test -race ./... en Linux de 64 bits.
Más lento; a menudo nocturno o solo en la rama principal para ahorrar tiempo en PR.
Usa matrix sobre directorios de módulos o un trabajo desde la raíz del repo con go work en CI.
Valida con GOWORK=off antes de las etiquetas de lanzamiento.
actions/setup-go con cache: true usa hashes de go.sum.
Para workspaces, lista cada go.sum en cache-dependency-path.
Decisión del equipo.
Empieza solo con errores; aprieta a medida que se reduce la deuda.
Desencadena el flujo de trabajo en push: tags: ['v*'], ejecuta pruebas completas, y luego adjunta artefactos o ejecuta goreleaser.
contents: read para trabajos de prueba.
write o id-token solo para trabajos de lanzamiento, firma o despliegue.
Posible con bots, pero la revisión es esencial.
Los PRs de tidy ciegos pueden ocultar dependencias transitivas maliciosas.
Menos de 10 minutos para un PR mediano mantiene el flujo del trunk saludable.
Divide el lint/matriz si es más largo; usa filtros de ruta con cuidado.
Usa contenedores de servicios o flujos de trabajo dedicados.
Mantén el trabajo de PR por defecto hermético con go test -short cuando sea aplicable.
Establece GOTOOLCHAIN: local o auto explícitamente en env para evitar descargas sorpresa en CI.
Usa pull_request con permisos de solo lectura predeterminados de GITHUB_TOKEN.
Evita pasar secretos a flujos de trabajo de forks no confiables sin compuertas de aprobación.
go work - Rutas de flujo de trabajo multi-móduloVersiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado de Green Tea GC,
go fixmodernizadores - verifica el parche en la compilación), chi (última versión - verifica en la compilación), gin (última versión - verifica en la compilación), echo (última versión - verifica en la compilación), google.golang.org/grpc (última versión - verifica en la compilación), sigs.k8s.io/controller-runtime (última versión - verifica en la compilación), kubebuilder (última versión - verifica en la compilación), tinygo (última versión - verifica los objetivos de placa en la compilación), wazero (última versión - verifica en la compilación), y golangci-lint (última versión - verifica el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 19 jul 2026