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

guy*_*oni 40 git ruby-on-rails heroku

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

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

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

ENV["COMMIT_HASH"]
ENV["LAST_COMMIT_BY"]
Run Code Online (Sandbox Code Playgroud)

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

我还检查过:

heroku config
Run Code Online (Sandbox Code Playgroud)

但同样,两者都未定.

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

den*_*arg 68

现在可以在没有联系Heroku的情况下尝试Roberto在他的回答中写的Heroku功能.它被称为Heroku实验室:Dyno元数据,您可以通过它启用它

heroku labs:enable runtime-dyno-metadata -a <app name>
Run Code Online (Sandbox Code Playgroud)

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

~ $ 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
...
Run Code Online (Sandbox Code Playgroud)

  • 这应该是最佳答案 (4认同)
  • 不幸的是,如果您使用Heroku Pipelines,这似乎不起作用.当您执行基于git-push的部署时,似乎只能初始化/更新`HEROKU_SLUG_COMMIT`. (3认同)
  • 当使用Heroku Pipelines升级构建时,看起来这些env变量现在可用于其他应用程序。 (2认同)

cul*_*lix 20

首先,由于在slug编译期间heroku "删除[s]未使用的文件,包括.git目录",你将无法从应用程序目录(在heroku dyno)中执行一些git命令.这包括类似的东西git rev-parse HEAD,这通常是获取当前哈希的简单方法.

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

您仍然至少有两个选项.

  1. 添加post-commit钩子以更新哈希值.

    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.如果您的网络连接不存在,则不会更新变量.谣言是,git 1.8.2将允许一个'pre-push'钩子,你可以放置这个代码.

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

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


小智 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


小智 7

Heroku 容器上有一个名为的 env var SOURCE_VERSION

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

你可以用那个!


jos*_*hwa 6

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
Run Code Online (Sandbox Code Playgroud)


Tim*_*ott 5

git ls-remote heroku为我工作。我是从这里对一个重复问题的回答中得到的。

  • 忘记OP,这就是我需要知道的。 (3认同)