現在のgitcommitのハッシュをブラウザーに表示して、テストチーム(herukoコマンドを実行するためのアクセス権がない)が対応するcommitハッシュをバグレポートに含めることができるようにします。
最初にグリットを試しましたが、何かが壊れていて、Herokuでは機能しません(ローカルではうまく機能しますが、Herokuで失敗する理由はわかりません)。
そこで、Herokuには2つの環境変数があることがわかりました。
ENV["COMMIT_HASH"]
ENV["LAST_COMMIT_BY"]
しかし、どちらも利用できません(どちらもゼロです)。
私もチェックしました:
heroku config
しかし、繰り返しますが、どちらも設定されていません。
ハッシュ情報を取得する方法はありますか?たとえば日付など、より多くのgit情報を取得する方法はありますか?
まず、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つのオプションがあります。
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は、代わりにこのコードを置くことができる「プレプッシュ」フックを許可します。
スクリプトを使用してコードをプッシュする
_git Push heroku master
_と入力してコードをプッシュする代わりに、オプション_1.
_の行を含み、最後に_git Push heroku master
_を追加するシェルスクリプトを作成できます。次に、コードをデプロイするために、このシェルスクリプトを実行します。これにより、(各git commitの後ではなく)プッシュする前にのみ_HEAD_HASH
_が更新され、すべてが1か所に適切に保持されます。スクリプトを_.slugignore
_ファイルにも追加することをお勧めします。
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
...
2015-04-01の時点で、Git SHAは、ビルドプロセス内で環境変数SOURCE_VERSIONとして使用できるようになりました。参照: https://devcenter.heroku.com/changelog -items/6
実行中のアプリでは使用できず、コンパイルステップ中のみ使用できることに注意してください。カスタムビルドパックを追加して、これをスラグに保持されているファイルに書き込んでから、アプリケーションからファイルを読み取ることができます。
私はそのアプローチをテストしていて、ここに実験的なビルドパックがあります: https://github.com/sreid/heroku-buildpack-sourceversion
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
git ls-remote heroku
私のために働きます。これは、重複する質問への回答から得られました here 。
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
はあなたが求めているフィールドです。
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
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\"}"