在Heroku评论应用中将主机名设置为环境变量

时间:2016-06-28 22:11:05

标签: heroku

我在Heroku上使用与Github集成的评论应用功能。在我的一个应用程序中,我设置了一个名为HOST_NAME的环境变量。例如,如果网站为http://www.purplebinder.com,则HOST_NAME将设置为www.purplebinder.com。它在我们处理Cookie和交易电子邮件的几个地方使用过。

当我打开新的拉取请求并启动评论应用时,HOST_NAME应该是purplebinder-pr-27.herokuapp.com

有没有办法自动设置此值? Heroku documentation on review apps表示env var可以从父应用继承值,也可以在app.json中进行硬编码。这些方法都不适用于此,因为每次都需要使用不同的值,并且也与父应用程序不同。

Heroku还说可以通过生成器来设置env var"但是没有详细说明它是什么。

此问题可能与Setting ROOT_URL for Review Apps重复,但没有人回答过这个问题。它也类似于How to get Heroku app name from inside the app,但其中的答案涉及在创建应用程序后运行脚本 - 这里我想将此值设置为初始构建的一部分。

4 个答案:

答案 0 :(得分:13)

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

  

为了帮助编写脚本,可以使用两个特殊的配置变量   审核应用。如果您指定HEROKU_APP_NAMEHEROKU_PARENT_APP_NAME   作为app.json文件中的必需或可选配置变量,Heroku会   将这些配置变量设置为新的应用程序名称和父项   应用程序名称。然后它们将可用于   postdeploy脚本,以便您可以执行更高级的引导   和配置。

     

以下是使用的示例app.json文件   HEROKU_APP_NAMEHEROKU_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
        }
    }
}

答案 1 :(得分:5)

如果您将heroku-buildpack-cli添加到您的父应用,那么您可以通过post-deploy script设置环境变量。该命令应如下所示:

heroku config:set HOST_NAME=${HEROKU_APP_NAME}.herokuapp.com --app ${HEROKU_APP_NAME}

答案 2 :(得分:1)

这是一种忽略Rails安装app.json的方法:

相对config/<environment>.rb中的

。我个人使用production.rb并暂存只是引用它。

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环境变量仍然会有旧变量,但它可以工作。

答案 3 :(得分:0)

您还可以为reviewstaging.rb production.rb创建config/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"