Ganchos Pre-commit y Listas de Verificación de Revisiones
Los ganchos pre-commit ejecutan comprobaciones de calidad rápidas en cada commit.
Busca en todas las páginas de la documentación
Los ganchos pre-commit ejecutan comprobaciones de calidad rápidas en cada commit.
Las listas de verificación de revisiones de PR capturan lo que la automatización no puede ver: la forma de la API, los modos de fallo y la operabilidad.
Juntos acortan los bucles de retroalimentación sin reemplazar a CI como autoridad de fusión.
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
# scripts/pre-commit.sh
#!/usr/bin/env bash
set -euo pipefail
changed=$(git diff --cached --name-only --diff-filter=ACM | grep '\.go$' || true)
[ -z "$changed" ] && exit 0
echo "$changed" | xargs goimports -local example.com/mycorp -w
echo "$changed" | xargs gofmt -s -w
echo "$changed" | xargs go vet
go test ./...chmod +x scripts/pre-commit.sh
ln -sf ../../scripts/pre-commit.sh .git/hooks/pre-commitCuándo usar esto:
make check aún no es habitual..pre-commit-config.yaml (marco opcional):
repos:
- repo: local
hooks:
- id: goimports
name: goimports
entry: goimports -local example.com/mycorp -w
language: system
types: [go]
- id: go-test-quick
name: go test
entry: go test ./...
language: system
pass_filenames: falseFragmento de plantilla de PR (.github/pull_request_template.md):
## Lista de verificación de calidad Go
- [ ] `make check` pasa localmente
- [ ] El código nuevo tiene pruebas para las rutas de error
- [ ] No hay `context.Background()` en los manejadores de solicitudes
- [ ] Los clientes HTTP/gRPC tienen timeouts y respetan la cancelación
- [ ] Las migraciones o cambios de configuración se documentan en el cuerpo del PRFlujo del contribuidor:
git add internal/api/handler.go
git commit -m "añadir manejador de salud"
# pre-commit ejecuta goimports, gofmt, go vet en archivos .go preparados, luego go test ./...Lo que esto demuestra:
.go preparados para mayor velocidad.make check sigue siendo la puerta de control completa documentada antes de enviar..git/hooks/pre-commit antes de crear un objeto de commit.| Nivel | Comprobaciones | Duración objetivo |
|---|---|---|
| Pre-commit | goimports, gofmt, go vet en archivos preparados | < 15s |
| Pre-push | go test ./..., golangci-lint | < 2m |
| CI | race, govulncheck, integración | minutos |
| Área | Preguntas del revisor |
|---|---|
| Errores | ¿Envueltos con contexto? ¿Errores centinela documentados? |
| Concurrencia | ¿Propiedad de mutex/canal clara? ¿Contexto cancelado al salir? |
| HTTP/gRPC | ¿Timeouts, cierre de cuerpo, códigos de estado correctos? |
| Observabilidad | ¿Logs estructurados con ID de solicitud? ¿Métricas para nuevas rutas? |
| Seguridad | ¿Entrada validada? ¿Secretos no registrados? ¿SQL parametrizado? |
| Pruebas | ¿Casos de tabla para errores? ¿Código propenso a carreras bajo -race en CI? |
.PHONY: check hook-install
hook-install:
ln -sf ../../scripts/pre-commit.sh .git/hooks/pre-commit
check:
golangci-lint run ./...
go test -race ./...Documenta make hook-install en README después de clonar.
--no-verify. Solución: Mueve el linting pesado a pre-push o solo a CI.make hook-install en la documentación de incorporación o usa pre-commit install de pre-commit.goimports -local que CI - El commit pasa el gancho, falla el pipeline. Solución: Fuente única de verdad en scripts/ compartida por el gancho y el flujo de trabajo.go test ./... o go test $(go list ./...) como mínimo.stages: [commit] de pre-commit con la actualización adecuada de archivos.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Puertas solo de CI | Equipo pequeño, siempre en línea | Monorepos sensibles a la latencia |
| pre-push en lugar de pre-commit | El ruido de formato molesta durante commits WIP | Necesitas bloquear historial sin formato |
| Bots de auto-corrección de PR | Alto volumen de contribuidores OSS | Pistas de auditoría estrictas en main |
| Reviewdog en CI | Mostrar lint solo en el diff | Reemplazar completamente la retroalimentación rápida local |
Generalmente no en cada commit - demasiado lento.
Ejecuta race en CI y opcionalmente en pre-push para cambios con mucha concurrencia.
git commit --no-verify para emergencias.
Requiere un post-mortem del incidente si se usa en trabajo destinado a main.
Sí.
Ejecuta desde la raíz del espacio de trabajo; go test ./... respeta todos los módulos en el archivo de trabajo.
Formatea en la generación, no en cada gancho de commit.
Excluye *.pb.go de las comprobaciones preparadas si la generación de código ya formatea.
El guardado del editor reduce los fallos de los ganchos.
Los ganchos todavía capturan a los contribuidores que usan diferentes editores o flujos de trabajo solo por CLI.
Automatiza reglas objetivas (formato, errcheck).
La lista de verificación cubre el diseño, la operabilidad y el juicio de seguridad.
Posible pero lento.
Prefiere la cadena de herramientas go nativa en el host para los ganchos de portátil.
Confirma scripts/pre-commit.sh o .pre-commit-config.yaml.
Documenta el paso de instalación; no confirmes .git/hooks directamente.
Comprobación puntual en PRs no triviales.
Confía en CI para la señal autorizada; comprueba puntualmente al tocar tags de compilación o go.mod.
Trimestralmente o cuando los retros de incidentes citan temas de revisión omitidos.
Menos elementos, más agudos, superan las listas largas y genéricas.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado Green Tea GC, go fix modernizers - 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: 16 jul 2026