2014-10-31 9 views
5

Mi piacerebbe il runtime di my Heroku app (Riproduci/Scala, in esecuzione su Heroku Cedar) per poter riferire a me quale git commit è stato creato. Apps Heroku sono generalmente costruite dal compilatore lumaca sulle infrastrutture di Heroku - purtroppo, il compilatore lumaca fa questo come parte di questo processo di compilazione:Il runtime di un'app di Heroku può sapere che è un ID commit?

rimuovere i file inutilizzati, tra cui directory .git, .gitmodules file, qualsiasi cosa in log e tmp e qualsiasi cosa specificata in un file .slugignore di livello superiore .

... quindi le informazioni Git non è più disponibile per il plugin sbt-buildinfo sto usando per registrare il git commit.

Come registrare l'HEAD commit nello slug? C'è una variabile di ambiente disponibile con queste informazioni?

+1

È possibile inserire un hook post-checkout nel repository che registra l'ID da qualche parte non verrà cancellato. Per ottenerlo automaticamente quando cloni/init, inseriscilo nel tuo repository template. – jthill

+0

@jthill Non sono sicuro di capire - gli hook sul lato client non vengono copiati quando si clona un repository, quindi come farebbero ad accedere al compilatore slug? http://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks#Client-Side-Hooks ... intendi qualcosa di particolare da 'template repo', oltre che essere il luogo in cui il il codice dell'app si trova? I modelli –

+0

sono una caratteristica git, quando si esegue 'git init' o' git clone' git copia il contenuto iniziale da una directory di template. Il modello di default contiene esempi di hook, ad esempio. Quindi, qualunque processo stia creando quei repository che il compilatore di slug sta pulendo, sta anche facendo un checkout per i contenuti. Fai in modo che il template pronti contro termine che processa usi abbia il gancio checkout che desideri. – jthill

risposta

3

tre opzioni diverse, meglio prima ...

SOURCE_VERSION variabile d'ambiente (build-time)

Dal 1 ° aprile 2015, c'è una variabile di ambiente SOURCE_VERSION disposizione di build in esecuzione su Heroku. Per git-push costruisce, questo è il git commit SHA-1 della sorgente in corso di costruzione:

https://devcenter.heroku.com/changelog-items/630

(grazie a @srtech per pointing that out!)

/etc/heroku/dyno file di metadati (run -time)

Heroku hanno beta funzionalità per scrivere un file di metadati /etc/heroku/dyno sul vostro banco di prova in esecuzione. Se si invia un'e-mail all'assistenza, è probabile che tu possa essere aggiunto alla versione beta. Ecco un luogo dove Heroku stessi lo usano:

https://github.com/heroku/fix/blob/6c8ab7a/lib/heroku_dyno_metadata.rb

Il contenuto simile a questa:

{ 
    "dyno":{ 
     "physical_id":"161bfad9-9e83-40b7-b385-78305db2f168", 
     "size":1, 
     "name":"run.7145" 
    }, 
    "app":{ 
     "id":null 
    }, 
    "release":{ 
     "id":50, 
     "commit":"2c3a0b24069af49b3de35b8e8c26765c1dba9ff0", 
     "description":null 
    } 
} 

..quindi release.commit è il campo che stai cercando.

SBT-specifica: utilizzare sbt-heroku per costruire slug localmente

La mia soluzione iniziale era quello di utilizzare il plugin sbt-heroku pubblicato da Heroku stessi. Ciò significa che non è più necessario distribuire lo git push (con lo slug compilato sull'infrastruttura di Heroku), ma invece compilare lo slug localmente e caricarlo direttamente su Heroku. Poiché lo slug è compilato localmente, nel mio repository di lavoro, le informazioni Git sono tutte lì e il processo di compilazione può easily identify the commit id e lo incorporo nel codice dell'app.

Lo slug è di dimensioni notevolmente maggiori rispetto a un Git diff (90 MB contro 0,5 KB), ma a parte questo la soluzione funziona abbastanza bene. In realtà sto usando Travis per fare la distribuzione continua, e quindi Travis stava facendo il sbt stage deployHeroku per me (l'ID di commit Git è disponibile in quell'ambiente durante la costruzione), il che significa che potrei git-push dal mio portatile in movimento, e Travis carica il grande slug su Heroku.

+1

Per ora, quel file '/ etc/heroku/dyno' (anche se ancora in alpha) può essere abilitato con il comando' heroku labs: enable runtime-dyno-metadata'. – MarSoft

+0

Inoltre (appena notato), quando abiliti quel parametro, otterrai anche diverse variabili di ambiente pre-riempite, incluso 'HEROKU_SLUG_COMMIT' che contiene il valore SHA completo. Per quanto mi riguarda, sembra molto più facile accedere al file json. – MarSoft

0

Esegui un checkout filter (also known as a "smudge") sul codice e incorpora HEAD SHA in un file di configurazione per la tua app.

+0

Simile alla soluzione di @ jthill, penso che questo richieda l'override del compilatore di slug eseguito da Heroku per assicurare che il 'filtro' sia presente nel repository clonato - da il collegamento nella tua risposta: "Devi stare attento, però, perché il file .gitattributes è impegnato e passato con il progetto, ma il driver (in questo caso, dater) non lo è, quindi non funzionerà ovunque ". –

Problemi correlati