Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ jobs:
path: |
~/.android/avd/*
~/.android/adb*
key: avd-36-x86_64-pixel_7
key: avd-36-x86_64-pixel_7-ubuntu-24.04
- name: Gera o snapshot do AVD para o cache
if: steps.avd-cache.outputs.cache-hit != 'true'
uses: reactivecircus/android-emulator-runner@v2
Expand Down
17 changes: 17 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,23 @@ ruído. A lista de checks obrigatórios vem de
remover um job, atualize `JOBS_DOCUMENTADOS` nesse script, `CLAUDE.md` e
`AGENTS.md` no mesmo commit. O job `workflow-lint` falha se não fizer isso.

O `workflow-lint` não enxerga a proteção configurada no GitHub. Depois de
mesclar uma PR que muda a lista, um admin tem de reaplicar a proteção, senão
as PRs ficam esperando um check que não existe mais (job renomeado) ou um job
novo fica opcional sem ninguém perceber. Para conferir as duas listas:

```bash
esperado=$(./scripts/qa/ci_invariants.sh --checks-obrigatorios | python3 -c 'import json,sys; print(" ".join(c["context"] for c in json.load(sys.stdin)))')
for b in develop main; do
atual=$(gh api "repos/hbgit/SinalACS/branches/$b/protection/required_status_checks" --jq '[.checks[].context] | sort | join(" ")')
[ "$atual" = "$esperado" ] && echo "$b ok" || echo "$b DIVERGE: $atual"
done
```

Para reaplicar, use o `PUT .../branches/<branch>/protection` da Task 6 de
`docs/superpowers/plans/2026-09-28-ci-correcoes-avaliacao.md`, com
`"checks"` igual à saída de `--checks-obrigatorios`.

Não mescle com CI vermelho. Para rodar o CI numa branch sem abrir PR:

```bash
Expand Down
13 changes: 10 additions & 3 deletions scripts/qa/ci_invariants.sh
Original file line number Diff line number Diff line change
Expand Up @@ -145,14 +145,21 @@ def check_runner():
for nome_job, job in jobs.items():
if job.get('runs-on') != RUNNER:
falhas.append(f"FINDING-6: {nome_job} roda em {job.get('runs-on')!r}; esperado {RUNNER!r}")
# O snapshot do AVD é específico da imagem do runner: sem a imagem na
# chave, a primeira execução numa imagem nova restauraria o AVD da antiga.
for passo in jobs.get('android-e2e', {}).get('steps', []):
chave = str((passo.get('with') or {}).get('key', ''))
if chave.startswith('avd-') and not chave.endswith(f'-{RUNNER}'):
falhas.append(f'FINDING-6: chave do cache de AVD {chave!r} não termina em -{RUNNER}')


# Checks obrigatórios para merge em main e develop (FINDING-5). O
# android-e2e fica de fora enquanto não tiver histórico verde: torná-lo
# obrigatório hoje travaria toda PR num job sabidamente instável (FINDING-4).
# A proteção de branch é aplicada a partir desta lista (--checks-obrigatorios),
# então renomear um job quebra aqui antes de deixar PRs esperando por um check
# que não existe mais.
# A proteção de branch é aplicada a partir desta lista (--checks-obrigatorios).
# Este script não lê a proteção configurada no GitHub: ao renomear ou criar um
# job, reaplique-a (ver CONTRIBUTING.md › CI e merge), senão PRs esperam por um
# check que não existe mais.
CHECKS_OBRIGATORIOS = sorted(JOBS_DOCUMENTADOS - {'android-e2e'})
# App GitHub Actions: amarrar o check ao app impede que outra integração
# publique um status com o mesmo nome e destrave o merge.
Expand Down