在Heroku审核应用程序中将主机名设置为环境变量

24
我正在使用集成了Github的Heroku上的Review Apps功能。在我的某个应用程序中,我设置了一个名为HOST_NAME的环境变量。例如,如果网站是http://www.purplebinder.com,那么HOST_NAME将被设置为www.purplebinder.com。它在我们处理cookies和事务性电子邮件时用于一些地方。
当我打开一个新的pull request并启动一个review app时,HOST_NAME应该是类似于purplebinder-pr-27.herokuapp.com的东西。
有没有一种自动设置此值的方法?Heroku文档关于review apps说,环境变量可以从父应用程序继承一个值或在app.json中硬编码。这两种方法都不适用于此处,因为该值需要每次都不同,而且与父应用程序也不同。
Heroku还说,环境变量可以通过“生成器”设置,但没有详细说明是什么。
这个问题可能是为Review Apps设置ROOT_URL的重复,但没有人回答过那个问题。它也类似于如何从应用程序内部获取Heroku应用程序名称,但那里的答案涉及在应用程序创建后运行脚本 - 在这里,我希望将此值作为初始构建的一部分设置。

5
目前正在遇到同样的问题——我认为下面选择的答案实际上没有回答这个问题,因为在你的情况下 HEROKU_APP_NAME 将是 purplebinder-pr-27,而不是完整的 URL。我还发现了这篇文章,它解释了文档中“generator”注释的含义:https://devcenter.heroku.com/articles/app-json-schema - woodardj
4个回答

17

来自https://devcenter.heroku.com/articles/github-integration-review-apps#heroku_app_name-and-heroku_parent_app_name

这篇文章介绍了如何在Heroku上使用GitHub集成的Review Apps功能。其中,heroku_app_name是Review App的应用程序名称,而heroku_parent_app_name是它所属的父级应用程序的名称。

To help with scripting, two special config vars are available to review apps. If you specify HEROKU_APP_NAME or HEROKU_PARENT_APP_NAME as required or optional config vars in your app.json file, Heroku will set those config vars to the new application name and the parent application name respectively. They will then be available for use in the postdeploy script so that you can do more advanced bootstrapping and configuration.

Here is an example app.json file that uses HEROKU_APP_NAME and HEROKU_PARENT_APP_NAME:

{
    "name":"Advanced App",
    "scripts": {
        "postdeploy": "rake db:setup && bin/bootstrap"
    },
    "env": {
        "HEROKU_APP_NAME": {
            "required": true
        },
        "HEROKU_PARENT_APP_NAME": {
            "required": true
        }
    }
}

4
FYI,“HEROKU_APP_NAME”只是名称,例如“my-app”,而不是“my-app.herokuapp.com”,因此您需要手动添加剩余的“.herokuapp.com”以获取可用的URL。 - aNoble
6
在这个例子中,bin/bootstrap 的内容是什么?我好像无法在应用程序内部设置 Heroku 的环境变量。 - toobulkeh
无效。而且,为什么没有人解释"postdeploy": "rake db:setup && bin/bootstrap"行的目的? 这是必要的吗? 我在我的服务器上尝试了它,但不起作用。 - Ricardo Green
2
那个例子中的 postdeploy 行是无意义的。如果该条目说 "postdeploy": "echo $HEROKU_APP_NAME",它将有助于传达环境变量在 postdeploy 步骤中可访问的想法。 - armenzg

6
如果您将heroku-buildpack-cli添加到您的主应用程序中,则可以从您的post-deploy脚本设置环境变量。命令应该类似于以下内容:
heroku config:set HOST_NAME=${HEROKU_APP_NAME}.herokuapp.com --app ${HEROKU_APP_NAME}

我无法进行此操作,因为您需要在 postdeploy 脚本中使用 heroku login 进行身份验证,以便首先认证 cli。 - Jack Chu
对于那些想要使用cli buildpack进行身份验证的人,存储库的注释部分提供了答案:https://github.com/heroku/heroku-buildpack-cli#notes 解决方案是在postdeploy条目中内联创建一个临时auth令牌。 - rlueder

2

以下是一种忽略Rails安装中的app.json的方法:

在相对路径config/<environment>.rb中。我个人使用production.rb,而staging只是引用它。

if ENV.fetch("HEROKU_APP_NAME", "").include?("staging-pr-")
  ENV["APPLICATION_HOST"] = ENV["HEROKU_APP_NAME"] + ".herokuapp.com"
  ENV["ASSET_HOST"] = "https://" + ENV["APPLICATION_HOST"]
  config.action_mailer.default_url_options = { host: ENV.fetch("APPLICATION_HOST") }
end
...

这有点误导,因为Heroku环境变量仍然会保留旧的变量,但它能够正常工作。


2
难道你不需要将 HEROKU_APP_NAME 和 HEROKU_PARENT_APP_NAME 添加到 app.json 中,以便在 Ruby 脚本中声明它们? - gabriel-kaam

0

您还可以创建review环境,将staging.rbproduction.rbconfig/environments复制到您的应用程序中。这将非常有用。

在将HEROKU_APP_NAMEHEROKU_PARENT_APP_NAME添加到您的app.json后,您可以轻松地设置;

config.action_mailer.default_url_options = { host: "#{ENV['HEROKU_APP_NAME']}.herokuapp.com" }
config.action_mailer.asset_host = "http://#{ENV['HEROKU_APP_NAME']}.herokuapp.com"
config.action_controller.asset_host = "#{ENV['HEROKU_APP_NAME']}.herokuapp.com"
config.action_cable.url = "wss://#{ENV['HEROKU_APP_NAME']}.herokuapp.com/cable"

Heroku 不推荐使用这种方法。 - BenKoshy
@BKSpurgeon,你能否添加一个链接/参考资料,解释为什么Heroku不推荐使用它?我很好奇原因是什么。谢谢! - rlueder
我是从Heroku的文档中读到的,所以我基本上按照文档并找到了另一个解决方案。那是很久以前的事情了,所以我手头没有链接。 - BenKoshy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接