2014-12-12 6 views
6

Ist es möglich, einen eindeutigen Schlüssel pro Slug/Release von einem laufenden Dyno zu bekommen? Ich war im Anschluss an diesem article Setup RAILS_CACHE_ID (für etags nach Einsätzen auslaufend) fanden aber, dass die dynos nicht mehr mit GIT versenden konfiguriert (die diesen Fehler verursacht):Get Heroku Release-Nummer/Code-Version von einem laufenden Dyna

fatal: Not a git repository (or any parent up to mount point /app) 
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set). 

Ich halte es auch in einem config/initializers zu der Einstellung, aktuelle Zeit, aber das würde natürlich nicht über mehrere Dynos funktionieren. Irgendwelche Ideen?

Antwort

9

Es gibt eine neue (Nov 2015) Labors verfügen über die tut genau das, was Sie "Dyno-Metadaten" benötigen https://devcenter.heroku.com/changelog-items/768

heroku labs:enable runtime-dyno-metadata -a <app name> 

Dann auf Heroku:

~ $ 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 
+0

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

0

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.

+0

Dank dieser Art von Arbeiten aber nicht Support Roll-Backs/Roll-Forwards –

+0

Ja, das ist eine ziemlich große Einschränkung, die ich nicht berücksichtigt habe. Siehe aktualisierte Antwort für eine .profile.d Version –

+0

Danke für das Update. Ich schätze, die einzige Einschränkung hier ist, wenn die API jemals nicht antworten kann, muss eine Wiederholungslogik hinzugefügt werden. Hoffentlich fügt Heroku eine einfachere Möglichkeit hinzu, dies in Zukunft zu tun. –

Verwandte Themen