الأتمتة الدورية المُفعَّلة شهريًا لا تعمل كما هو متوقع

حسناً، لقد تحدثتُ اليوم مع موين حول هذه القضية، وقد أشارت إلى أنه ربما يكون هناك خطأ برمجي عند استخدام الخيار الشهري، لأن طول الشهر يختلف من شهر لآخر؟ بالطبع كانت محقة إلى حد ما… :stuck_out_tongue:

على أي حال، قمتُ ببعض البحث الإضافي :detective:

لم أستطع فعلياً العثور على سكريبت الأتمتة الخاص بـ schedule pm with data-explorer results في مجلد plugins/automation/lib/discourse_automation/scripts الأساسي، لذا فهو مختبئ في مكان آخر.

لكنني كنتُ أراجع المنطق هنا الخاص بالتكرار (من المفترض أن السكريبت يستخدمه) في الملف plugins/automation/lib/discourse_automation/triggers/recurring.rb:

أعتقد أن الكود الأساسي للأتمتة الشهرية المتكررة يحسب اليوم الأسبوعي رقمي (مثل اليوم الثالث) بدلاً من تاريخ التقويم الفعلي، وهناك عدم تطابق في المنطق مع Calendar day - فبإدراج BYDAY=#{count}#{byday} في قاعدة RRule، تجبر الأتمتة على محاذاة يوم الأسبوع، بينما يجب استخدام BYMONTHDAY بدلاً من BYDAY.

لذلك، إذا قمتَ بضبط الأتمتة لتبدأ في 15 أبريل (الذي يقع في اليوم الثالث من الأربعاء في أبريل)، فسيفسر النظام القاعدة على النحو التالي: تشغيل في الأربعاء الثالث من كل شهر.

وعندما يأتي شهر مايو، يكون الأربعاء الثالث هو 20 مايو، مما يتسبب في انحراف الجدول الزمني بمقدار 5 أيام.

علاوة على ذلك، إذا قمتَ بضبط الأتمتة في اليوم 30 أو 31 من شهر ما (مثل “الثلاثاء الخامس”)، فإن النظام سيبحث عن الثلاثاء الخامس في الشهر التالي. وإذا كان ذلك الشهر يحتوي فقط على 4 أيام ثلاثاء، فإن الأتمتة ستفشل تماماً في العثور على تاريخ صالح وستتخطى الشهر بأكمله بصمت.

لدي إصلاح تم اختباره وأنا أقوم بإنشاء طلب دمج (PR) إذا أراد الفريق الاطلاع عليه. يغير هذا الإصلاح المنطق من اليوم الأسبوعي رقمي إلى تاريخ التقويم الدقيق.


إليك بعض لقطات الشاشة من اختباراتي وتصحيح الأخطاء:

حالتان، واحدة بدون إصلاح والأخرى مع إصلاح المنطق الخاص بي

قم بإنشاء نفس الأتمتة تماماً في كلتا الحالتين (النسخة المحسنة على اليمين):

انتبه إلى الفروقات في اللافتات التي تقول “سيتم تشغيل الأتمتة التالية في:” مع انحراف 5 أيام - النسخة غير المصححة تنحرف إلى الأربعاء الثالث (20 مايو)، بدلاً من 15 مايو.

على سبيل المثال، قد يتم تخطي شهور كاملة إذا كان النظام يبحث عن الخميس الرابع بدلاً من تاريخ فعلي.

يمكنك أيضاً اختبار النتيجة نفسها في وحدة تحكم Rails

غير مصحح:

مع الإصلاح:

طلب الدمج هنا:

إعجابَين (2)