在 github 操作上运行测试时,Rails 凭证值为零

Posted

技术标签:

【中文标题】在 github 操作上运行测试时,Rails 凭证值为零【英文标题】:Rails credential values are nil while running tests on github actions 【发布时间】:2021-05-22 05:24:13 【问题描述】:

我正在使用 Rails secret_key_base 对 JSON Web 令牌进行编码和解码,我的 secret_key_base 位于 credentials.yml.enc 文件中。在其中一项测试中,我使用此函数来解码 JWT,本地测试运行良好,但在 github 操作上它失败了,我发现 Rails.application.crendentials.secret_key_base 的值在运行测试时为 nil github 动作。我通过像这样模拟来修复这些测试

    allow(Rails.application.credentials).to receive(:secret_key_base).
      and_return("secret")

有没有一种方法我不必在 github 操作上为其他凭据执行此操作。另外由于没有提交 master.key 我希望我会看到这个错误

ActiveSupport::MessageEncryptor::InvalidMessage

在读取凭证文件时,但这也没有发生。 如果可以解决问题,这是我项目的link。

【问题讨论】:

【参考方案1】:

在 Rails 6 中,您可以为每个环境创建 credentials.yml.enc 文件。

在 vscode 中:

EDITOR="code --wait" rails credentials:edit --environment production
EDITOR="code --wait" rails credentials:edit --environment test

它会给你production.key, production.yml.enc, test.key, test.yml.enc。 然后,您可以将test.key 提交到 github 进行测试,甚至更好,将此密钥设置在 RAILS_TEST_KEY env 中。

虽然维护两个 env 文件有点棘手。您可以使用空环境创建 credenetials.yml.example 文件以供参考

【讨论】:

【参考方案2】:

我认为“最干净/正确的方法”是将主密钥(来自 config/master.key 的值)添加到 github 机密中。

转到存储库设置->秘密(左侧菜单)->新存储库秘密。 将其命名为 RAILS_MASTER_KEY 是有意义的。 然后在你的工作流文件中添加

env:
  RAILS_MASTER_KEY: $ secrets.RAILS_MASTER_KEY 

就是这样,Rails 将足够聪明,可以在凭据解密中使用该变量。

无需制作额外的凭据文件。对我来说,它只使用一个 credentials.yml.enc

编辑:更好的是,如果您可以跳过使用凭据,请添加 heroku 配置变量 SECRET_KEY_BASEconfig/application.rb 添加

config.secret_key_base = ENV['SECRET_KEY_BASE']

用于生产用途Rails.configuration.secret_key_base, 用于测试/开发Rails.application.secrest.secret_key_base,由 rails 设置

例如

SECRET_KEY = Rails.env.production? ? Rails.configuration.secret_key_base : Rails.application.secrets.secret_key_base

这样您就不必在每台运行您的应用程序的机器上存储主密钥。前任。同事、github 操作、登台、生产。

【讨论】:

以上是关于在 github 操作上运行测试时,Rails 凭证值为零的主要内容,如果未能解决你的问题,请参考以下文章

Rails:找不到 JavaScript 运行时。有关可用运行时的列表,请参阅 https://github.com/sstephenson/execjs。 (ExecJS::RuntimeUnava

在 Rails 3 上使用 Rspec 和 MongoID 清理或重置测试数据库

Rails 固定装置与种子

Rails应用程序在测试运行时是否应加载其.env文件?

在 github 操作上运行 firebase 模拟器

Rails 测试尝试删除 sql 视图