【问题标题】:Heroku - Display hash of current commit in browserHeroku - 在浏览器中显示当前提交的哈希
【发布时间】:2013-01-13 01:05:46
【问题描述】:

我想在浏览器中显示当前 git 提交的哈希,以便测试团队(无权运行 heruko 命令)能够在错误报告中包含相应的提交哈希。

首先我尝试了 grit,但有些东西坏了,它在 Heroku 上不起作用(在本地效果很好,我不知道为什么它在 Heroku 上失败)。

于是我发现Heroku上有两个环境变量:

ENV["COMMIT_HASH"]
ENV["LAST_COMMIT_BY"]

但它们都不可用(两者都是 nil)。

我还检查了:

heroku config

但同样,两者都没有设置。

有没有办法检索哈希信息?有什么办法可以获得更多的git信息,例如日期?

【问题讨论】:

标签: ruby-on-rails git heroku


【解决方案1】:

首先,由于 heroku "remove[s] unused files, including the .git directory" 在 slug 编译期间,您将无法从应用程序目录内(在 heroku dyno 上)执行一些 git 命令。这包括像git rev-parse HEAD 这样的东西,这通常是获取当前哈希值的简单方法。

其次,尝试在 heroku dyno 上使用 git ls-remote 检索信息将调用 ssh,并且您会看到显示为 The authenticity of host 'heroku.com (50.19.85.132)' can't be established 的消息,因为 heroku 公钥未安装在 heroku dyno 上。您将无权安装 heroku 公钥。

你至少还有两个选择。

  1. 添加post-commit hook 以更新哈希值。

    a) 创建或编辑文件.git/hooks/post-commit
    b) 像这样添加一些 shell 脚本代码:

    hash_name=HEAD_HASH
    hash=$(git rev-parse HEAD)
    echo 将 $hash_name 设置为 $hash
    heroku 配置:设置 $hash_name=$hash --app yourappname

    (你可以为 git hooks 使用任何你想要的代码;这只是一种选择)

    说明:

    • HEAD_HASH 是 heroku 环境变量的名称。随心所欲地称呼它。您将在主应用中查找此内容并将其显示在页面上。
    • git rev-parse HEAD 获取当前 HEAD 提交的哈希值。为您想要显示的任何内容自定义此行。


    现在,当您提交到 git 时,HEAD_HASH env var 每次都会更新。这可行,但可能有点慢,因为您每次提交时都会等待 heroku 设置环境变量。如果您的网络连接中断等,该变量将不会被更新。 Rumour is git 1.8.2 将允许一个“预推送”钩子,您可以在其中放置此代码。

  2. 使用脚本推送代码

    您可以编写一个 shell 脚本,其中包含来自选项 1. 的行并在末尾添加 git push heroku master,而不是键入 git push heroku master 来推送您的代码。然后运行这个 shell 脚本来部署你的代码。这将仅在推送之前(而不是在每次 git 提交之后)更新HEAD_HASH,并且它很好地将所有内容保存在一个地方。您可能还想将脚本添加到您的 .slugignore 文件中。

【讨论】:

  • hmmm...我做heroku run git rev-parse HEAD 并得到fatal: Not a git repository (or any of the parent directories): .git - 怎么了??
  • @guyaloni 看起来你不能在 dyno 本身上执行一些 git 命令,因为是 heroku 编译过程的一部分deletes the .git depo。我已经修改了我的答案以使用 git hooks 和/或 shell 脚本。你怎么看?
  • 谢谢,很好的解释!
  • 我正在构建一个 heroku 插件来提供这种功能。如果您有兴趣测试 alpha,请在 Twitter 上与我联系:@phoet
  • 如果您的部署失败,版本将被错误地设置为失败的提交哈希。
【解决方案2】:

git ls-remote heroku 为我工作。我从一个重复的问题here 的答案中得到了这个。

【讨论】:

  • 是的,除了 OP 想要“在浏览器中显示当前 git commit 的哈希值”。
  • 忘记OP,这是我需要知道的。
【解决方案3】:

Git >1.8.2 现在支持预推送挂钩,这更适合我们的用例。这是我当前的钩子脚本:

#!/bin/sh

remote="$1"
url="$2"

if [[ $url =~ heroku ]] ; then

    if [[ $url =~ staging ]] ; then
        appname=YOUR_APP_NAME_STAGING
    else
        appname=YOUR_APP_NAME
    fi

    hash_name=COMMIT_HASH
    hash=$(git rev-parse HEAD)
    echo Setting $hash_name to $hash
    heroku config:set $hash_name=$hash --app $appname
fi
exit 0

【讨论】:

    【解决方案4】:

    culix 和 joshwa 都有很好的答案。如果您将 heroku git 远程命名为与相应的 heroku 应用程序相同,您可以拥有更短、更强大的 .git/hooks/pre-push 钩子:

    #!/bin/bash
    
    remote="$1"
    url="$2"
    
    if [[ $url =~ heroku ]] ; then
        hash_name=COMMIT_HASH
        hash=$(git rev-parse HEAD)
        echo Setting $hash_name to $hash on app $remote
        heroku config:set $hash_name=$hash --app $remote
    fi
    
    exit 0
    

    【讨论】:

      【解决方案5】:

      如果您使用 CI 并且无法访问那里的 Heroku 客户端,也可以直接使用 Heroku API。

      这是我在codeship.com 上使用的解决方案(它提供环境中的哈希为$CI_COMMIT_ID

      # you can use `heroku auth:token` to generate this
      HEROKU_API_KEY="" 
      
      APP_NAME="glorious-flying-birds"
      
      curl -n -X PATCH "https://api.heroku.com/apps/$APP_NAME/config-vars" \
        -H "Authorization: Bearer $HEROKU_API_KEY" \
        -H "Accept: application/vnd.heroku+json; version=3" \
        -H "Content-Type: application/json" \
        -d "{\"GIT_COMMIT_HASH\": \"$CI_COMMIT_ID\"}"
      

      【讨论】:

      • 这对于您想从 CI 对您的应用程序进行的任何小调整都非常有用。非常感谢指出(几乎)始终可用的工具 - curl :)
      【解决方案6】:

      自 2015 年 4 月 1 日起,Git SHA 现在可在构建过程中作为环境变量 SOURCE_VERSION 使用。见:https://devcenter.heroku.com/changelog-items/630

      请注意,它对正在运行的应用程序不可用,仅在编译步骤期间可用。您可以添加一个自定义 buildpack 将其写入到 slug 中持久存在的文件中,然后从您的应用程序中读取该文件。

      我正在测试这种方法,并在这里有一个实验性的 buildpack:https://github.com/sreid/heroku-buildpack-sourceversion

      【讨论】:

      • 这将与 buildpack 后编译步骤(如 npm postinstall 或 python 的 bin/post_compile:[github.com/heroku/heroku-buildpack-python/issues/…(注意:这是未经测试的)很好地配合使用)
      • 请注意,上面的 buildpack 参考已被分叉以使其与最新的 buildpack API 兼容。你可以找到更新的 buildpack here
      【解决方案7】:

      Heroku 具有支持 dyno 元数据的新功能,如果您通过电子邮件发送支持,您可能会被添加到测试版中。这是 Heroku 自己使用它的地方:

      https://github.com/heroku/fix/blob/6c8ab7a/lib/heroku_dyno_metadata.rb

      附加功能将 JSON 文件写入 /etc/heroku/dyno - 内容如下所示:

      {
         "dyno":{
            "physical_id":"161bfad9-9e83-40b7-b385-78305db2f168",
            "size":1,
            "name":"run.7145"
         },
         "app":{
            "id":null
         },
         "release":{
            "id":50,
            "commit":"2c3a0b24069af49b3de35b8e8c26765c1dba9ff0",
            "description":null
         }
      }
      

      ..so release.commit 是您所追求的字段。

      【讨论】:

      • 没有适合我的文件。 heroku-18 堆栈。 /etc/heroku 为空。
      【解决方案8】:

      现在可以尝试 Roberto 在他的回答中提到的 Heroku 功能,而无需联系 Heroku。它叫做Heroku Labs: Dyno Metadata,你可以通过

      heroku labs:enable runtime-dyno-metadata -a <app name>
      

      然后信息作为环境变量可用(在下一次部署时):

      ~ $ env
      HEROKU_APP_ID:                   9daa2797-e49b-4624-932f-ec3f9688e3da
      HEROKU_APP_NAME:                 example-app
      HEROKU_DYNO_ID:                  1vac4117-c29f-4312-521e-ba4d8638c1ac
      HEROKU_RELEASE_VERSION:          v42
      HEROKU_SLUG_COMMIT:              2c3a0b24069af49b3de35b8e8c26765c1dba9ff0
      HEROKU_SLUG_DESCRIPTION:         Deploy 2c3a0b2
      ...
      

      【讨论】:

      • 这应该是最佳答案
      • 感谢您向我介绍了很棒的heroku labs 命令!
      • 不幸的是,如果您使用 Heroku Pipelines,这似乎不起作用。 HEROKU_SLUG_COMMIT 似乎仅在您执行基于 git-push 的部署时才被初始化/更新。
      • @nfm 没错,我实际上是在 1 个月前向 Heroku 询问过这件事,这是他们的回答:“我担心由于 dyno 元数据目前是实验室功能,因此无法折叠子应用程序来继承变量。但是有一个例外,HEROKU_APP_NAME 有一个小解决方法。如果您将其添加到 env 对象(将值留空),我们将自动使用正确的父应用名称填充它。"
      • 当使用 Heroku Pipelines 推广构建时,看起来这些 env 变量现在可用于其他应用程序。
      【解决方案9】:

      Heroku 容器上有一个名为 SOURCE_VERSION 的环境变量

      https://devcenter.heroku.com/articles/buildpack-api

      你可以使用它!

      【讨论】:

      • 有时隐藏在底部的最新答案是最好的答案?
      • 这仅在构建时可用,对吧。虽然这是一个有用的答案,但不可能用它在浏览器中显示提交,紧吗?
      猜你喜欢
      • 2015-02-15
      • 1970-01-01
      • 2014-05-07
      • 2010-10-31
      • 2017-06-21
      • 1970-01-01
      • 2021-01-01
      • 2012-02-06
      相关资源
      最近更新 更多