Aquesta guia documenta com Decision Gate controla la seva pròpia admissibilitat de llançament mitjançant proves CI deterministes. L’objectiu és demostrar una capa de política real i auditable sense substituir el sistema CI.
Per què això és rigorós
- Separació de preocupacions: CI executa proves; el Decision Gate avalua la política i emet una decisió determinista.
- Basat en evidències: La decisió es basa en un paquet d’evidències versionat en lloc de registres de CI implícits.
- Sortida auditable: El Decision Gate exporta un paquet d’execució que conté la ruta de decisió actual i metadades d’integritat. La verificació del paquet d’execució no estableix per si mateixa la reproducció semàntica, l’autenticitat de l’evidència, la correcció de la història acceptada, el vincle extern o la no repudiació.
- Determinista: El mateix paquet d’evidències produeix la mateixa decisió.
Què és Gated
El flux de treball de l’etiqueta de llançament valida que un llançament és elegible en funció de:
- Formatatge, lint i proves d’unitat
- Prioritats de la prova del sistema
P0iP1(no fases de full de ruta) cargo-deny- Comprovacions de deriva del generador
- Cobertura SBOM completa per a cada subjecte de llançament
- Verificació de l’atestació de procedència per a cada subjecte de llançament
- Verificació de signatura OIDC sense clau per a càrregues d’artifacts i procedència
- Política de vulnerabilitat bloquejada (
High/Criticalbloquejada + KEV bloquejat a qualsevol severitat) - Proves de packaging (Python + TypeScript)
- Prova de fum de Docker
- Consistència de la etiqueta/versió (l’etiqueta coincideix amb la versió de l’espai de treball)
Si falta o és fals qualsevol requisit, la porta nega la seva alliberament.
Paquet d’Evidències
El flux de treball de llançament escriu un paquet d’evidència JSON i valida cada camp requerit com un boolean exacte. El wrapper construeix un registre tipat hostil i el presenta directament per la condició exacta sota l’autoritat del cridant derivada de límits i el temps de recepció. DG admet aquest registre contra el domini de registre tancat exacte i la política d’ús d’evidència; no s’accepta cap vinculació fictícia del cridant, JSON dinàmic, o condició vinculada al proveïdor dins la llei de l’escenari validat.
Exemple (només forma):
{
"release": {
"tag": "v0.1.0",
"version": "0.1.0",
"tag_matches_version": true,
"sha": "<git sha>",
"generated_at": 1710000000000,
"sbom_path": ".tmp/ci/sbom/decision-gate.sbom.spdx.json"
},
"checks": {
"fmt": true,
"clippy": true,
"cargo_deny": true,
"generate_all": true,
"unit_tests": true,
"system_tests_p0": true,
"system_tests_p1": true,
"sbom": true,
"sbom_complete": true,
"sbom_verified": true,
"provenance_verified": true,
"signature_verified": true,
"vuln_policy_pass": true,
"package_dry_run": true,
"docker_smoke": true
}
}
Escenari de Política
La porta de sortida s’expressa com un escenari estàndard de Decision Gate:
- Plantilla:
configs/ci/release_gate_scenario.json - Política: Totes les condicions han de ser certes (un requisit complet RET
And) - Adquisició: una presentació de cridada amb atributs de frontera apunta a la condició exacta directament.
- Execució: execució de l’escenari en viu (no precomprovació) de manera que es produeixi un runpack
L’escenari s’instancia en temps d’execució substituint els marcadors de posició de la plantilla:
{{SCENARIO_ID}}-> identificador únic de l’escenari
Com s’executa en CI
El flux de treball de publicació realitza la següent seqüència:
- Executa comprovacions CI (fmt, clippy, proves, deny, empaquetatge, prova de fum).
- Genera evidència de la cadena de subministrament de llançament amb
scripts/ci/supply_chain_generate.sh(subjectes, SBOMs, procedència, signatures sense clau, artefactes de vulnerabilitat). - Verifica l’evidència de la cadena de subministrament amb
scripts/ci/supply_chain_verify.shcom a un control rigorós. - Escriu el paquet d’evidències de llançament del Decision Gate, incloent els nous booleans de verificació de la cadena de subministrament.
- Valida i projecta els booleans requerits, després inicia un servidor MCP local
amb
configs/presets/ci-release-gate.tomli la seva exacta llista blanca de claus d’entorn. - Avalua l’escenari utilitzant el paquet d’evidències.
- Exporta i verifica un runpack.
- Carrega els artefactes:
- Conjunt d’evidències
- Runpack
- Paquet d’evidències de la cadena de subministrament (SBOM/provinença/signatures/artifacts de vulnerabilitat)
- Payload de decisió i resum
- Nom de l’artifact:
decision-gate-release-gate
La implementació es troba a scripts/ci/ci_release_gate.sh i és cridada pel flux de treball de llançament.
Postura de Distribució Només Font
Aquest repositori actualment s’atura en llançaments etiquetats, amb prioritat a la font. .github/workflows/release.yml encara genera evidència de llançament auditada, però no hi ha cap flux de treball actiu que publiqui paquets o imatges de contenidors en registres públics.
Això significa que l’eligibilitat per al llançament es manté estricta i reproductible, mentre que la distribució externa requereix una decisió de política futura separada fora del contracte actual de CI.
Executant Localment
Podeu executar la mateixa porta de publicació localment amb un paquet d’evidències personalitzat:
python3 - <<'PY'
import json
from pathlib import Path
Path("evidence/release_evidence.json").write_text(json.dumps({
"release": {
"tag": "v0.1.0",
"version": "0.1.0",
"tag_matches_version": True,
"sha": "local",
"generated_at": 0,
"sbom_path": "evidence/sbom/decision-gate.sbom.spdx.json",
},
"checks": {
"fmt": True,
"clippy": True,
"cargo_deny": True,
"generate_all": True,
"unit_tests": True,
"system_tests_p0": True,
"system_tests_p1": True,
"sbom": True,
"package_dry_run": True,
"docker_smoke": True,
},
}, indent=2))
PY
bash scripts/ci/ci_release_gate.sh \
--evidence-file evidence/release_evidence.json \
--output-dir evidence/release-runpack \
--config configs/presets/ci-release-gate.toml
Si alguna comprovació és falsa, l’script surt amb un codi diferent de zero i el resum de la decisió mostrarà el motiu de la denegació.
Per executar la generació + verificació de la cadena de subministrament amb paritat de versió local abans de l’avaluació de la porta:
bash scripts/ci/verify_all.sh --release-parity
Artefactes a Inspeccionar
decision_payload.json: càrrega útil de resposta del Decision Gate en brutdecision_summary.json: tipus de decisió + permetre/denegarrunpack/manifest.json: manifest de runpack deterministarunpack_verify.json: sortida de verificació de runpack
Referències relacionades
Docs/architecture/decision_gate_ci_and_workflow_architecture.mdconfigs/ci/release_gate_scenario.jsonscripts/ci/ci_release_gate.sh