Posterous theme by Cory Watilo

Deploy s gitem, hook a dojmy

Již to nebylo udržitelné. Člověk si udělal nějakou feature do administrace (=upravil vzhled, poladil nějaký šablony) a už musel to nahravávat na dva servery, procházet všechny ty adresáře a podle "barevné tečky" (symbol tortoise gitu) přehrávat soubory na ostrej. Opruz. Při upravě frontendího kódu ani nemluvě, když daná úprava byla ve více třídách a metodách, tzn. pár lidem to muselo spadnout... :(

Tak jsem si nechal na servery nainstalovat git. Výborný tutoriál je zde: http://blog.urbasek.cz/instalace-git-serveru-na-ubuntu/. Pak ale začali problémy při vytváření githooku. Projekt běží v nette a historických důvodu má trošku divnou strukturu adresářů, takže něco jako git reset --hard do ostrých dat určitě dělat nešlo. Skvělou myšlenku mi vnukl hook, který používají signály.cz (pro které programuju) - udělat si bokem deploy adreáře, do něj provádět hookem git reset a posléze provést rsync potřebných souborů. To je již velmi použitelná strategie. V rsyncu si vyberu to, co chcu syncovat, co nechcu ... a jedem. Bylo ještě třeba nastavit parametr "-c", který aktivuje porovnání dle checksum, klasické porovnávání dle timestampu a velikosti není kvůli git resetu možné.

Nu, nicméně vyskytly se další problémy a to práva. Jako nejoptimálnější cestu (a díky za to, že vůbec je možná) jsme zvolili stav, kdy uživatel git (viz. tutorial) ma stejné UID jako uživatel, přes kterého jsem se normálně dříve přihlašoval do konzole (a přes SFTP nahrával soubory). Pouze zařazení do stejné skupiny nebylo dostatečné a zlobilo. Post-receive hook by mohl vypadat nějak takto:

#!/bin/sh

read oldrev newrew refname

if [ $refname = "refs/heads/production" ]; then
        echo "Welcome to git deploy!"
else
        echo "Deploy canceled!"
        exit 1
fi

branch="production"
source="/home/www/example.com-deploy"
target="/home/www/example.com"

unset GIT_DIR

cd $source
git fetch
git reset --hard origin/$branch

rsync \
  --include="/chci_include/.htaccess" \
  --exclude="/__*" \
  --exclude="/.git" \
  -r -p -c --size-only --delete-after  \
  $source/ $target/ 2>/dev/null

echo "Deploy finished!"

exec git-update-server-info

Na závěr přidám ještě příkraz pro deploy z konzole. Protože pushuji na dva servery, mám přidané 2x remote repository:

alias pushOnline='git c production; git merge master;git push origin_cz production;git push origin_sk production;git c master;'
alias gui='git gui&'

Příkaz gui je jen zpříjemněním spuštění dialogu pro commitování. :) Tyto řádky vytvořte (i na Windows ;) v souboru ~/.bashrc
Enjoy, snad to někomu pomůže!