
Serpent Team

Andrew Hanna

الإجابة باختصار: خط أنابيب CI/CD لحزم 2GP ينشئ إصدار حزمة عند كل دمج، ويثبت هذا الإصدار في scratch org جديدة، ويشغل الاختبارات عليه، ثم يرقي ما ينجح فقط. خط الأنابيب نفسه خمسة أوامر. أما ما يكسر بناء 2GP بعد شهور فليس خط الأنابيب، بل قرارات النسب (ancestry) والـ namespace التي اتُخذت في الأسبوع الأول.
خمس مراحل بهذا الترتيب:
الفرق المهم: نشر الميتاداتا يثبت أنها تُترجم داخل مؤسسة تملكها. أما تثبيت إصدار حزمة فيثبت أنها تعمل داخل مؤسسة لا تملكها.
شكل خط الأنابيب واحد في الحالتين. أما نتيجة الترقية الخاطئة فليست واحدة: الإصدار المفتوح الذي تندم عليه يمكن استبداله، والإصدار المُدار بعد ترقيته يصبح واجهة عامة إلى الأبد.
sf package version create --package MyPackage --code-coverage
--installation-key-bypass --wait 60، واحتفظ بمعرّف 04t الناتج كمخرج من خط الأنابيب.
sf org create scratch --definition-file config/project-scratch-def.json
--duration-days 1 --wait 10.
sf package install --package 04tXXXX --wait 20 ثم
sf apex run test --test-level RunLocalTests --code-coverage --wait 30.
sf package version promote --package [email protected].
كل ما قبل الخطوة الخامسة يعمل على كل pull request. أما الخطوة الخامسة فتعمل على فرع واحد فقط، خلف موافقة بشرية.
النسب يخص حزم 2GP المُدارة فقط، وهو الموضع الذي تنحرف فيه خطوط الأنابيب الآلية بهدوء. سيلزفورس تشترط أن يكون السلف المحدد هو أعلى رقم إصدار مُرقّى للحزمة، وألا يُدرج كسلف إلا إصدار رُقّي إلى حالة managed-released (Salesforce Developers). ثلاث قواعد تضعها في خط أنابيبك:
"ancestorVersion": "HIGHEST" في sfdx-project.json تضبط
السلف تلقائيا على أعلى إصدار مُرقّى، وهو ما تحتاجه بيئة الـ CI بالضبط. والبدائل رقم
major.minor.patch صريح أو ancestorId.
--skip-ancestor-check، لكن الحزم لا تترقى إلا على امتداد سلسلة النسب،
فأي مشترك على إصدار متروك يفقد مسار الترقية.
وللإصدارات التصحيحية قاعدة خاصة: لا يصلح الـ patch أن يكون سلفا مباشرا لإصدار غير تصحيحي.
sfdx-project.json، وصرّح بالاعتماديات بين الحزم صراحة مع أرقام
إصداراتها.
sf package convert ونقل المشتركين المثبَّتين معها.
RunLocalTests قبل الترقية.
يمكنك تركيب ذلك كله من Salesforce CLI مع GitHub Actions أو Azure Pipelines أو CumulusCI. وSerpent يعطيك نفس خط الأنابيب بلا ملفات YAML: مسارات أصلية لحزم 1GP و2GP والحزم المُدارة، وحل الاعتماديات بين الحزم، وإدارة الإصدارات عبر مؤسسات المشتركين في كل الخطط، مع تجميع مسبق للـ scratch orgs في خطة Scale. تلاقي أدلة بناء وإصدار إضافية في SF Guides.
هل يمكن أتمتة إنشاء حزم 2GP بالكامل؟
نعم. إنشاء الإصدار والتثبيت والاختبار والترقية كلها أوامر CLI، فتعمل الدورة كاملة بلا تدخل. ومع ذلك أبقِ الترقية خلف موافقة بشرية.
ما هو نسب الحزمة في 2GP؟
هو السلسلة المعلنة بين إصدارات الحزمة المُدارة. تحدد مسار الترقية للمشتركين، لأن الحزم لا تترقى إلا على امتداد هذه السلسلة.
هل تحتاج الحزم المفتوحة إلى namespace؟
لا. يمكن إنشاؤها بدونه، ولهذا تناسب المؤسسات الداخلية. أما 2GP المُدارة فتتطلب namespace مسجلا ومرتبطا بالـ Dev Hub.
لماذا يفشل إنشاء إصدار الحزمة بسبب النسب؟
غالبا لأن السلف المذكور ليس إصدارا مُرقّى بحالة managed-released، أو لأن إصدارا تصحيحيا وُضع سلفا لإصدار غير تصحيحي.
هل يرقّي الـ CI كل بناء ناجح؟
لا. الترقية غير قابلة للتراجع عمليا وتحدد السلف التالي، فمكانها فرع الإصدار خلف موافقة، لا كل عملية دمج.
بدون التزام.