Heroku - 显示当前提交的哈希值

时间:2013-01-29 12:47:49

标签: ruby-on-rails git heroku

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

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

所以我发现Heroku上有两个环境变量:

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

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

我还查了一下:

heroku config

但同样,两者都未定。

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

9 个答案:

答案 0 :(得分:61)

现在可以在没有联系Heroku的情况下尝试Roberto在他的回答中写的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
...

答案 1 :(得分:18)

首先,由于在slug编译期间heroku "remove[s] unused files, including the .git directory",你将无法从应用程序目录中(在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 dynos上。您无权安装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 config:set $ hash_name = $ hash --app yourappname

    (你可以使用你想要的任何git钩子代码;这只是一个选项)

    <强>解释

    • HEAD_HASH是heroku环境变量的名称。随便打电话给你。您将在主应用程序中查看并在页面上显示它。
    • git rev-parse HEAD抓取当前HEAD提交的哈希值。根据您想要显示的内容自定义此行。


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

  2. 使用脚本推送您的代码

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

答案 2 :(得分:17)

截至2015-04-01,Git SHA现在在构建过程中可用作环境变量SOURCE_VERSION。请参阅:https://devcenter.heroku.com/changelog-items/630

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

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

答案 3 :(得分:6)

Git&gt; 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 :(得分:5)

git ls-remote heroku适合我。我从一个重复的问题here的回答中得到了这个。

答案 5 :(得分:2)

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

..所以release.commit是你追求的领域。

答案 6 :(得分:1)

culix和joshwa都有很好的答案。如果您将heroku git遥控器命名为与相应的heroku应用程序相同,则可以使用更短且更强大的.git/hooks/pre-push挂钩:

#!/bin/sh

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

答案 7 :(得分:1)

如果您使用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\"}"

答案 8 :(得分:0)

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

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

您可以使用它!