From d5502fe33fad2fb3c6f8563bee39ace301bbf29d Mon Sep 17 00:00:00 2001 From: Herbert Rocha Date: Mon, 28 Sep 2026 19:55:58 -0400 Subject: [PATCH] =?UTF-8?q?fix(ci):=20chave=20do=20AVD=20leva=20a=20imagem?= =?UTF-8?q?=20do=20runner;=20documenta=20reaplica=C3=A7=C3=A3o=20da=20prot?= =?UTF-8?q?e=C3=A7=C3=A3o=20(revis=C3=A3o=20final)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .github/workflows/ci.yml | 2 +- CONTRIBUTING.md | 17 +++++++++++++++++ scripts/qa/ci_invariants.sh | 13 ++++++++++--- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 25a13894..3787b7ba 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -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 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b787e609..60579c3a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -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//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 diff --git a/scripts/qa/ci_invariants.sh b/scripts/qa/ci_invariants.sh index 45844c94..9e3fb821 100755 --- a/scripts/qa/ci_invariants.sh +++ b/scripts/qa/ci_invariants.sh @@ -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.