بوابة إصدار CI للاختبار الداخلي
هذا الدليل يوثق كيفية قيام Decision Gate بتحديد مؤهلات الإصدار من خلال استخدام أدلة CI الحتمية. الهدف هو إظهار طبقة سياسة حقيقية وقابلة للتدقيق دون استبدال نظام CI.
لماذا هذا صارم
- Separation of concerns: CI executes tests; Decision Gate evaluates the سياسة وتصدر قرارًا حتميًا.
- Evidence-driven: The decision is based on a versioned evidence bundle بدلاً من سجلات CI الضمنية.
- Auditable output: Decision Gate exports a runpack with the full decision بيانات المسار والتحقق.
- حتمي: نفس مجموعة الأدلة تؤدي إلى نفس القرار.
ما هو Gated
تتحقق عملية تدفق علامة الإصدار من أن الإصدار مؤهل بناءً على:
- التنسيق، والتحقق من الأخطاء، واختبارات الوحدة
- اختبارات النظام P0 و P1
cargo-deny- فحوصات انحراف المولد
- تغطية كاملة لـ SBOM لكل إصدار موضوع
- التحقق من شهادة الأصل لكل إصدار موضوع
- التحقق من توقيع OIDC بدون مفتاح لحمولات الأثر والأصل
- سياسة الثغرات تمر (
عالية/حرجةمحجوبة + KEV محجوبة بأي شدة) - تشغيلات التعبئة الجافة (Python + TypeScript)
- اختبار دخان Docker
- اتساق العلامة/الإصدار (تتطابق العلامة مع إصدار مساحة العمل)
إذا كان هناك أي متطلب مفقود أو خاطئ، فإن البوابة ترفض الإفراج.
حزمة الأدلة
تكتب سير عمل الإصدار حزمة أدلة JSON إلى مساحة عمل الأدلة الجذرية وتقوم بتقييمها عبر مسار ملف نسبي للجذر. المثال الافتراضي هو ./evidence/release_evidence.json (نسبيًا لجذر المستودع)، ولكن يمكن تجاوز الجذر في وقت التشغيل باستخدام --json-root.
مثال (شكل فقط):
{
"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
}
}
سيناريو السياسة
تُعبر بوابة الإصدار كسيناريو قياسي لبوابة القرار:
- القالب:
configs/ci/release_gate_scenario.json - السياسة: يجب أن تكون جميع الشروط صحيحة (
Andgate) - المزود: مزود
jsonالمدمج يقرأ حزمة الأدلة - التنفيذ: تشغيل سيناريو مباشر (ليس فحصًا مسبقًا) لذا يتم إنتاج حزمة تشغيل
يتم إنشاء السيناريو في وقت التشغيل عن طريق استبدال عناصر النمط:
{{SCENARIO_ID}}-> معرف السيناريو الفريد{{EVIDENCE_FILE}}-> المسار النسبي لحزمة الأدلة (داخل جذر مزودjson)
كيف يعمل في CI
تقوم سير العمل للإصدار بتنفيذ التسلسل التالي:
- يقوم بتشغيل فحوصات CI (fmt، clippy، الاختبارات، deny، التعبئة، اختبار الدخان).
- Generates release supply-chain evidence with
scripts/ci/supply_chain_generate.sh(الموضوعات، SBOMs، الأصل، التوقيعات بدون مفتاح، آثار الثغرات). - Verifies supply-chain evidence with
scripts/ci/supply_chain_verify.shas a بوابة صعبة. - Writes the Decision Gate release evidence bundle, including the new تحقق سلسلة التوريد البوليانية.
- Starts a local MCP server with
configs/presets/ci-release-gate.toml(optionally adding--json-root <evidence-root>and--json-root-id <root-id>). - يقيم السيناريو باستخدام مجموعة الأدلة.
- يصدر ويتحقق من حزمة التشغيل.
- Uploads artifacts:
- مجموعة الأدلة
- رانباك
- حزمة أدلة سلسلة التوريد (SBOM/الأصل/التوقيعات/آثار الثغرات)
- حمولة القرار والملخص
- اسم الأداة:
decision-gate-release-gate
تنفذ العملية في scripts/ci/ci_release_gate.sh ويتم استدعاؤها بواسطة سير عمل الإصدار.
كيف يتم حماية النشر
النشر هو سير عمل يدوي منفصل (.github/workflows/publish.yml). قبل تنفيذ خطوات النشر، يتم الآن تشغيل scripts/ci/supply_chain_generate.sh + scripts/ci/supply_chain_verify.sh المستهدفة للهدف المحدد. كما يتحقق أيضًا من أن سير عمل إصدار العلامة قد اكتمل بنجاح، لذا لا يمكن أن يستمر النشر بدون كلاهما:
- اجتياز، تدقيق أهلية إصدار Decision Gate؛ و
- اجتياز التحقق من سلسلة التوريد للقطع المستهدفة.
التشغيل محليًا
يمكنك تشغيل نفس بوابة الإصدار محليًا مع حزمة أدلة مخصصة:
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
إذا كانت أي فحص غير صحيح، يخرج البرنامج برمز غير صفري وستظهر ملخص القرار سبب الرفض.
لتشغيل توليد سلسلة التوريد المتوازية المحلية + التحقق قبل تقييم البوابة:
bash scripts/ci/verify_all.sh --release-parity
العناصر التي يجب فحصها
decision_payload.json: حمولة استجابة بوابة القرار الخامdecision_summary.json: نوع القرار + السماح/الرفضrunpack/manifest.json: بيان تشغيل حتمي للـ runpackrunpack_verify.json: مخرجات التحقق من runpack
المراجع ذات الصلة
Docs/architecture/decision_gate_ci_and_workflow_architecture.mdconfigs/ci/release_gate_scenario.jsonscripts/ci/ci_release_gate.sh