我遇到了一个问题:最近添加的“检查 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'"
david
(David Taylor)
3
有意思,感谢反馈!
这是一个相当具体的问题,我们之前可能没有考虑到。
能否尝试在您的本地安装中将这一行改为 false:
然后再次尝试复现命令?
如果这能成功复现问题,那么我们应该考虑添加一个环境变量来控制该 schema_cache_dump 设置。
这没有效果。删除 db/schema_cache.yml 文件也没有效果。
david
(David Taylor)
7
请尝试以下两种方法:
开发模式,使用不同的环境变量设置数据库:
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=true 和 LOAD_PLUGINS=1,似乎并不会加载所有插件类。