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

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

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

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

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

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

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

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

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

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


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

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

قم بإنشاء نفس الأتمتة بالضبط في كلتا الحالتين (الإصدار المُصلح على اليمين):

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

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

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

غير مصحح:

مع الإصلاح:

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

تعديل: يبدو أن الخطأ يؤثر على أي سكريبت أتمتة يستخدم محفز recurring مضبوطاً للتشغيل شهرياً. :grimacing:

يمكنني أيضاً تكرار ظهور لافتة فارغة أحياناً، على سبيل المثال إذا قمت بضبط تاريخ البدء ليوم 29 أبريل 2026، فلن يتمكن من العثور على الأربعاء الخامس لشهر مايو لأنه غير موجود - سيفشل تشغيل الأتمتة هنا: (غير المصحح على اليسار، والمصحح على اليمين)

يبدو أن الخطأ يرمي NoMethodError في Rails عندما لا يتمكن من العثور على اليوم رقم N في الأسبوع كما هو موضح أعلاه؛ ومن هنا تأتي اللافتة الفارغة للتشغيل التالي والفشل في التشغيل:

إعجابَين (2)