【问题标题】:How to set ENV var in Heroku preview app postdeploy script如何在 Heroku 预览应用程序部署后脚本中设置 ENV var
【发布时间】:2017-04-20 10:08:55
【问题描述】:

我想在预览应用上将 HOST 环境变量设置为 $HEROKU_APP_NAME.herokuapps.com。看起来我不能在app.json 中执行此操作,因为这是一个计算值。

我希望在这样的“部署后”脚本中做到这一点

heroku config:set HOST="`heroku config:get HEROKU_APP_NAME -a neon-dev-pr-520`.herokuapps.com"

但它想将我认证为 Heroku 用户。唉,这也不行:

export HOST=$HEROKU_APP_NAME.herokuapps.com

有什么建议吗?

【问题讨论】:

    标签: heroku environment-variables


    【解决方案1】:

    我找到了this post,这表明您可以使用 Heroku PlatformAPI。

    在这种情况下,作为一个作为 postdeploy 运行的 Rails Rake 任务:

    desc 'Bootstrap review app'
    task bootstrap: ['db:schema:load', 'db:seed'] do
      heroku = PlatformAPI.connect_oauth(ENV['HEROKU_API_TOKEN'])
      heroku.config_var.update(ENV['HEROKU_APP_NAME'], 'WWW_HOSTNAME' => "#{ENV['HEROKU_APP_NAME']}.herokuapp.com")
    end
    

    【讨论】:

    • 这是唯一有效的解决方案!有一些额外的步骤是必要的(安装 platform-api gem,生成一个令牌,并将其添加到你的环境中),但我添加了额外的说明
    • 附加说明和更新的链接由于某种原因被拒绝为编辑。这是很好的链接:lifeinspect.com/heroku/ruby/rails/2015/11/26/… 我还在那里添加了附加说明
    • 谢谢@JayDorsey 不知道为什么它被拒绝,也许请求超时。我已经更新了 OP 中的链接。
    • @JayDorsey 感谢您提供更多详细信息。您是如何生成令牌的?更准确地说,您是否能够以编程方式生成它?尝试生成将在 config_var 更新后不久过期的短期令牌
    • @mizurnix 我认为阅读文档仍然可行(我还没有这样做)。您可能能够创建一个长期存在的身份验证/令牌(也许只有令牌创建权限?),然后使用该令牌创建短期令牌来修改环境变量。我以前没有做过,我只是在看我上面链接的页面上的 auth: docs。无论哪种方式,您都必须在某处拥有某种长期运行的持久令牌。如果安全至关重要,您将需要使用某种安全的键值存储(而不是 ENV)
    【解决方案2】:

    查看用于审核应用程序的文档https://devcenter.heroku.com/articles/github-integration-review-apps#heroku_app_name-and-heroku_parent_app_name

    只要您在 app.json 文件中将 HEROKU_APP_NAMEHEROKU_PARENT_APP_NAME 声明为必需或可选,它们就可以在您的部署后脚本中使用,因此您可以这样做:

    HOST="$HEROKU_APP_NAME.herokuapp.com"
    

    【讨论】:

    • 太好了,谢谢!如果它可以帮助其他人找到这个,同样的事情也适用于您可能想要设置的其他环境变量。 tldr;您在 app.json 文件的 postdeploy 脚本中设置的环境变量似乎在审核应用程序中保持设置
    • ^^ 从头开始​​——在实践中对此进行测试后,至少截至 2018 年 6 月 22 日,情况似乎并非如此。(如果这很重要,作为数据点,我正在使用多个构建包。)
    【解决方案3】:

    几年前在 Heroku 出色的支持团队的帮助下完成了工作。我们需要为中间件(解析服务器)设置一个自反环境变量,以了解要连接的内容。它是在我们的暂存和生产应用上手动设置的,但要在我们的审核应用上进行设置:

    我的 app.json 包括:

      "scripts": {
        "postdeploy": "bin/bootstrap"
      },
    ...
      "env": {
        "HEROKU_APP_NAME": {
          "required": true
        },
        "HEROKU_PARENT_APP_NAME": {
          "required": true
        },
    ...
    

    bin/bootstrap 是:

    #!/usr/bin/env bash
    
    echo $HEROKU_APP_NAME
    export SERVER_URL=https://$HEROKU_APP_NAME.herokuapp.com/parse
    

    SERVER_URL 在我的评论应用程序中可用(并且正确)。自从我们实施以来一直 ?没有问题。

    【讨论】:

    • 截至 2020 年 9 月,这似乎不起作用。刚刚试了一下。
    【解决方案4】:

    在部署后脚本中使用 python 请求:

    import requests
    result = requests.patch(f"https://api.heroku.com/apps/{os.environ.get('HEROKU_APP_NAME')}/config-vars",
                       data=json.dumps({"YOUR_KEY": "SOME_VALUE"}),
                       headers={"Content-Type": "application/json",
                                "Accept": "application/vnd.heroku+json; version=3",
    

    "授权": f"承载 {os.environ.get("HEROKU_API_KEY")}"} )

    或者在登录时使用 curl:

      curl -n -X PATCH https://api.heroku.com/apps/$HEROKU_APP_NAME/config-vars \
      -d '{
      "FOO": "bar",
      "BAZ": "qux"
    }' \
      -H "Content-Type: application/json" \
      -H "Accept: application/vnd.heroku+json; version=3"
    

    并且在未登录时添加已生成应用令牌的标头:

     -H "Authorization: Bearer $HEROKU_API_KEY"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 2017-12-18
      • 2015-10-11
      相关资源
      最近更新 更多