العربية
  • github
  • التشغيل الآلي

إعادة تشغيل سير عمل GitHub تلقائيًا بعد الفشل

في بعض الأحيان، يكون سير العمل في GitHub Actions مزاجيًا ويفشل لأسباب عشوائية. دعونا نرى كيف يمكنك إعادة تشغيله تلقائيًا لتوفير الوقت.

Gao
Gao
Founder

المقدمة

نحن نحب GitHub Actions. إنها قوية وتوفر طبقة مجانية سخية.

مع نمو مشروعنا، أضفنا المزيد والمزيد من اختبارات التكامل لتشغيلها في سير عمل GitHub Actions لدينا. مثل المشاريع الرائعة الأخرى، نقوم بتشغيل اختباراتنا لكل طلب سحب، دفع، وإصدار.

ومع ذلك، نظرًا لطبيعة اختبارات التكامل، في بعض الأحيان يفشل سير العمل لأسباب عشوائية. يمكن أن يكون مشكلة في الشبكة، أو عطل في المتصفح، أو لأسباب أخرى يصعب تكرارها.

عندما يفشل سير العمل، علينا إعادة تشغيله يدويًا. في البداية، الأمر ليس مشكلة كبيرة، ولكنه لا يزال مزعجًا للمطورين ذوي الكفاءة العالية مثلنا.

كيفية العمل

في وقت كتابة هذا، لا يوفر GitHub Actions طريقة مدمجة لإعادة تشغيل سير العمل الفاشل تلقائيًا. لذلك دعونا نفصل الأمر ونرى كيف يمكننا تحقيق ذلك.

عندما لا يعمل سير العمل وقد فشل، يمكنك إعادة تشغيله يدويًا بالنقر على زر "إعادة تشغيل الوظائف". سيفتح قائمة منسدلة، ويوفر خيارًا رائعًا "إعادة تشغيل الوظائف الفاشلة" لتخطي الوظائف الناجحة.

الفكرة بسيطة:

  1. نحتاج إلى اكتشاف متى يفشل سير العمل.
  2. نحتاج إلى تفعيل إجراء إعادة التشغيل بعد اكتمال سير العمل.

بوضوح، لا يمكننا القيام بذلك في نفس سير العمل لأن سير العمل لا يمكنه القيام بأي شيء عند عدم تشغيله. لذلك نحتاج إلى سير عمل آخر لمراقبة حالة سير العمل السابق وتفعيل إجراء إعادة التشغيل. يمكن توضيح ذلك كما يلي:

تحديث سير العمل الخاص بك

قم بإنشاء ملف سير عمل جديد في المستودع الخاص بك، على سبيل المثال، .github/workflows/rerun.yml:

بفضل GitHub CLI، يمكننا بسهولة مراقبة حالة سير العمل وإعادة تشغيلها بأمرين بسيطين:

  • gh run watch لمراقبة حالة سير العمل (وثائق هنا).
  • gh run rerun لإعادة تشغيل سير العمل. ستقوم العلامة --failed بإعادة تشغيل الوظائف التي فشلت فقط (وثائق هنا).

كل ما عليك فعله هو توفير run_id لسير العمل الفاشل ويمكن القيام بذلك باستخدام سياق github.run_id. على سبيل المثال، يمكنك تفعيل سير العمل لإعادة التشغيل بإضافة الخطوة التالية إلى سير العمل الأصلي الخاص بك:

ستقوم شرط if: failure() بتفعيل الخطوة فقط عندما تفشل الوظيفة. ستقوم شرط fromJSON(github.run_attempt) < 3 بإعادة تشغيل المحاولتين الأوليين فقط. يمكنك ضبط العدد وفقًا لاحتياجاتك.

تستخدم هذه الخطوة الأمر gh workflow run لتفعيل سير العمل لإعادة التشغيل. اطلع على الوثائق لمزيد من التفاصيل.

المكافأة: تشغيل سير العمل لإعادة التشغيل من الفرع الذي فشل

إذا كنت تريد تشغيل سير العمل لإعادة التشغيل من الفرع الذي فشل، بدلاً من الفرع الافتراضي، يمكنك استخدام الأمر التالي:

سيتم استخدام سياق github.head_ref إذا كان طلب سحب، وإلا سيتم استخدام github.ref_name.

الشكر

فكرة هذا النهج في الأصل من هذا التعليق في مناقشة GitHub.