2012-10-13 10 views
11

Was ich tue, denke ich sollte ziemlich einfach sein, aber ich kann nicht herausfinden, wie es funktioniert.Während der Bereitstellung die Git Revisionsnummer in Dateien einfügen

Ich möchte aus zwei Gründen eine eindeutige Versionsnummer in HTML- und Javascript-Dateien einbetten. Der erste Grund ist, dass ich sicherstellen will, dass, wenn die JavaScript-Datei geladen wird, prüft das System nicht, den Cache zu verwenden versuchen, wenn es eine neue Version gibt, aber wenn ich könnte es so etwas wie

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

Ich könnte fast sicher sicherstellen, dass dies nie passiert. Der zweite Grund ist meine Fernfehlerprotokollierung, es wäre gut zu wissen, welche Version des Systems Fehler hat, so dass ich in die Fehlerbehebung schauen kann, ohne diese Versionsnummer bei jeder Bereitstellung manuell aktualisieren zu müssen.

Ich bin auf dem Weg über git describe gestoßen, und ich denke, dass es Ausgangswert wäre wirklich gut dafür geeignet.

Grundsätzlich mag ich wie GIT-CURRENT-VERSION einen Schlüssel in JavaScript und HTML-Dateien zu übernehmen und ersetzen Sie es mit dem Ausgang der git describe

ich Stoff für meine Bereitstellungsmethode bin mit, so dass dies sehr viel Sinn machen würde Mach es auf der Serverseite, nachdem wir die neueste Version von git gepackt haben.

Ich vermute, eine Kombination von sed und grep würde hier den Trick machen, und wenn ich einen Einliner dafür herausfinden könnte, wäre es sehr einfach, zu meinem Bereitstellungsskript hinzuzufügen.

Vielen Dank im Voraus!

+0

Welches Web-Framework verwenden Sie? Ich denke, es gibt bessere Lösungen wie die rekursive Ersetzung von "GIT-CURRENT-VERSION". – guettli

+0

guettli - Ich habe gepostet, was ich am Ende benutzt habe. Ich hoffe es hilft! –

Antwort

5

Man könnte so etwas wie die folgenden von der Wurzel Ihrer entfalteten git Baum tun:

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

(Das ist nur oberflächlicher Tests hatte - mit Vorsicht verwenden.)

Beachten Sie, dass, dass Ihr Baum verlassen mit lokalen Änderungen.

9

Ich habe noch nie von fabric gehört, aber wenn Fabric verwendet (oder ruft) git archive, dann können Sie gitattributes verwenden. Das heißt, können Sie Ihre HTML-Dateien mit so etwas wie haben:

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

Und in .gitattributes auf dem Repository:

*.html export-subst 

Dann, wenn Sie ein Archiv mit git-archive erstellen, $Format:%H$ wird ersetzt durch den Hash des Commits. Sie können verwenden, was mit --pretty-format in git-log verfügbar ist.

Überprüfen Sie das Handbuch von gitattributes, oder viel besser: das Kapitel 8.2 Customizing Git - Git Attributes von Pro Git Buch, um mehr Ideen.

1

Entlang guettlis Kommentar dachte ich, dass ich das Endergebnis posten würde, das ich hatte. Hier ist meine Lösung, basierend auf Mark Longairs Lösung oben.

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" 

Ich werde eine kleine Erklärung geben, was ich hier mache.

export DESCRIPTION="$(git describe)" Ruft die aktuelle Beschreibung des aktuellen Zustands des Git-Repository ab. Weitere Informationen finden Sie unter git describe Manual Page.

Als nächstes können Sie find [PATH] -regextype posix-extended -regex ".*\.(js|html)" -type f -print0 durch die [PATH] mit dem Pfad zu Ihrem Repository ersetzen. -regextype posix-extended -regex ".*\.(js|html)" geht durch Ihre Verzeichnisse und findet alle Dateien, die mit der von ".*\.(js|html)" definierten Regex übereinstimmen. In meinem Fall weiß ich, dass die Ersetzungen nur in Javascript- oder HTML-Dateien erfolgen sollen. Schließlich teilt xargs -0 sed -i "s/CURRENT-GIT-DESCRIPTION/$DESCRIPTION/g" dem System mit, den CURRENT-GIT-DESCRIPTION durch den oben definierten Wert git describe zu ersetzen.

In meinem Fall funktioniert das ziemlich gut, da ich fabric für die Bereitstellung auf dem Server verwende, und weil ich möchte, dass die Änderungen in Echtzeit stattfinden, was ich tue ist das Repository zu aktualisieren, und kopieren Sie es dann in ein neuer Einsatz des Systems Sobald das System bereit ist zu gehen, werde ich die Git-Dateien los, so dass dies nur eine regelmäßige Datenstruktur. Jetzt kann ich dem System nur sagen, dass es den neuen Build verwenden soll und alles ist bereit zu gehen.

Hoffe, dass hilft anderen Menschen, etwas Ähnliches zu erreichen!