GIT jako deployment w wersji 3.0

Tajemniczy tytuł. Ale dużo tajemnic związanych z tym tematem nie będzie. Ale od początku...

Tworząc aplikacje webowe lub takie, które wymagają bycia na serwerze, stykamy się z problemem deploymentu (wrzuceniu na serwer). Ktoś pomyśli, też mi problem... wrzucam przez FTP i po problemie.

Może i tak, ale mnie to rozwiązanie zaczęło powoli męczyć, zwłaszcza jak muszę wrzucać do odpowiednich katalogów pliki (nie wszystko mogę ot tak nadpisać).

Szukałem jakiegoś rozwiązania, które miałem właściwie pod nosem.

Jest nim GIT. Na początku się bałem stosować go jako system do deploymentu, ponieważ na Windowsie używałem graficznego klietna - Tortoise GIT. Na serwerze mamy tylko konsole.

Jednak nie taki diabeł straszny i można szybko przyzwyczaić się do pracy z konsolą. Już nawet na Windowsie nie korzystam z Tortoise GIT (ma to dodatkowy plus, bo gdzie nie pójdę tam będę umiał korzystać z GITa :) ).

Ale do rzeczy. Utworzyłem sobie specjalny branch o nazwie deployment, który będzie mi służył jako branch z plikami, które chcę, aby były na serwerze.

Ale jest jeden problem... musze teraz jakoś utworzyć na serwerze repozytorium GITa z już istniejącymi plikami. Jak to zrobić? Bardzo prosto. Poniżesz polecenia robią wszystko, co potrzebujemy:

  1. git init
  2. git remote add origin GIT_ORIGIN_URL
  3. git fetch
  4. git checkout -f deployment

Krótkie wytłumaczenie:

git init

Inicjujemy puste repozytorium na serwerze.

git remote add origin GIT_ORIGIN_URL

Dodajemy zdalne repozytorium do naszego lokalnego

git fetch

Pobieramy informacje na temat branchy i commitów.

git checkout -f deployment

Przełączamy się na brancha deployment (parametr -f wymusza to, inaczej dostaniemy informacje, że nie ma w repozytorium lokalnym żadnego brancha)

To tyle. Teraz wystarczy, że w środowisku programistycznym wrzucę pliki do repo (git push) a na serwerze zrobię git pull i mogę cieszyć się poprawną strukturą katalogów :)

Dodatkowo można wyrzkostać git hook'i dzięki krótym po wykonaniu operacji commit'a, push'a czy pull'a wykona się jakieś polecenie z powłoki (w moim przypadku jest to wyczyszczenie cache).

Wypada mi dodać, jako że wspomniałem o tych hook'ach, jakiś mały przykład.

W folderze .git/hooks zakładamy np plik post-merge nadajemu mu uprawnienia do wykonywania (chmod +x). Teraz po wykonaniu pull lub merge zawartość (polecenia w bashu) zostaną wykonane. W moim przypadku jest to usunięcie cache.