我想在浏览器中显示当前git提交的哈希,以便测试团队(无权运行heruko命令)将能够在错误报告中包含相应的提交哈希。
首先我尝试了砂砾,但有些东西被破坏了,它在Heroku上不起作用(在本地它很好用,我不知道为什么它在Heroku上失败了。)
所以我发现Heroku上有两个环境变量:
ENV["COMMIT_HASH"]
ENV["LAST_COMMIT_BY"]
但它们都不可用(两者都是零)。
我还查了一下:
heroku config
但同样,两者都未定。
有没有办法检索哈希信息?有没有办法获得更多的git信息,例如日期?
答案 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公钥。
您仍然至少有两个选项。
添加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将允许“预推”钩子,您可以在此处放置此代码。
使用脚本推送您的代码
您可以编写一个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)