【问题标题】:Rails credential values are nil while running tests on github actions在 github 操作上运行测试时,Rails 凭证值为零
【发布时间】:2025-11-30 21:45:01
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: ruby-on-rails ruby docker github github-actions


    【解决方案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 操作、登台、生产。

      【讨论】: