محتويات الدورة

Jenkins / الحالة المحفوظة والتسليم المضبوط / الدرس 13

تنفيذ CPS وحالة Pipeline القابلة للحفظ

اجعل حالة التنسيق صغيرة وافهم اختلافها عن Groovy العادي.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • شرح غرض تحويل CPS وحدوده.
  • قصر NonCPS على حساب نقي لا يستدعي خطوات.

يمكن للتنفيذ التوقف والحفظ

يستخدم Pipeline تحويل continuation-passing style لكثير من Groovy كي يتوقف حول الخطوات غير المتزامنة ويحفظ حالة تسمح باستئناف مدعوم. يختلف ذلك عن برنامج Groovy قصير يكتمل مباشرة. قد تصبح المتغيرات والكائنات المشار إليها جزءاً من الاستمرار المحفوظ. احفظ في Parcel سجلات بسيطة صغيرة كاسم المرشح وملخص الفحوص، لا شجرة محلل كبيرة أو تياراً مفتوحاً أو مكرراً أو كائن Jenkins حياً. يعتمد السلوك الدقيق على الخطوة والإضافات والمتانة. لا يثبت نجاح الحساب قبل التعليق صلاحية كل الكائنات الباقية للحفظ عند الحد التالي.

يصف خطأ التسلسل الحالة المحتفظ بها

قد يظهر java.io.NotSerializableException عند محاولة حفظ كائن لا يدعم التسلسل. وقد يظهر في خطوة تعليق لاحقة لا عند إنشاء الكائن. تتبع القيم القابلة للوصول عبر الحد. يساعد استخراج القيمة المطلوبة أو تحويل نتيجة المحلل إلى خريطة بسيطة قبل التعليق. لا تخفض المتانة لإخفاء الخطأ؛ قد يخفي ذلك العيب ويضعف التعافي بدلاً من تصحيح الحالة. لذلك احتفظ بتوقيت إنشاء القيمة وتوقيت الحفظ الفاشل معاً، ولا تفترض أن آخر خطوة ظاهرة هي موضع إدخال الكائن غير المناسب.

NonCPS حد حساب ضيق

لا تتحول الطريقة المعلّمة بالطريقة نفسها ويجب ألا تستدعي خطوات غير متزامنة مثل sh وsleep وinput. ليست مفتاح سرعة يحيط مرحلة كاملة. يحتوي المقطع حساب حجم نقي ويعيد قيمة صغيرة؛ يعرض تعليق Jenkins توضيحياً ولا يجمع هنا. راجع مرجع اختلافات CPS للمُنشئات والتجاوزات والإغلاقات والواجهات غير المحولة ولا تفترض تماثل كل ميزة لغوية داخل Pipeline. ينبغي لحد الطريقة أن يوضح البيانات الداخلة والخارجة، وأن يبقي استدعاء خطوات التنسيق في سياقها المدعوم خارج الجسم النقي.

groovy توضيح مساعد NonCPS نقي
@NonCPS
int countFixtureRows(List rows) {
    return rows.size()
}

لا يستدعي الجسم خطوة أو يحتفظ بمورد خارجي. لا يعمل مترجم Groovy أو CPS أو Jenkins، فليس هذا إصلاح تشغيل مثبتاً لاستثناء معين.

فضّل السجلات البسيطة الصريحة

يلخص البرنامج الكامل صفوفاً افتراضية ببيانات JSON صغيرة ويظهر رفض المرمز كائناً معتماً. ليس JSON تسلسل Java أو حفظ CPS، ولذلك تختلف الآلية والرسالة عمداً. المبدأ المفيد تقليل حالة التنسيق إلى بيانات معلومة المعنى. شغّل حساب المجال الكبير بأداة التطبيق على وكيل مصرح وأعد نتيجة محدودة بدلاً من ملء استمرار المتحكم بكل وسيط. لا يثبت رفض Python فشل كائن Groovy معين ولا يثبت قبول JSON نجاح الاستئناف؛ يبقى النموذج دليلاً على تحويل البيانات النقي فقط.

python نموذج تصميم بيانات بسيطة
import json
rows = [{"ok": True}, {"ok": False}, {"ok": True}]
summary = {"total": len(rows), "failed": sum(not r["ok"] for r in rows)}
print(json.dumps(summary, sort_keys=True))
try:
    json.dumps({"opaque": object()})
except TypeError:
    print("opaque value rejected by JSON encoder")
الناتج المتوقع
{"failed": 1, "total": 3}
opaque value rejected by JSON encoder

يوضح Python JSON فقط ولا يعيد استثناء Java أو يتحقق من تسلسلها أو يختبر إعادة Jenkins واستئنافه.

أصلح الحد لا تخف العرض

احفظ سياق التشغيل ومقطع التتبع ذي الصلة وهويات الإضافات والمكتبة وأصغر انتقال يفسر المشكلة. لا تطبع حالة البرنامج المتسلسلة أو الاعتمادات في تشخيص عام. راجع المساعدات التي تعيد كائنات معقدة والإغلاقات التي تلتقط أكثر مما تحتاج. يدعم اختبار نقي محلي منطق التحويل بعد الإصلاح، لكن إثبات CPS والاستئناف يحتاج تمرين Pipeline مصرحاً مناسباً. افصل المستويين في الملاحظات والدليل. يحمي هذا الفصل المراجع من قبول نموذج ناجح بوصفه تجربة لاستمرارية متحكم لم يُشغّل فعلاً.

الأخطاء الشائعة وإصلاحها

يبقى كائن محلل عبر خطوة معلقة.

لماذا يحدث؟
تحتفظ الحالة بقيمة غير مناسبة للحفظ.
كيف تصلحه؟
استخرج نتيجة بسيطة وحرر المعقد قبل التعليق.
كيف تتجنب تكراره؟
راجع التقاط المتغيرات والإغلاقات عبر الحدود.

تحتوي NonCPS استدعاء sh أو input.

لماذا يحدث؟
اختلط الحساب غير المحول بعمليات CPS.
كيف تصلحه؟
اجعلها نقية واستدع الخطوات من السياق المحول المناسب.
كيف تتجنب تكراره؟
راجع اتجاهات الاستدعاء المدعومة.

تُخفض المتانة لإخفاء الخطأ.

لماذا يحدث؟
أخفى تقليل الحفظ العَرَض دون تصحيح الحالة.
كيف تصلحه؟
أصلح البيانات وقيّم المتانة كقرار تعافٍ منفصل.
كيف تتجنب تكراره؟
افصل مراجعة الصحة والأداء.

اختبر فهمك

1. ظهر الإخفاق عند تنفيذ خطوة sleep، بعد أن عمل محلّل بيانات في خطوة سابقة. هل يعني ذلك أن خطوة sleep نفسها معطلة؟

اعرض الحل المشروح

لا. قد يكون التعليق هو الموضع الذي يحاول فيه Jenkins حفظ حالة التنفيذ، وتتضمن هذه الحالة كائناً أنشأه المحلّل في وقت سابق. تتبّع المتغيرات التي ما زالت قابلة للوصول والمراجع التي تلتقطها الإغلاقات، ثم اختزلها إلى بيانات بسيطة مناسبة للحفظ. احتفظ بسياق الإخفاق الأصلي بدلاً من تغيير مدة خطوة sleep أو توقيتها بلا صلة بسبب المشكلة.

2. هل يثبت نجاح JSON نجاة Groovy من إعادة Jenkins؟

اعرض الحل المشروح

لا. يختبر نظام تسلسل ولغة مختلفين ويوضح تصميم البيانات فقط. تحتاج CPS وقابلية استئناف الخطوات والحفظ الفعلي تحققاً مصرحاً مناسباً مستقلاً.

أهم ما تعلمته

  • احفظ بيانات تنسيق صغيرة صريحة.
  • NonCPS لحساب نقي مناسب لا لتنفيذ الخطوات.

المراجع الرسمية