وثائق بوابة القرار

تقييم بوابة حتمي وقابل لإعادة التشغيل مع قرارات قابلة للتدقيق.

وثائق Asset Core

بوابة إصدار 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
  • السياسة: يجب أن تكون جميع الشروط صحيحة (And gate)
  • المزود: مزود json المدمج يقرأ حزمة الأدلة
  • التنفيذ: تشغيل سيناريو مباشر (ليس فحصًا مسبقًا) لذا يتم إنتاج حزمة تشغيل

يتم إنشاء السيناريو في وقت التشغيل عن طريق استبدال عناصر النمط:

  • {{SCENARIO_ID}} -> معرف السيناريو الفريد
  • {{EVIDENCE_FILE}} -> المسار النسبي لحزمة الأدلة (داخل جذر مزود json)

كيف يعمل في CI

تقوم سير العمل للإصدار بتنفيذ التسلسل التالي:

  1. يقوم بتشغيل فحوصات CI (fmt، clippy، الاختبارات، deny، التعبئة، اختبار الدخان).
  2. Generates release supply-chain evidence with scripts/ci/supply_chain_generate.sh (الموضوعات، SBOMs، الأصل، التوقيعات بدون مفتاح، آثار الثغرات).
  3. Verifies supply-chain evidence with scripts/ci/supply_chain_verify.sh as a بوابة صعبة.
  4. Writes the Decision Gate release evidence bundle, including the new تحقق سلسلة التوريد البوليانية.
  5. Starts a local MCP server with configs/presets/ci-release-gate.toml (optionally adding --json-root <evidence-root> and --json-root-id <root-id>).
  6. يقيم السيناريو باستخدام مجموعة الأدلة.
  7. يصدر ويتحقق من حزمة التشغيل.
  8. 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: بيان تشغيل حتمي للـ runpack
  • runpack_verify.json: مخرجات التحقق من runpack
  • Docs/architecture/decision_gate_ci_and_workflow_architecture.md
  • configs/ci/release_gate_scenario.json
  • scripts/ci/ci_release_gate.sh