مشكلة قديمة: شروط متعددة تصبح غير مقروءة
في درس الأحداث والمشغّلات تعرّفت على on.schedule بتعبيرات cron، مع تحذير أن التوقيت دائماً UTC. اثنان من التحديثات في GitHub Actions يعالجان تحديداً هذه النقطة ونقطة أخرى مشابهة: قراءة الشروط المتعددة داخل نفس التعبير.
قبل التحديث، تحديد قيمة مختلفة حسب أكثر من شرط كان يعتمد على تعبيرات &&/|| متداخلة يصعب قراءتها مع زيادة عدد الحالات:
# صعب القراءة كلما زادت الحالات
env:
DEPLOY_ENV: ${{ github.ref == 'refs/heads/main' && 'production' || (github.ref == 'refs/heads/staging' && 'staging' || 'development') }}
دالة case() الجديدة
case() تقبل أزواجاً من (شرط، قيمة) بالترتيب، وتُرجع قيمة أول شرط صحيح — والقيمة الأخيرة المفردة (بلا شرط مقابل لها) تُستخدم كقيمة افتراضية إن لم يتحقق أي شرط:
env:
DEPLOY_ENV: ${{ case(
github.ref == 'refs/heads/main', 'production',
github.ref == 'refs/heads/staging', 'staging',
startsWith(github.ref, 'refs/heads/feature/'), 'development',
'unknown'
) }}
في هذا المثال: لو الفرع main فالقيمة production، ولو staging فالقيمة staging، ولو يبدأ بـ feature/ فالقيمة development، وأي حالة أخرى تُعطى unknown كقيمة افتراضية.
💡 استخدم
case()بدل تكديس&&/||بمجرد أن يصبح عندك أكثر من شرطين — القراءة تبقى خطية وواضحة بغض النظر عن عدد الحالات.
جدولة workflows بالمنطقة الزمنية
المشكلة الثانية: on.schedule كان دائماً بتوقيت UTC فقط، فحساب "8 صباحاً بتوقيت الرياض" يعني حساب فرق التوقيت يدوياً وتحديثه مرتين سنوياً في المناطق التي تطبّق التوقيت الصيفي. الآن يمكن إضافة حقل timezone اختياري بجانب cron، بصيغة معرّف IANA القياسي (نفس الصيغة المستخدمة في أغلب لغات البرمجة لمناطق التوقيت):
on:
schedule:
- cron: "0 8 * * 1-5"
timezone: "Asia/Riyadh" # 8 صباحاً بتوقيت الرياض فعلياً، لا UTC
# مقارنة: الطريقة القديمة (يدوية وعرضة للخطأ مع تغيّر التوقيت الصيفي)
on:
schedule:
- cron: "0 5 * * 1-5" # 8 صباحاً بالرياض = 5 صباحاً UTC (بدون توقيت صيفي)
- حقل
timezoneاختياري بالكامل؛ بدونه يبقى السلوك كما كان دائماً (UTC) - القيد القديم على أقصر فاصل ممكن (كل 5 دقائق) يبقى كما هو، لم يتغيّر بإضافة
timezone - لا يزال بإمكان تأخر تشغيل الجدولة بضع دقائق وقت الازدحام على خوادم GitHub — هذا لم يتغيّر أيضاً
⚠️
timezoneيتحكم فقط بلحظة تشغيل الـ workflow المجدول نفسه؛ الطوابع الزمنية (timestamps) داخل سياقات GitHub Actions الأخرى (مثلgithub.event.*) تبقى بصيغة UTC كما كانت دائماً.
🎯 التالي: القطع الأثرية غير المضغوطة الجديدة في GitHub Actions