【问题标题】:Set host name as an environment variable in Heroku review app在 Heroku 评论应用中将主机名设置为环境变量
【发布时间】:2016-10-31 10:12:25
【问题描述】:

我在 Heroku 上使用与 Github 集成的 Review Apps 功能。在我的一个应用程序中,我设置了一个名为 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,但其中的答案涉及在创建应用程序后运行脚本 - 这里我想将此值设置为初始构建的一部分。

【问题讨论】:

  • 目前正在为同样的事情苦苦挣扎——我认为下面选择的答案实际上并不能回答这个问题,因为在你的情况下,HEROKU_APP_NAME 将是 purplebinder-pr-27,而不是完整的网址。我还发现这个解释了文档中的“生成器”注释:devcenter.heroku.com/articles/app-json-schema

标签: heroku


【解决方案1】:

如果您将heroku-buildpack-cli 添加到您的父应用程序,那么它使您能够从您的post-deploy script 设置环境变量。该命令应如下所示:

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

【讨论】:

  • 我不能这样做,因为你需要在 postdeploy 脚本中 heroku login 来首先验证 cli。
  • 对于那些登陆这里希望使用 cli buildpack 进行身份验证的人,repo 上的注释部分有答案:github.com/heroku/heroku-buildpack-cli#notes 解决方案是创建一个与 postdeploy 条目内联的临时身份验证令牌。跨度>
【解决方案2】:

您还可以为您的应用程序创建review 环境,从config/environments 复制staging.rbproduction.rb。这会很有用。

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 不推荐这种方式。
  • @BKSpureon 你能添加一个链接/参考,说明为什么 Heroku 不推荐它吗?好奇是什么原因。谢谢!
  • 我是从heroku文档本身中阅读的,所以我基本上按照文档并找到了另一个解决方案。很久以前了,所以我手头没有链接
【解决方案3】:

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

【讨论】:

  • 您是否还必须在 app.json 中添加 HEROKU_APP_NAME 和 HEROKU_PARENT_APP_NAME 以便将它们贴在您的 ruby​​ 脚本中?
【解决方案4】:

来自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
        }
    }
}

【讨论】:

  • 仅供参考,HEROKU_APP_NAME 只是名称。即my-app 不是my-app.herokuapp.com,因此您必须手动附加其余的.herokuapp.com 以获得可用的URL。
  • 这个例子中bin/bootstrap的内容是什么?我似乎无法从应用程序中设置 heroku ENV 变量。
  • 不起作用。另外,为什么没有人解释"postdeploy": "rake db:setup && bin/bootstrap" 行的目的?是必要的线路吗?在我的服务器上试过了,还是不行。
  • 该示例中的 postdeploy 行毫无意义。如果该条目显示"postdeploy": "echo $HEROKU_APP_NAME",它将有助于传达在postdeploy 步骤中可以访问环境变量的想法。
猜你喜欢
  • 1970-01-01
  • 2020-11-24
  • 2015-04-04
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 2014-05-23
  • 2021-06-01
  • 2015-08-18
相关资源
最近更新 更多