Remover aprovação de deploy em produção
TLDR: O CI deixa de sincronizar reviewers do GitHub Environment
production; qualquer pessoa passa a subir tag em produção sem aprovação de owner.ownerscontinua existindo, servindo apenas ao RBAC do cluster.
Contexto
Hoje, subir uma tag em produção em qualquer app da org trava esperando aprovação manual de um owner.
Remover a rule pela UI do GitHub não resolve: ela volta sozinha no próximo merge que tocar
config/access.yml.
A cadeia que recria a rule:
config/access.yml
projects.<projeto>.owners
↓ push em main (paths filter inclui config/access.yml)
.github/workflows/infra.yml — job sync-reviewers
run: sync-environment-reviewers.sh config/access.yml ibft-corp
↓
.project/shell/tasks/ci/github/sync-environment-reviewers.sh
PUT repos/ibft-corp/<app>/environments/production
{"reviewers":[{"type":"User","id":<id>}]}
↓
protection rule required_reviewers recriada em cada app
O campo owners tem dois consumidores independentes:
| Consumidor | Efeito |
|---|---|
sync-environment-reviewers.sh:23 |
reviewers do GitHub Environment production — o gate |
bin/helpers/gen-access-tfvars.sh:44 |
owner_projects no tfvars → RoleBindings, exec e port-forward em production |
A decisão é desfazer só o primeiro. O RBAC do cluster continua como está — ninguém perde exec
nem port-forward em produção.
Um detalhe do script explica por que a limpeza precisa ser explícita: quando a lista de owners está
vazia ele executa continue e pula o repo, em vez de zerar os reviewers. Ou seja, parar de
sincronizar não desfaz o que já foi escrito — os repos que hoje têm a rule precisam ser limpos uma
vez, na mão.
Estado levantado em 2026-09-21 — 7 dos 12 apps ainda têm a rule ativa:
| App | required_reviewers |
|---|---|
| onion-mobile | oporpino |
| citrg-memberarea | oporpino |
| checkout-web | oporpino |
| gateway | oporpino |
| messenger-api | oporpino, brunoandradd, matheusscfr |
| marketing | oporpino, brunoandradd, matheusscfr, BezerraFilipe |
| nectar-charges | brunoandradd |
Os outros 5 (onion-backend, trgclub-api, trgclub-web, citrg-api, checkout-api) já foram limpos
manualmente e voltariam no próximo merge de config/access.yml.
Objetivos
- Qualquer pessoa pode subir tag em produção, em qualquer app da org, sem aprovação de owner
- O gate não volta sozinho em nenhum merge futuro
ownerscontinua alimentando o RBAC do cluster, sem perda deexecouport-forward- Nenhum script órfão fica no repositório
Fora de escopo
- CODEOWNERS. O step
Sync CODEOWNERSdo mesmo job continua intacto — aprovação de PR nosdevops.reposnão muda. - RBAC do cluster.
gen-access-tfvars.sh, os RoleBindings e o stack de kubernetes não são tocados. - Impedir readição manual. Nada impede um admin de recriar a rule pela UI do GitHub depois. A alternativa (um script que zera reviewers a cada run) foi considerada e descartada: mantém maquinaria rodando só para desfazer configuração.
ibft-corp/pipelines. Odeploy.yml@v1declaraenvironment:no job, o que é correto e necessário para o rastreamento de deployments — não é a causa e não muda.
Mudanças
ibft-corp/infrastructure
| Arquivo | Mudança |
|---|---|
.github/workflows/infra.yml |
remover o step Sync GitHub environment reviewers; renomear o job sync-reviewers → sync-codeowners e o name: para sync codeowners. Manter os steps Install yq e Sync CODEOWNERS |
.project/shell/tasks/ci/github/sync-environment-reviewers.sh |
deletar |
config/access.yml |
no cabeçalho, remover “owners aprovam deploys em produção (GitHub Environment reviewers)” e o bullet “Updates GitHub environment reviewers on all listed apps”; ajustar o comentário de apps que hoje diz “→ GitHub Environment reviewers” |
.project/docs/guides/access.md |
atualizar TLDR, o passo 2 de “Conseguir acesso”, o bloco de exemplo do YAML, as duas tabelas de seções e o diagrama mermaid (remover o nó F) |
ibft-corp/commons
| Arquivo | Mudança |
|---|---|
shell/tasks/ci/github/sync-environment-reviewers.sh |
deletar — cópia do mesmo script, sem outro consumidor na org |
Operação única
Limpar a rule nos 7 apps da tabela de contexto:
bash
for r in onion-mobile citrg-memberarea checkout-web gateway messenger-api marketing nectar-charges; do
echo '{"wait_timer":0,"reviewers":[],"deployment_branch_policy":null}' \
| gh api -X PUT "repos/ibft-corp/$r/environments/production" --input - --silent
done
Ordem importa: limpar depois do merge, para não correr o risco de um merge intermediário reescrever a rule.
Prova
| O que precisa ser verdade | Teste |
|---|---|
Nenhum app da org tem required_reviewers no environment production |
verificação via API — comando abaixo |
Um merge em config/access.yml não recria a rule |
rodar o workflow infra -> apply e repetir a verificação |
| CODEOWNERS continua sendo sincronizado | job sync-codeowners verde, .github/CODEOWNERS inalterado |
Owners mantêm exec em production |
kubectl auth can-i create pods/exec -n checkout--production |
bash
for r in onion-backend onion-mobile trgclub-api trgclub-web citrg-api citrg-memberarea \
checkout-api checkout-web gateway messenger-api marketing nectar-charges; do
n=$(gh api "repos/ibft-corp/$r/environments" \
-q '[.environments[].protection_rules[]? | select(.type=="required_reviewers")] | length')
echo "$r: $n"
done
Esperado: 0 em todos.
Documentação
.project/docs/guides/access.md— atualizado nesta mudança (ver tabela de Mudanças)config/access.yml— comentários de cabeçalho atualizados; o arquivo é a fonte de verdade e seus comentários são a documentação de primeira linha- Esta spec passa a ser a referência da decisão; a spec Configuração centralizada de acesso permanece válida no que diz respeito a RBAC e CODEOWNERS