Puerta de Liberación CI Dogfooding
Esta guía documenta cómo Decision Gate gestiona su propio proceso de liberación al restringir la elegibilidad de lanzamiento utilizando evidencia CI determinista. El objetivo es demostrar una capa de política real y auditable sin reemplazar el sistema CI.
Por Qué Esto Es Rigurosamente
- Separation of concerns: CI executes tests; Decision Gate evaluates the política y emite una decisión determinista.
- Evidence-driven: The decision is based on a versioned evidence bundle en lugar de registros de CI implícitos.
- Auditable output: Decision Gate exports a runpack with the full decision datos de seguimiento y verificación.
- Determinista: El mismo conjunto de evidencia produce la misma decisión.
Qué es Gated
El flujo de trabajo de la etiqueta de lanzamiento valida que un lanzamiento es elegible en función de:
- Formateo, lint y pruebas unitarias
- Pruebas del sistema P0 y P1
cargo-deny- Verificaciones de deriva del generador
- Cobertura completa de SBOM para cada lanzamiento sujeto
- Verificación de la atestación de procedencia para cada sujeto de lanzamiento
- Verificación de firma OIDC sin clave para cargas útiles de artefactos y procedencia
- Política de vulnerabilidad bloqueada (
Alta/Críticabloqueada + KEV bloqueado en cualquier severidad) - Ejecuciones de prueba de empaquetado (Python + TypeScript)
- Prueba de humo de Docker
- Consistencia de etiqueta/version (la etiqueta coincide con la versión del espacio de trabajo)
Si falta algún requisito o es falso, la puerta niega la liberación.
Paquete de Evidencia
El flujo de trabajo de liberación escribe un paquete de evidencia JSON en una raíz de espacio de trabajo de evidencia y lo evalúa a través de una ruta de archivo relativa a la raíz. El ejemplo predeterminado es ./evidence/release_evidence.json (relativo a la raíz del repositorio), pero la raíz se puede anular en tiempo de ejecución con --json-root.
Ejemplo (solo 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
}
}
Escenario de Política
La puerta de liberación se expresa como un escenario estándar de Decision Gate:
- Plantilla:
configs/ci/release_gate_scenario.json - Política: Todas las condiciones deben ser verdaderas (
Andgate) - Proveedor: el proveedor
jsonincorporado lee el paquete de evidencia - Ejecución: ejecución de escenario en vivo (no prechequeo) por lo que se produce un runpack
El escenario se instancia en tiempo de ejecución al reemplazar los marcadores de posición de la plantilla:
{{SCENARIO_ID}}-> identificador único del escenario{{EVIDENCE_FILE}}-> ruta relativa al paquete de evidencia (dentro de la raíz del proveedorjson)
Cómo se ejecuta en CI
El flujo de trabajo de lanzamiento realiza la siguiente secuencia:
- Ejecuta verificaciones de CI (fmt, clippy, pruebas, denegar, empaquetado, prueba de humo).
- Generates release supply-chain evidence with
scripts/ci/supply_chain_generate.sh(subjectos, SBOMs, procedencia, firmas sin clave, artefactos de vulnerabilidad). - Verifies supply-chain evidence with
scripts/ci/supply_chain_verify.shas a puerta dura. - Writes the Decision Gate release evidence bundle, including the new verificaciones de cadena de suministro booleanas.
- Starts a local MCP server with
configs/presets/ci-release-gate.toml(optionally adding--json-root <evidence-root>and--json-root-id <root-id>). - Evalúa el escenario utilizando el paquete de evidencia.
- Exporta y verifica un runpack.
- Uploads artifacts:
- Conjunto de pruebas
- Runpack
- Paquete de evidencia de la cadena de suministro (SBOM/procedencia/firmas/artifacts de vulnerabilidad)
- Carga útil de decisión y resumen
- Nombre del artefacto:
decision-gate-release-gate
La implementación se encuentra en scripts/ci/ci_release_gate.sh y es llamada por el flujo de trabajo de lanzamiento.
Cómo se Protege la Publicación
La publicación es un flujo de trabajo manual separado (.github/workflows/publish.yml). Antes de que se ejecuten los pasos de publicación, ahora se ejecutan los scripts específicos del objetivo scripts/ci/supply_chain_generate.sh + scripts/ci/supply_chain_verify.sh para el objetivo de publicación seleccionado. También verifica que el flujo de trabajo de liberación de la etiqueta se haya completado con éxito, por lo que la publicación no puede proceder sin ambos:
- aprobación, elegibilidad para la liberación auditada de Decision Gate; y
- pasando la verificación de la cadena de suministro para los artefactos objetivo.
Ejecutando Localmente
Puedes ejecutar el mismo gate de lanzamiento localmente con un paquete de evidencia personalizado:
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 verificación es falsa, el script sale con un código distinto de cero y el resumen de decisiones mostrará la razón de la denegación.
Para ejecutar la generación + verificación de la cadena de suministro de paridad de lanzamiento local antes de la evaluación de la puerta:
bash scripts/ci/verify_all.sh --release-parity
Artefactos a Inspeccionar
decision_payload.json: carga útil de respuesta cruda del Decision Gatedecision_summary.json: tipo de decisión + permitir/negarrunpack/manifest.json: manifiesto de runpack deterministarunpack_verify.json: salida de verificación de runpack
Referencias Relacionadas
Docs/architecture/decision_gate_ci_and_workflow_architecture.mdconfigs/ci/release_gate_scenario.jsonscripts/ci/ci_release_gate.sh