ci-github-actions
CI/CD do AS v2 (GitHub Actions). Use ao editar workflows, destravar checks [required], preparar PR para o staging gate, debugar CI vermelha, ou mexer no deploy. Cobre os gates obrigatorios, os 3 marcadores do staging-gate, pytest --no-migrations e os flakes recorrentes.
- License 许可
- Apache-2.0
- 最近更新
- 2026-11-11
- Stars
- ★ 0
- Forks
- 0
01 前言 Front Matter
- name
- ci-github-actions
- description
- CI/CD do AS v2 (GitHub Actions). Use ao editar workflows, destravar checks [required], preparar PR para o staging gate, debugar CI vermelha, ou mexer no deploy. Cobre os gates obrigatorios, os 3 marcadores do staging-gate, pytest --no-migrations e os flakes recorrentes.
02 资源文件 4
- 参考文档reference/workflows.md5.0 KB
- 参考文档references/hook-survey.md2.3 KB
- 参考文档references/telemetry-blinding.md2.8 KB
- 参考文档references/unhook-techniques.md2.2 KB
03 SKILL.md 正文
CI/CD — Aprender Sistema v2 (GitHub Actions)
Merge na
mainNÃO deploya (ADR-018, 2026-07-10). O merge produz um artefato assinado e promovível; produção só muda por promoção humana (promote.yml+ Environmentproduction). CI verde continua não sendo burocracia — é o que decide se existe artefato promovível."Merge naera o ADR-010, revogado: os jobsmain= deploy direto pra prod via Portainer"deployevalidate_existing_tagforam deletados no #1516. SSOT do fluxo:v2/docs/specs/infra/ci.spec.md. Detalhe por-workflow: reference/workflows.md.
Arquitetura
ci.yamlorquestra o backend:backend-impactdecide se a suíte roda (PR sem impacto em backend pula os jobs pesados); chama o reusable_backend-test.ymlparabackend-tests-coreebackend-tests-devtools(-n auto --dist loadscope; o agregador[required]ébackend tests (runner)), fazcoverage combine(gate ≥85%) e rodabackend-migrate-integrity.frontend-ci.yml: build/lint, react-doctor (exige--offline), checklist (meta/a11y/security),[info] e2e journeys.- Segurança/infra:
security-scan.yml,dependency-review-scorecard.yml,strict-security-headers.yml,architecture-guardrails.yml,docs-quality.yml,staging-gate-audit.yml. deploy.yaml(Build, sign and release): pós-merge, não deploya — build/scan/push + cosign + tag/release. Prod muda porpromote.yml(gateproduction) + agente pull-based na VM01 (ADR-018).- Monitoramento agendado (não bloqueia):
backend-xdist-canary.yml.
Checks [required] (precisam estar verdes p/ merge)
backend impact · backend tests (runner) · backend typecheck (pyright) · backend rbac-lint · docker parity (backend) · tests (agregador) · docs quality (links + frontmatter) · staging gate evidence · lint · build/lint do frontend · checklist tests · react doctor quality gate · Container Scan · Secret Detection · Python/Frontend Dependencies · dependency review.
Se
backend-impactderbackend_changed=false, os jobs de teste backend ficam skipping (correto p/ PR que não tocav2/backend/) e o agregadortestsfica verde.
Procedimento: deixar um PR verde
- Localize a falha:
gh run view <id> --log-failed(ough pr checks <PR>). - Reproduza local (CP-01, Docker):
docker exec aprender_dev-web-1 pytest apps/core/tests/ -q; pyright viacd v2/backend && pyright apps/core config; lint com black+isort+flake8 nos arquivos tocados. - Staging gate (se tocar runtime de backend, frontend
src//public/ou compose/Dockerfile de infra): ver abaixo — exige marcadores literais no corpo do PR. - Base mudou →
gh pr update-branch <PR>e esperar o re-run (~5-15min) antes de mergear; "N of N required checks expected" some sozinho. - Done quando:
gh pr view <PR> --json mergeStateStatus=CLEANe 0 checksFAILURE/pending.
Staging gate — marcadores EXATOS (literais)
staging-gate-audit.yml roda em todo PR para main (sem filtro de paths:); o script v2/infra/scripts/staging-gate-scope.sh (SSOT do escopo) exige os marcadores quando o PR muda runtime: v2/backend/{apps/,config/,requirements.txt}, v2/frontend/{src/,public/,Dockerfile.prod} ou v2/infra/{docker-compose*.yml,Dockerfile*,scripts/smoke_test_staging.sh}, descontados os arquivos só de teste (tests/, __tests__/, test_*.py, conftest*.py, *.test|spec.*). PR só de frontend src/ exige; PR só de ci.yaml/_backend-test.yml/docs não. Quando exige, cobra no corpo do PR os 3 marcadores literais (regex sem acento):
- [x] make staging-full executado com sucesso (8/8 PASS)- [x] Evidencia anexada no PR← "Evidencia" SEM acento- texto
ALL 8 CHECKS PASSED
Checkboxes precisam estar marcados (- [x]). Editar o body re-roda o gate (on: edited). PR draft pula o gate.
Procedimento: levar uma versão a produção
- Merge na
main→deploy.yamlbuilda, escaneia e faz push das imagens, dispara osign(cosign keyless + SLSA) e gera a tag imutávelvYYYY.MM.DD-<sha7>+ GitHub Release.gh release list --limit 3mostra a tag. A tag não prova assinatura:tag_and_releasetemneeds: [prepare, build_and_push]e osignestá fora doneedse fora doif(.github/workflows/deploy.yaml:231-235) — tag e Release nascem mesmo com osignfalhando. O gate duro de assinatura é opromote.yml(.github/workflows/promote.yml:139, “Gate duro — imagens DEVEM estar assinadas (cosign)”), e o agente da VM01 recusa digest que não passe nocosign verify. - Promover:
gh workflow run promote.yml -f release=v2026.MM.DD-<sha7>. - Aprovar no GitHub Environment
production(required reviewer). Enquanto isso o run ficastatus: waiting— não é falha. - A VM01 puxa (systemd, ~60s) e aplica por digest; o
PUTé doaprender-applierem127.0.0.1:9443. Cada degrau é fail-closed —REFUSEsignifica que produção não mudou. - Verificar:
/api/version/devolve a release (tag), não o digest — payload{"version": ...}, comgit_sha/build_datesó parais_staff(v2/backend/apps/core/views_health.py:93-99). Compare com oreleasedoproduction.json; mais/api/readyz/. A cor do job não é evidência.
Rollback = promover a tag anterior com -f rollback=true (ainda exige sequence > selo). Não existe deploy.yaml -f rollback_tag=..., e não há auto-rollback — migrations são forward-only.
Gotchas recorrentes (já nos morderam)
pytest --no-migrationsno gate (M4 #1404): seeds RBAC vêm de fixtures (ensure_base_groups+seed_functional_permissions), não das RunPython. Testes que exercitam data-migrations levam@pytest.mark.migrationse rodam no jobbackend-migrate-integrity.blob unknown to registryno buildx--push= flake transitório do Docker Hub;gh run rerun <id> --failed. Prod intacta (nem foi tocada).- Rajada de merges = N builds, não N deploys. Nenhum deles muda produção; o que interessa é a tag do HEAD existir e estar assinada.
"alguns falhamera do jobcurl 28no Portainer 9443 mas o último vence"deploy, deletado (#1516) — o false-red do:9443deixou de aparecer no CI porque a confirmação passou a ser feita de dentro da VM. promote.ymlparado emwaiting= gate do Environmentproductionesperando reviewer. Não é falha de CI.REFUSE compose_driftno applier =docker-compose.prod.ymlmudou sem re-captura dotrust/compose.pinned.ymlna VM. É o comportamento desejado, não um bug.- Gate Trivy travando por CVE de SO (não da app): cache-bust do
apt/apk upgradeporGIT_SHAnoDockerfile.prod(#1407). - Codecov: upload só roda
if: env.CODECOV_TOKEN != ''(tokenless é rejeitado) — sem o secret, é pulado; cobertura é enforçada no gate, não no Codecov. - react-doctor: score depende de telemetria remota → exige
--offlinepara ser determinístico. - Duração de job: medir sob demanda (
gh run list --workflow <arquivo> --event pull_request+gh run view <id> --json jobs). A telemetria agendada foi removida: 38 execuções vermelhas seguidas sem ação, e a janela congelou quando o gatilhopushsaiu.
NÃO fazer
- Nunca
git pushdireto namain(CP-07, enforce por hook) — sempre branch + PR. - Nunca
systemctl restart dockerna VM01 (Kaspersky/KESL derruba o site) — usarsystemctl restart kesl. - Mudança em
docker-compose.prod.ymlnão viaja pelo pipeline: exige update manual no Editor do Portainer e re-captura dotrust/compose.pinned.ymlna VM01 (o applier reenvia o pinado, e recusa se o vivo divergir). - Nunca tratar merge na
maincomo deploy, nem procurar um jobdeploynodeploy.yaml— ele não existe desde o #1516.
Projetar um check novo
Esta skill cobre operar o CI. Para decidir se um check novo bloqueia, avisa
ou usa ratchet — e para provar que ele não pode ser contornado — use
gate-calibration.
Dois fatos deste repo que a calibragem precisa saber:
[required]no nome não é enforcement. Medido em 2026-08-26: 19 jobs declaram, o ruleset damainexige 10.check_required_checks.pyexpõe a divergência em todo PR; promover é ação de admin.- Cron não é visto.
ci-runtime-telemetry(já removido) falhou 26 execuções seguidas sem ninguém notar — éschedule-only e não aparece em PR nenhum.
04 同仓库更多 Skills
writing-standards
Apply AS v2 technical-writing standards (clarity, brevity, active voice, Python/Django conventions). Use when writing a README, a docstring (PEP 257), a commit message, a PR description, an error message, or any technical doc.
verification-gate
Verify before claiming success. Use when about to say something works/is done, after implementing a feature, after a bugfix, or before pushing — run the proof command and confirm output first.
test-driven-development
Write the failing test before the implementation in AS v2 (pytest + Django/DRF). Use when implementing a feature or fixing a bug, before any production code is written.
subagent-development
Orquestra subagents no AS v2 — decompõe a tarefa em domínios independentes, paraleliza e revisa em 2 estágios. Use ao delegar exploração, implementação ou validação cross-arquivo para acelerar o trabalho e poupar o contexto principal.
security-scan
Automated security scanning for AS v2. Use before commits or when reviewing changes for vulnerabilities. Runs dependency audit (pip-audit, npm audit), secret detection (grep patterns), and code pattern scanning (SQL injection, XSS, eval, pickle, hardcoded secrets). Integrates with project hooks system.
resume-handoff
Resume work from a saved handoff document, validating its state against the current codebase before continuing. Use when resuming work from a saved handoff after a context clear or in a new session (path, session name, or GitHub issue).