2012-10-13 5 views
11

Co robię, myślę, że powinno być dość proste, ale nie mogę się dowiedzieć, jak to zrobić.Wstawianie numeru wersji git do plików podczas wdrażania

Chcę osadzić unikalny numer wersji w plikach html i javascript z dwóch powodów. Pierwszym powodem jest to, że chcę, aby upewnić się, że gdy plik JavaScript jest załadowany, system nie próbować używać pamięci podręcznej, czy jest nowa wersja, ale jeśli mogę to tak nazwać używając coś jak

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

Niemal na pewno mogłem się upewnić, że to się nigdy nie zdarzy. Drugi powód jest dla mojego zdalnego rejestrowania błędów, dobrze byłoby wiedzieć, jaka wersja systemu ma błędy, dzięki czemu mogę zajrzeć do poprawiania go odpowiednio, ale bez konieczności aktualizacji tego numeru wersji ręcznie przy każdym wdrożeniu.

Po drodze natknąłem się na git describe i myślę, że jego wartość wyjściowa byłaby bardzo do tego odpowiednia.

Zasadniczo chcę wziąć klucz w moim JavaScript i plików html jak GIT-CURRENT-VERSION i zastąpić ją z wyjściem git describe

używam tkaniny dla mojego sposobu wdrażania, więc to by zrobić wiele sensu po stronie serwera, po pobraniu najnowszej wersji gita.

Podejrzewam, że niektóre kombinacje sed i grep mogłyby zrobić lewy tutaj, a gdybym mógł znaleźć jeden liner do tego, byłoby naprawdę łatwo dodać do mojego skryptu wdrażania.

Z góry dziękuję!

+0

Z jakich frameworków internetowych korzystasz? Sądzę, że istnieją lepsze rozwiązania, takie jak rekurencyjne zastąpienie "GIT-CURRENT-VERSION". – guettli

+0

guettli - napisałem, czego użyłem. Mam nadzieję, że to pomoże! –

Odpowiedz

5

Można zrobić coś jak następuje z korzenia swojej wdrożonej drzewa git:

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

(to miał tylko pobieżne badanie - korzystania z ostrożnością.)

Uwaga że pozostawi swoje drzewo z lokalnymi modyfikacjami.

9

nigdy nie słyszał o fabric, ale jeśli używa tkanin (lub połączenia) git archive, a następnie można użyć gitattributes. Oznacza to, że można może mieć swoje pliki HTML z czymś takim:

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

I .gitattributes na górze repozytorium:

*.html export-subst 

Potem, kiedy utworzyć archiwum z git-archive, $Format:%H$ będzie zastąpione hashiem zatwierdzenia. Możesz użyć tego, co jest dostępne z --pretty-format w git-log.

Sprawdź podręcznik gitattributes lub znacznie lepiej: rozdział 8.2 Customizing Git - Git Attributes z Pro Git książki, aby uzyskać więcej pomysłów.

1

Wzdłuż komentarza guettli, pomyślałem, że zamieściłem końcowy wynik, który miałem. Oto moje rozwiązanie, oparte na powyższym rozwiązaniu Marka Longaira.

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" 

Dam wyjaśnienie, co tu robię.

export DESCRIPTION="$(git describe)" Pobiera bieżący opis bieżącego stanu repozytorium git. Aby uzyskać więcej informacji, sprawdź numer git describe Manual Page.

Następnie, find [PATH] -regextype posix-extended -regex ".*\.(js|html)" -type f -print0 można zamienić na [PATH] ścieżką do repozytorium. -regextype posix-extended -regex ".*\.(js|html)" schodzi z katalogów i znajduje wszystkie pliki pasujące do wyrażenia zdefiniowanego przez ".*\.(js|html)". W moim przypadku wiem, że chcę tylko zastąpienia występować w javascript lub pliki html. Ostatecznie xargs -0 sed -i "s/CURRENT-GIT-DESCRIPTION/$DESCRIPTION/g" mówi systemowi, aby zastąpił CURRENT-GIT-DESCRIPTION wartością zdefiniowaną powyżej przez git describe.

W moim przypadku działa to całkiem dobrze, ponieważ używam fabric do wdrażania na serwerze, a ponieważ chcę, aby zmiany następowały w czasie rzeczywistym, aktualizuję repozytorium, a następnie kopiuję je do nowe wdrożenie systemu. Gdy system jest gotowy do pracy, pozbywam się plików danych git, pozostawiając to jako zwykłą strukturę danych. Teraz mogę po prostu powiedzieć systemowi, aby używał nowej wersji i wszystko jest gotowe.

Nadzieję, że pomaga innym ludziom, którzy chcą osiągnąć coś podobnego!