فشل في GitHub Actions في خطوة "التحقق من قابلية التشغيل SKIP_DB_AND_REDIS"

واجهت مشكلة حيث فشلت خطوة “التحقق من قابلية التشغيل SKIP_DB_AND_REDIS” المضافة مؤخرًا لإحد الإضافات الخاصة بي.

فشل التشغيل مع SKIP_DB_AND_REDIS. تأكد من عدم الوصول إلى قاعدة البيانات أثناء عملية تشغيل Rails.

لإعادة إنتاج المشكلة محليًا، قم بتشغيل `SKIP_DB_AND_REDIS=1 RAILS_DB=‘nonexistent’ bin/rails runner “puts ‘booted successfully’”`.

لقد جربت ذلك، لكنني لم أستطع إعادة إنتاج المشكلة محليًا. لقد نجح الأمر ببساطة.

استطعت استخدام تتبع المكدس (stack trace) لخطوة عملية GitHub الفاشلة لتحديد الكود المسؤول عن المشكلة.

الكود المُشكّل في المشكلة

في أحد المتحكمات (controllers) الخاصة بي، أعلنت عن ثابت (constant) يسترجع قائمة سمات (attributes) لـ Active Record:

REWARD_FIELDS =  Reward.attribute_names.excluding("id", "created_at", "updated_at")

وهو ما لا ينبغي فعله كما يبدو.

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

SKIP_DB_AND_REDIS=1 RAILS_DB='nonexistent' bin/rails runner "puts 'booted successfully'"

مثير للاهتمام، شكرًا للإبلاغ!

هذا أمر محدد جدًا، والذي ربما لم نأخذه في الاعتبار من قبل.

هل يمكنك تجربة تغيير هذا السطر إلى false في تثبيتك المحلي:

ثم تجربة أمر التكرار مرة أخرى؟

إذا نجح ذلك في إعادة إنتاج المشكلة، فعندئذٍ يجب أن ننظر في إضافة متغير بيئة للتحكم في إعداد schema_cache_dump.

لم يكن لذلك أي تأثير. ولم يكن حذف ملف db/schema_cache.yml كذلك.

هل يمكنك تجربة الأمرين التاليين:

في وضع التطوير، باستخدام بيئة مختلفة لتعيين قاعدة البيانات:

SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB='nonexistent' bin/rails runner "puts 'booted successfully'"

في وضع الاختبار، مع تحميل الإضافات:

LOAD_PLUGINS=1 RAILS_ENV=test SKIP_DB_AND_REDIS=1 RAILS_DB='nonexistent' bin/rails runner "puts 'booted successfully'"

لا، لا يزال ناجحًا.

فقط للتحقق من تحميل كود الإضافة، استخدمت puts DiscourseKofi::Engine.to_s وطبعت الاسم. لكن عند الإشارة إلى الكلاس الذي سيقوم بإنشاء اتصال بقاعدة البيانات puts DiscourseKofi::Admin::AccountsController.to_s، فشل الأمر في النهاية.

إذًا يبدو أنه لا يقوم بتحميل كود الإضافة بالكامل محليًا كما يفعل في عملية GitHub Action.

الأمر الفاشل بالكامل:

LOAD_PLUGINS=1 SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB=nonexistent bin/rails runner "puts DiscourseKofi::Admin::AccountsController.to_s"

بدون LOAD_PLUGINS=1 أو باستخدام RAILS_DB=nonexistent لم ينتج عنه فشل

تصحيح: LOAD_PLUGINS لم يكن له تأثير.

إذن، سيؤدي هذا إلى فشل:

SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB=nonexistent bin/rails runner "puts DiscourseKofi::Admin::AccountsController.to_s"
-> فشل

أما هذا فلم يفشل:

SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB=nonexistent bin/rails runner "puts 'booted successfully'"
-> لا يوجد فشل

وكذلك لم يفشل عند الاستشهاد بفئة لا تتصل بقاعدة البيانات:

SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB=nonexistent bin/rails runner "puts DiscourseKofi::Admin::PaymentsController.to_s"
-> لا يوجد فشل

تمّ ذلك. الأمر الصحيح لتكرار المشكلة محليًا هو:

CI=true RAILS_ENV=test LOAD_PLUGINS=1 SKIP_DB_AND_REDIS=1 RAILS_DB=nonexistent bin/rails runner "puts 'booted successfully'"

جميع متغيرات البيئة هذه مهمة. لم أستطع جعله يعمل مع RAILS_ENV=development. بدون CI=true و LOAD_PLUGINS=1 في وضع test، يبدو أن جميع فئات الإضافات لا يتم تحميلها.