【问题标题】:Rails 6 app not reading ENV on Heroku during testsRails 6 应用程序在测试期间未在 Heroku 上读取 ENV
【发布时间】:2020-12-06 12:07:40
【问题描述】:

我有一个 Rails 6 应用程序部署到 Heroku 并且工作正常。我刚刚开始向应用程序添加一个 API,这在本地也可以正常工作,所有测试都在本地通过。

当我部署到 Heroku 时,应用正确响应 curl。

但是,在授权 JWT 令牌期间,我的测试(通过 Heroku CI 运行)以 TypeError: no implicit conversion of nil into String 失败。我已经确定了根本原因,即没有为我的测试加载 DEVISE_JWT_SECRET_KEY 环境变量。

这个变量被定义为一个 Heroku 环境变量,当我使用 curl 测试实际应用程序时工作正常,正如我所提到的。跑步

heroku config:get DEVISE_JWT_SECRET_KEY -a [APP_NAME]

返回正确的密钥。

当我在测试中添加一行来检查变量时,raise 在测试运行时被执行,表明变量丢失。

raise if ENV['DEVISE_JWT_SECRET_KEY'].nil?

谁能建议我在 Heroku 上运行测试时为什么没有加载环境变量?

【问题讨论】:

  • Protip 是使用ENV.fetch('DEVISE_JWT_SECRET_KEY'),这将在 nil 时引发 KeyError。
  • 我对“但是,我的测试失败”部分有点困惑 - 你是在 heroku 上运行单元测试吗?
  • @max 我在 Heroku 上运行集成测试,在我的 Pipeline 上使用 Heroku CI 系统。这是 Heroku CI 设计的用例。
  • 我错过了 CI 部分 - 我以为你只是想在生产环境中从 heroku 运行器中运行它们。那将是个坏消息。
  • 作为参考,@max,我在设计初始化程序中进行了更改以使用ENV.fetch(),并且正如您所期望的那样,在初始化期间这会失败并出现 KeyError - 但仅在运行测试的 HerokuCI 上,不是当我重新启动测功机本身时。有什么想法吗?

标签: ruby-on-rails testing heroku environment-variables


【解决方案1】:

请注意,与评论应用不同,Heroku CI 不继承任何配置 来自父应用的 vars。

设置机密或易变的环境变量(如访问 令牌),您不应该包含在 app.json 中,您可以改为添加 将它们添加到 Heroku Dashboard 中管道的 Heroku CI 设置中。

https://devcenter.heroku.com/articles/heroku-ci

因此,期望您的 CI 使用您通过 CLI 设置的配置变量是错误的,如果您的 CI 错误地使用了真实的第三方凭据,这可能会导致一些非常严重的问题。

【讨论】:

  • 我实际上并没有使用 heroku CI,但如果它使用单独的 RAILS_ENV 变量,您还可以使用 Rails 中的加密机密机制,因为 Rails 6 具有每个环境的加密机密。
  • 啊哈——就是这样,谢谢@max!当我使用新的 DEVISE_JWT_SECRET_KEY 更新所有 Heroku 实例时,我错过了 Pipeline CI 配置部分。 (将密钥放入 app.json 文件可能不是一个好主意,即使对于测试环境也是如此。)向管道的环境添加密钥意味着测试现在通过了。谢谢?
猜你喜欢
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多