Eine Lösung besteht darin, einen git pre-push-Hook zu verwenden, um einen heroku-Konfigurationswert festzulegen. Da dies vor der Kompilierung von Push und Slugs gemacht wurde, steht die Konfigurationsvariable als ENV var für Ihre Rails-App zur Verfügung.
.git/hooks/pre-push:
#!/bin/sh
remote="$1"
url="$2"
while read local_ref local_sha remote_ref remote_sha
do
if [[ $url =~ heroku ]] ; then
app=$(git remote show -n $remote | sed -n -E -e 's/[[:space:]]+(Push[[:space:]]+URL)(\/|:).+(:|\/)(.*)\.git$/\4/gp')
echo Setting RAILS_CACHE_ID to $local_sha on app $app
heroku config:set RAILS_CACHE_ID=$local_sha --app $app
fi
done
exit 0
Die Pre-push.sample Datei hat eine Dokumentation über die Parameter, die der Haken mit genannt wird. Ich verwende eine ausführliche Ausgabe von git remote, um zu bestimmen, auf welcher App der Konfigurationswert festgelegt werden soll. Die "-E" -Option für sed ist für Mac OS X - wenn Sie GNU sed verwenden, ersetzen Sie diese mit "-r".
Eine andere Lösung ist, die Heroku-API über ein profile.d-Skript zu verwenden, um die eindeutige Release-ID zu erhalten. In diesem Beispiel wird curl verwendet, um mithilfe des RANGE-Headers die neueste Release-ID abzurufen. Es ist nicht die Commit-Referenz, sondern wird für jede Version einzigartig sein, einschließlich Rollbacks und Konfigurationsänderungen. Sie sollten den API_KEY und den APP_NAME als heroku-Konfigurationsvariablen festlegen.
.profile.d/release.sh
# get release id and set as RAILS_CACHE_ID
# Heroku config variables that need to be set
# API_KEY: heroku api key (get from dashboard or `heroku auth:token`
# APP_NAME: set this to your app_name (this could be hardcoded in the profile.d script but
# would make it harder to manage apps with multiple environments
res=$(curl -s -H "Accept: application/vnd.heroku+json; version=3"\
-H "Authorization: Bearer $API_KEY"\
-H "Range: version ..; order=desc, max=1"\
-X GET https://api.heroku.com/apps/$APP_NAME/releases)
release_id=$(ruby -rjson -e "j = JSON.parse('$res'); puts j[0]['id']")
export RAILS_CACHE_ID=$release_id
In der Rails-Anwendung, ENV [ 'RAILS_CACHE_ID'] sollte nun auf die neueste Version ID eingestellt werden. Sie können diese Strategie auch in einem Schieneninitialisierer verwenden.
Nachdem ich die Dyno-Metadaten aktiviert hatte, fügte ich diese Zeile zu 'config/application.rb' hinzu:' ENV ['RAILS_CACHE_ID'] = ENV ['HEROKU_RELEASE_VERSION'] 'Wenn die App hochfährt, wird die Cache-ID auf die Heroku-Version gesetzt Ausführung. Das bedeutet auch, dass beim Ändern von env-Variablen eine neue Cache-ID verwendet wird, aber das ist nicht unbedingt eine schlechte Sache. – Josh