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’”`。

我尝试了该命令,但无法在本地复现该问题,它直接通过了。

我可以利用失败的 GitHub Actions 步骤中的堆栈跟踪来定位导致问题的代码。

有问题的代码

在我的一个控制器中,我声明了一个常量,用于获取某个 Active Record 的属性列表:

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

显然,您不应该这样做。

不过,如果我能先在本地模拟这一检查就好了,这样就不必通过 GitHub Actions 进行反复试错。因此,除了执行以下命令外,肯定还有其他方法:

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 '启动成功'"
-> 无失败

引用一个不会访问数据库的类也不会失败:

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 模式下无法使其正常工作。在 test 模式下,如果没有 CI=trueLOAD_PLUGINS=1,似乎并不会加载所有插件类。