
Andrew Hanna

Andrew Hanna

علشان تجهّز خط CI/CD لـ Salesforce باستخدام GitHub Actions، بتخزّن الميتاداتا بتاعتك
في Git بصيغة source format، وبتصادق GitHub مع الـ org عن طريق Connected App قائم على
JWT، وبتضيف workflow بيتحقّق من التغييرات عند كل pull request وبينشرها عند الدمج. الخط
كله بيعيش في ملف YAML واحد جوه .github/workflows وبيشتغل على Salesforce
CLI. الدليل ده بيمشي بالطريقة الحديثة (sf v2)، وبعدين بيحدد الأجزاء اللي بتتكسر بهدوء
في الإنتاج. وهو جزء من مكتبة SF Guides بتاعتنا على
/serpent/resources.
الخط الشغّال بيفترض إن كام حاجة موجودة أصلًا:
force-app بصيغة source format، ومعمولها commit في ريبو GitHub.
sf). الأداة القديمة
sfdx اتوقفت، فابنِ على sf.
لو الميتاداتا بتاعتك لسه مش في Git، الهجرة دي بتيجي الأول. بنغطّي ميكانيكا الـ branching والبيئات في دليلنا المصاحب لبناء خط CI/CD لـ Salesforce باستخدام GitHub Actions.
استخدم JWT Bearer Flow. ده headless، مش محتاج تسجيل دخول تفاعلي، وهو اللي Salesforce بترشّحه لـ CI. ولّد زوج مفاتيح، ارفع الشهادة لـ Connected App، وبعدين سجّل دخول من الـ runner بالمفتاح الخاص.
openssl genrsa -out server.key 2048 وبعدين
openssl req -new -x509 -nodes -sha256 -days 365 -key server.key -out
server.crt.
server.crt.
server.key ومفتاح الـ consumer واسم المستخدم و instance URL كـ
GitHub repository secrets، وأبدًا مش في الـ YAML.
sf org login jwt --client-id $SF_CONSUMER_KEY --jwt-key-file server.key
--username $SF_USERNAME --instance-url $SF_INSTANCE_URL --set-default-org.
النمط الأساسي هو workflow واحد بسلوكين، حسب الـ event. اتحقّق عند pull request علشان مايتدمجش حاجة هتفشل؛ وانشر فعليًا لما التغيير يوصل لفرع main.
pull_request ضد main للتحقق،
وpush لـ main للنشر.
sf project deploy validate --source-dir force-app --test-level RunLocalTests
--wait 30 --verbose. دي run للفحص بس، فمفيش حاجة بتتكتب في الـ org.
sf project deploy start --source-dir force-app --test-level RunLocalTests --wait
30 --verbose.
استخدم شرط if: على كل job علشان نفس الملف يتعامل مع الحدثين. تشغيل
الاختبارات المحلية عند التحقق هو اللي بيخلّي ده بوابة حقيقية مش مجرد ختم، وهو العمود
الفقري لأي
خط أتمتة اختبارات Salesforce في CI
جاد.
نشر مجلد force-app بالكامل كل مرة بطيء وبيبقى أسوأ كل ما الريبو يكبر.
أداة المجتمع sfdx-git-delta بتحسب الفرق بين commit-ين وبتنتج حزمة
فيها الميتاداتا اللي اتغيّرت بس:
sf sgd source delta --to HEAD --from HEAD~1 --output delta --generate-delta
--source-dir force-app
بعد كده بتوجّه أمر النشر لمجلد الـ delta. بيقلل وقت النشر بشكل كبير، بس اقرأ القسم اللي جاي قبل ما تثق فيه بشكل أعمى.
أغلب الدروس بتنتهي عند نشر أخضر. المشاكل بتظهر بعدين، وهي السبب اللي بيخلينا نبني أدوات حوالين ده بدل ما نسيب الفرق بملف YAML خام:
لو مش عايز تمتلك الخط ده للأبد، في منصة مُدارة بتتعامل مع الـ delta، والـ destructive changes، وحواف الميتاداتا الجزئية بدالك. شوف إيه اللي Serpent بيغطيه وسعره قبل ما تحط ربع وقت هندسي في واحد منزّل بإيدك.
أستخدم sfdx ولا sf لخط Salesforce على GitHub Actions؟
استخدم sf (Salesforce CLI v2). الأداة القديمة sfdx اتوقفت
ومينفعش تبقى أساس خط جديد.
ليه مصادقة JWT بدل اسم مستخدم وكلمة سر؟
JWT Bearer Flow هو headless ومش محتاج تسجيل دخول تفاعلي ولا مطالبة MFA، وهو اللي الـ CI runner بيحتاجه، وSalesforce بترشّحه للأتمتة.
إيه الفرق بين deploy validate وdeploy start؟
Validate هو run للفحص بس بيتأكد ويشغّل الاختبارات من غير ما يغيّر الـ org، مثالي عند الـ pull requests؛ وstart بيعمل النشر الفعلي عند الدمج.
محتاج sfdx-git-delta؟
لأ، بس بيستاهل أول ما النشر يبقى بطيء. بس اقرنه بخطوة destructive-changes علشان الحذف يتعالج، مش يتخطّى بهدوء.
بدون التزام.