Code review com IA no GitHub Actions: 3 estágios
Quase todo mundo que mostra claude-code-action ou coderabbitai/ai-pr-reviewer no .github/workflows/ esquece a parte chata: o que acontece quando o próprio pipeline falha em silêncio. O PR passa, o status fica verde, e três semanas depois você descobre que o job de IA nunca rodou porque o needs: apontava para um workflow que nem existe mais.
Vou mostrar o pipeline em 3 estágios que uso no meu harness de code review, e as 4 armadilhas que fazem ele silenciar. Os códigos saem do capítulo 11 do meu livro sobre code review com harness. Os números de arquitetura (300 linhas, 80% de cobertura) são thresholds de projeto, não medição de time em produção — rode no seu repo antes de adotar.

Os 3 estágios
O pipeline tem uma regra simples: nada chega no estágio seguinte se o anterior reprovou. Se a IA revisar código com erro de tipo, você está discutindo a cor do papel de parede numa casa com a parede caindo.
Estágio 1: Quality Gate (sem IA, sem humano)
Prettier, ESLint, type check, testes com cobertura. Tudo que uma máquina decide em segundos:
# .github/workflows/quality-gate.yml
name: Quality Gate
on:
pull_request:
branches: [main, develop]
jobs:
quality:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
- run: npm ci
- name: Prettier
run: npx prettier --check .
- name: ESLint
run: npx eslint . --max-warnings 0
- name: Type Check
run: npx tsc --noEmit
- name: Tests
run: npm test -- --coverage
- name: Coverage Check
run: |
COVERAGE=$(cat coverage/coverage-summary.json | jq '.total.lines.pct')
if (( $(echo "$COVERAGE < 80" | bc -l) )); then
echo "Cobertura abaixo de 80%: $COVERAGE%"
exit 1
fi
Este estágio não existe para pegar bug. Existe para tirar da pauta da IA tudo que a IA faria mal. Formatação, imports não usados, any espalhado, promises soltas. Se a IA comenta “isso aqui não está formatado”, o pipeline falhou antes dela abrir a boca.
Estágio 2: Revisão por IA (só se o estágio 1 passou)
Aqui entram anthropics/claude-code-action, o CodeRabbit (plano hospedado), ou o snyk/actions/node para dependência vulnerável. O ponto não é qual IA. O ponto é o needs::
# .github/workflows/ai-review.yml
name: AI Review
on:
pull_request:
jobs:
ai-review:
needs: [quality]
runs-on: ubuntu-latest
steps:
- uses: anthropics/claude-code-action@v1
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
Se o quality-gate reprovar, o ai-review nem roda. Isso parece óbvio, até você olhar workflows que colocam a IA em paralelo com o quality gate “para dar feedback mais rápido”. O feedback mais rápido é o PR voltando com 50 comentários da IA sobre coisas que o prettier --write resolveria num Ctrl+S.
Estágio 3: Humano (só se estágio 2 passou)
Atribuição automática de revisor, com skipKeywords: [WIP, Draft]:
# .github/auto-assign.yml
reviewers:
- kenimo49
- team-member-1
numberOfReviewers: 1
skipKeywords:
- WIP
- Draft
O humano decide design, nomes, trade-off arquitetural. Não revisa indentação. Não revisa se o nome de variável é userData ou user. Essas coisas morreram no estágio 1.
As 4 armadilhas que fazem o pipeline silenciar
Agora a parte que ninguém mostra. O pipeline acima funciona se você não cair em nenhuma destas:
1. needs: apontando para job que não existe mais. Você renomeia quality-gate para quality e esquece de atualizar o ai-review.yml. O GitHub Actions não grita. O workflow fica em pending eternamente, mas o status check “passa” porque o workflow nem foi acionado. Mitigação: rode act -l localmente antes de merge, ou use required status checks no branch protection apontando para o job name exato.
2. CI falhou, ninguém foi notificado. Workflow default do GitHub Actions não manda notificação por falha em PR de outra pessoa. Só o autor do PR vê. Reviewer olha ”✓ All checks passed” (porque o job nem rodou) e aprova. Mitigação: adicione if: failure() + Slack/Discord webhook no último step, e marque o workflow como required no branch protection — se não rodar, o PR não funde.
3. Secrets em workflow de fork. secrets.ANTHROPIC_API_KEY não é passado para workflows de forks (comportamento correto, para evitar vazamento). Mas se seu ai-review.yml roda em pull_request em vez de pull_request_target, PRs de contribuidores externos recebem review silenciosamente sem IA. Mitigação: detecte a ausência da chave logo no início e marque o job como skipped com mensagem explícita, ou use pull_request_target com cuidado (código do PR não é confiável).
4. Workflow de PR size que só comenta. actions/github-script que avisa “PR grande (720 linhas)” mas não bloqueia nada. Em três meses, aquele aviso vira ruído. Ninguém lê. Mitigação: se o PR passa de 300 linhas, falhe o status check e exija label large-pr-approved manual. Comentário sem consequência é só poluição.
O estágio zero: hooks pre-commit
Antes do pipeline, tem o estágio zero que roda na máquina do dev: husky + lint-staged. Já escrevi sobre isso em Camada 1 do harness de code review: 3 hooks pre-commit cortam 40%. O pipeline do GitHub Actions é a rede de segurança para quando o pre-commit foi pulado com --no-verify, mas não deve ser a primeira linha. Se tudo chegar no CI, o CI vira o gargalo.
A tabela mental é essa:
| Estágio | Onde roda | O que decide |
|---|---|---|
| 0 | Local (pre-commit) | Format, lint rápido |
| 1 | GitHub Actions | Format, lint completo, type, test, coverage |
| 2 | GitHub Actions | Lógica, security scan, design por IA |
| 3 | Humano | Design, arquitetura, naming |
Se seu PR não passou do estágio 0, o estágio 3 nem fica sabendo que você existia.
E a questão do custo
anthropics/claude-code-action roda contra a API da Anthropic. CodeRabbit tem free tier limitado + pago. GitHub Copilot code review entra nos planos pagos do Copilot (Pro, Business, Enterprise). A escolha depende de onde seu time já tem contrato — o custo real de rodar Claude Code e ChatGPT Codex lado a lado está detalhado em ChatGPT Codex vs Claude Code Pricing: 90d Bill (em inglês). O ponto é: tenha uma IA no estágio 2. Qual, importa menos do que ter.
E se você vai montar o pipeline, monte o alerta junto. Pipeline que falha em silêncio é pior que pipeline que não existe — no segundo caso, pelo menos você sabe que não tem rede.
ken imoto · WebRTC & Voice AI engineer · kenimoto.dev · TabNews
Livro relacionado Revisão de Código com Harness Engineering Revisão de código em três camadas | hooks + IA + humano · AGENTS.md · CodeRabbit · GitHub Actions Ver a página do livro → Este artigo foi útil?