在 slug 构建过程中,我的 Rails 应用程序何时可以访问 Heroku 设置的 ENV 变量?

rei*_*eid 3 ruby ruby-on-rails heroku sprockets asset-pipeline

我希望使用基于 Heroku 实验室设置的任何可能值的缓存键将文件加载到我的 Rails 缓存中:Dyno 元数据插件 ( https://devcenter.heroku.com/articles/dyno-metadata )。

在那篇文章中,我正在寻找一个在 slug 构建过程早期可用的唯一标识符。

HEROKU_RELEASE_CREATED_AT: 2015-04-02T18:00:42Z HEROKU_RELEASE_VERSION: v42 HEROKU_SLUG_COMMIT: 2c3a0b24069af49b3de35b8e8c26765c1dba9ff0

这是我感兴趣的三个(上面的示例数据)。在我的资产预编译步骤中,我依赖于一个唯一值,我决定使用上述 3 个中的任何一个。此步骤是在我的 Rails 应用程序运行之前完成的。

最初我尝试过,HEROKU_RELEASE_VERSION但我注意到它直到 slug 构建过程完成才设置,这意味着在我的资产预编译步骤中,它是nil.

然后我试图HEROKU_SLUG_COMMIT看看在资产预编译之前是否知道这一点。它是否正确?从一些初始测试来看,它似乎工作正常(至少在资产预编译之前已知),但是我想知道这些设置的正确顺序。

如果这不是 中可用的早期值ENV[],那么更好的建议是什么?

====== 更新:

我一直在尝试使用以下值的配置:

HEROKU_RELEASE_CREATED_AT: 2015-04-02T18:00:42Z HEROKU_RELEASE_VERSION: v42 HEROKU_SLUG_COMMIT: 2c3a0b24069af49b3de35b8e8c26765c1dba9ff0

我注意到,在构建资产之前,上述值不会在构建前发生变化,而是在构建后发生变化。下面,我得到了下面的结果输出。正如您所看到的,当前的部署只是2583508在构建过程中ENV['HEROKU_SLUG_COMMIT']返回8318914,直到应用程序完成,然后ENV['HEROKU_SLUG_COMMIT']更新为2583508.

=== sample-app Releases - Current: v356
v356  Deploy 2583508   email@gmail.com    2017/04/26 20:05:51 -0400 (~ 40s ago)
v355  Deploy 8318914   email@gmail.com    2017/04/26 19:51:33 -0400 (~ 14m ago)
v354  Deploy c054f1e   email@gmail.com    2017/04/26 19:40:42 -0400 (~ 25m ago)

BROWSER RESTRICTIONS SLUG COMMIT: 83189141e4e45643bf71d9aa78604e479ea210f1
Run Code Online (Sandbox Code Playgroud)

有没有办法在实际构建之前唯一地了解当前构建?也许不使用 heroku lab 插件?

rei*_*eid 5

我收到了 Heroku 支持的回复,这似乎解决了我正在寻找的需求。

海罗库的回应:

不幸的是,此时,我们的 dyno 元数据实验室标志和构建期间提供的配置变量并不完全匹配。在构建过程中,您可以使用 SOURCE_VERSION 环境变量,它将是提交哈希。然后,在运行时,您可以使用 HEROKU_SLUG_COMMIT 来获取相同的值。

这种差异背后的原因主要是上下文的差异。在构建期间将该变量命名为 HEROKU_SLUG_COMMIT 没有意义,因为它还不是 slug。

由于我们永远不会设置这两个配置变量,因此您应该能够使用其中任何一个,如果未设置则回退到另一个。

我现在的实现是: ENV["SOURCE_VERSION"] || ENV['HEROKU_SLUG_COMMIT']按顺序。这对我有用。