Шаг «Проверка готовности SKIP_DB_AND_REDIS» в GitHub Actions не выполняется

У меня возникла проблема: недавно добавленный шаг «Проверка возможности загрузки SKIP_DB_AND_REDIS» не удался для одного из моих плагинов.

Загрузка с SKIP_DB_AND_REDIS не удалась. Убедитесь, что во время процесса загрузки Rails нет обращений к базе данных.

Чтобы воспроизвести проблему локально, выполните SKIP_DB_AND_REDIS=1 RAILS_DB='nonexistent' bin/rails runner "puts 'booted successfully'".

Я попробовал это сделать, но не смог воспроизвести проблему локально — всё прошло успешно.

Я мог бы использовать стек-трейс из неудачного шага действия GitHub, чтобы точно определить, какой код стал причиной проблемы.

Проблемный код

В одном из моих контроллеров я объявил константу, которая получала список атрибутов активной записи:

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 похоже, что не все классы плагинов загружаются.