web-dev-qa-db-ja.com

Heroku-現在のコミットのハッシュを表示します

現在のgitcommitのハッシュをブラウザーに表示して、テストチーム(herukoコマンドを実行するためのアクセス権がない)が対応するcommitハッシュをバグレポートに含めることができるようにします。

最初にグリットを試しましたが、何かが壊れていて、Herokuでは機能しません(ローカルではうまく機能しますが、Herokuで失敗する理由はわかりません)。

そこで、Herokuには2つの環境変数があることがわかりました。

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

しかし、どちらも利用できません(どちらもゼロです)。

私もチェックしました:

heroku config

しかし、繰り返しますが、どちらも設定されていません。

ハッシュ情報を取得する方法はありますか?たとえば日付など、より多くのgit情報を取得する方法はありますか?

40
guyaloni

まず、serugのコンパイル中にheroku "remove [s] .gitディレクトリを含む未使用のファイル" があるため、アプリのディレクトリ(heroku dyno内)から一部のgitコマンドを実行できません)。これには、通常、現在のハッシュを取得する簡単な方法である_git rev-parse HEAD_などが含まれます。

次に、heroku dynoで_git ls-remote_を使用して情報を取得しようとすると、sshが呼び出され、heroku公開鍵がheroku dynoにインストールされていないため、The authenticity of Host 'heroku.com (50.19.85.132)' can't be establishedというメッセージが表示されます。 heroku公開鍵をインストールする権限がありません。

まだ少なくとも2つのオプションがあります。

  1. post-commit hook を追加して、ハッシュ値を更新します。

    a)ファイルを作成または編集する_.git/hooks/post-commit_
    b)次のようなシェルスクリプトコードを追加します。

    hash_name = HEAD_HASH
    ハッシュ= $(git rev-parse HEAD)
    echo設定$ hash_nameを$ hashに
    heroku config:set $ hash_name = $ hash --app yourappname

    (gitフックには任意のコードを使用できます。これは1つのオプションにすぎません)

    説明:

    • _HEAD_HASH_は、heroku環境変数の名前です。好きなように呼んでください。これをメインアプリで調べて、ページに表示します。
    • _git rev-parse HEAD_は、現在のHEAD commitのハッシュを取得します。表示するものに合わせてこの行をカスタマイズします。


    gitにコミットすると、_HEAD_HASH_ envvarが毎回更新されるようになりました。これは機能しますが、コミットするたびにherokuがenv varを設定するのを待つので、少し遅いかもしれません。ネットワーク接続が切断されている場合など、変数は更新されません。 うわさは そのgit 1.8.2は、代わりにこのコードを置くことができる「プレプッシュ」フックを許可します。

  2. スクリプトを使用してコードをプッシュする

    _git Push heroku master_と入力してコードをプッシュする代わりに、オプション_1._の行を含み、最後に_git Push heroku master_を追加するシェルスクリプトを作成できます。次に、コードをデプロイするために、このシェルスクリプトを実行します。これにより、(各git commitの後ではなく)プッシュする前にのみ_HEAD_HASH_が更新され、すべてが1か所に適切に保持されます。スクリプトを_.slugignore_ファイルにも追加することをお勧めします。

20
culix

Robertoが答えで書いたHerokuの機能をHerokuに連絡せずに試すことができるようになりました。これは Heroku Labs:Dynoメタデータ と呼ばれ、次の方法で有効にできます。

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
...
73
dentarg

2015-04-01の時点で、Git SHAは、ビルドプロセス内で環境変数SOURCE_VERSIONとして使用できるようになりました。参照: https://devcenter.heroku.com/changelog -items/6

実行中のアプリでは使用できず、コンパイルステップ中のみ使用できることに注意してください。カスタムビルドパックを追加して、これをスラグに保持されているファイルに書き込んでから、アプリケーションからファイルを読み取ることができます。

私はそのアプローチをテストしていて、ここに実験的なビルドパックがあります: https://github.com/sreid/heroku-buildpack-sourceversion

18
srtech

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
6
joshwa

git ls-remote heroku私のために働きます。これは、重複する質問への回答から得られました here

5
Tim Scott

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はあなたが求めているフィールドです。

2
Roberto Tyley

HerokuコンテナにはSOURCE_VERSIONという環境変数があります

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

使えます!

2
TVG

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
2
groovecoder

CIを使用していて、そこでHerokuクライアントにアクセスできない場合は、HerokuAPIを直接使用することもできます。

これは私が使用したソリューションです 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\"}"
1
Beau