Hooks de Pré-commit e Checklists de Revisão
Hooks de pré-commit executam verificações rápidas de qualidade em cada commit.
Busque em todas as páginas da documentação
Hooks de pré-commit executam verificações rápidas de qualidade em cada commit.
Checklists de revisão de PR capturam o que a automação não pode ver: formato da API, modos de falha e operabilidade.
Juntos, eles encurtam os loops de feedback sem substituir a CI como autoridade de merge.
Cartão de receita de referência rápida - pronto para copiar e colar.
# 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-commitQuando usar isso:
make check ainda não é habitual..pre-commit-config.yaml (framework 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: falseTrecho do modelo de PR (.github/pull_request_template.md):
## Checklist de qualidade Go
- [ ] `make check` passa localmente
- [ ] Novo código tem testes para caminhos de erro
- [ ] Nenhum `context.Background()` em manipuladores de requisição
- [ ] Clientes HTTP/gRPC expiram e respeitam o cancelamento
- [ ] Migrações ou alterações de configuração documentadas no corpo do PRFluxo do contribuinte:
git add internal/api/handler.go
git commit -m "adiciona manipulador de saúde"
# pré-commit executa goimports, gofmt, go vet em arquivos .go em staging, depois go test ./...O que isso demonstra:
.go em staging para velocidade.make check permanece o portão completo documentado antes do push..git/hooks/pre-commit antes de criar um objeto de commit.| Nível | Verificações | Duração alvo |
|---|---|---|
| Pré-commit | goimports, gofmt, go vet em arquivos em staging | < 15s |
| Pré-push | go test ./..., golangci-lint | < 2m |
| CI | race, govulncheck, integração | minutos |
| Área | Perguntas do revisor |
|---|---|
| Erros | Envoltos com contexto? Erros sentinela documentados? |
| Concorrência | Propriedade de mutex/canal clara? Contexto cancelado na saída? |
| HTTP/gRPC | Timeouts, fechamento de corpo, códigos de status corretos? |
| Observabilidade | Logs estruturados com ID de requisição? Métricas para novos caminhos? |
| Segurança | Entrada validada? Segredos não registrados? SQL parametrizado? |
| Testes | Casos de teste de tabela para erros? Código propenso a race sob -race na CI? |
.PHONY: check hook-install
hook-install:
ln -sf ../../scripts/pre-commit.sh .git/hooks/pre-commit
check:
golangci-lint run ./...
go test -race ./...Documente make hook-install no README após o clone.
--no-verify. Correção: Mova lint pesado para pré-push ou apenas CI.make hook-install na documentação de onboarding ou use pre-commit install do pre-commit.goimports -local do que na CI - Commit passa no hook, falha no pipeline. Correção: Fonte única de verdade em scripts/ compartilhada pelo hook e workflow.go test ./... ou go test $(go list ./...) no mínimo.stages: [commit] do pre-commit com atualização de arquivo adequada.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Portões apenas de CI | Equipe pequena, sempre online | Monorepos sensíveis à latência |
| Pré-push em vez de pré-commit | Ruído de formatação incomoda durante commits WIP | Você precisa bloquear histórico não formatado |
| Bots de auto-correção de PR | Alto volume de contribuidores OSS | Trilhas de auditoria rigorosas no main |
| Reviewdog na CI | Exibir lint apenas na diff | Substituir completamente o feedback rápido local |
Geralmente não em cada commit - muito lento.
Execute race na CI e opcionalmente no pré-push para alterações com muita concorrência.
git commit --no-verify para emergências.
Exija um post-mortem do incidente se usado em trabalho direcionado ao main.
Sim.
Execute a partir da raiz do workspace; go test ./... respeita todos os módulos no arquivo de trabalho.
Formate na geração, não em cada hook de commit.
Exclua *.pb.go de verificações em staging se a geração de código já formatar.
Salvar no editor reduz falhas de hook.
Hooks ainda capturam contribuidores usando editores diferentes ou fluxos de trabalho apenas de CLI.
Automatize regras objetivas (formato, verificação de erro).
Checklist cobre julgamento de design, operabilidade e segurança.
Possível, mas lento.
Prefira a toolchain go nativa no host para hooks de laptop.
Commite scripts/pre-commit.sh ou .pre-commit-config.yaml.
Documente o passo de instalação; não comite .git/hooks diretamente.
Verifique pontualmente em PRs não triviais.
Confie na CI para sinal autoritativo; verifique pontualmente ao tocar em tags de build ou go.mod.
Trimestralmente ou quando retrospectivas de incidentes citarem temas de revisão perdidos.
Itens menores e mais afiados superam listas longas e genéricas.
Versões de Stack: Esta página foi escrita para Go 1.26.x (padrão GC Green Tea, go fix modernizers - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026