2012-10-13 5 views
11

Quello che sto facendo dovrebbe essere abbastanza semplice, ma non riesco a capire come farlo funzionare.Inserire il numero di revisione git nei file durante l'implementazione

Desidero incorporare un numero di versione univoco nei file html e javascript, per due motivi. La prima ragione è che voglio per assicurare che quando viene caricato il file javascript, il sistema non tenta di utilizzare la cache se c'è una nuova versione, ma se potessi chiamare utilizzando qualcosa di simile

<script src="/app.js?v1.0.1-1-95425234"></script> 

Potrei quasi sicuramente assicurarmi che ciò non accada mai. Il secondo motivo è per la registrazione degli errori in remoto, sarebbe bene sapere quale versione del sistema sta avendo errori in modo che possa cercare di correggerlo in modo appropriato, ma senza dover aggiornare manualmente questo numero di versione su ogni distribuzione.

Mi sono imbattuto nello git describe lungo la strada, e penso che il suo valore di uscita sarebbe davvero adatto per questo.

Fondamentalmente voglio prendere una chiave nella mia javascript e file HTML come GIT-CURRENT-VERSION e sostituirlo con l'uscita di git describe

Sto usando il tessuto per il mio metodo di distribuzione, quindi questo sarebbe fare un sacco di senso fare sul lato server, dopo aver afferrato l'ultima versione di git.

Sospetto che una combinazione di sed e grep farebbe il trucco qui, e se potessi immaginare un solo rivestimento per questo, sarebbe davvero facile aggiungere al mio script di implementazione.

Grazie in anticipo!

+0

Quale framework Web utilizzate? Immagino che ci siano soluzioni migliori come la sostituzione ricorsiva di "GIT-CURRENT-VERSION". – guettli

+0

guettli - Ho pubblicato quello che ho finito usando. Spero che sia d'aiuto! –

risposta

5

Si potrebbe fare qualcosa di simile a quanto segue dalla radice del vostro albero git schierato:

export VERSION="$(git describe)" 
find . -type f -print0 | xargs -0 sed -i "s/GIT-CURRENT-VERSION/$VERSION/g" 

(che ha avuto solo superficiale test - usare con cautela.)

Si noti che che lascerà il vostro albero con modifiche locali.

9

Non ho mai sentito parlare di fabric, ma se fabric usa (o chiama) git archive, allora è possibile utilizzare gitattributes. Cioè, si può può avere i file HTML con qualcosa di simile:

<script src="/app.js?$Format:%H$"></script> 

E in .gitattributes in cima al repository:

*.html export-subst 

Poi, ogni volta che si crea un archivio con git-archive, $Format:%H$ sarà sostituito dall'hash del commit. Puoi utilizzare qualsiasi cosa disponibile con --pretty-format in git-log.

consultare il manuale del gitattributes, o meglio: il capitolo "8.2 Customizing Git - Git Attributes" di Pro Git libro per ottenere più idee.

1

Lungo il commento di Guettli, ho pensato di pubblicare il risultato finale che avevo. Ecco la mia soluzione, basata sulla soluzione di Mark Longair sopra.

export DESCRIPTION="$(git describe)" 
find [PATH] -regextype posix-extended -regex ".*\.(js|html)" -type f -print0 | xargs -0 sed -i "s/CURRENT-GIT-DESCRIPTION/$DESCRIPTION/g" 

Darò una piccola spiegazione di quello che sto facendo qui.

export DESCRIPTION="$(git describe)" Ottiene la descrizione corrente dello stato corrente del repository git. Per ulteriori informazioni, consulta lo git describe Manual Page.

Successivamente, find [PATH] -regextype posix-extended -regex ".*\.(js|html)" -type f -print0 è possibile sostituire con il [PATH] con il percorso del repository. -regextype posix-extended -regex ".*\.(js|html)" scende attraverso le directory e trova tutti i file che corrispondono alla regex definita da ".*\.(js|html)". Nel mio caso, so che voglio solo che le sostituzioni si verifichino in file javascript o html. Infine, xargs -0 sed -i "s/CURRENT-GIT-DESCRIPTION/$DESCRIPTION/g" indica al sistema di sostituire lo CURRENT-GIT-DESCRIPTION con il valore definito da git describe in precedenza.

Nel mio caso, questo funziona abbastanza bene, poiché sto usando fabric per la distribuzione sul server, e poiché voglio che le modifiche avvengano in tempo reale, quello che faccio è aggiornare il repository, e quindi copiarlo in un nuova implementazione del sistema. Una volta che il sistema è pronto, mi libero dei file di dati git, lasciando questa come una normale struttura dati. Ora posso solo dire al sistema di usare la nuova build e tutto è pronto per partire.

La speranza che aiuta le altre persone che cercano di raggiungere qualcosa di simile!