Automatyczna aktualizacja websajtu a Git

Posted on Wed 22 September 2021 in Hacks (wannabe)

Chodzi o to, żeby po wprowadzeniu zmian w repozytorium, zmiany te propagowały się na website na zdalnym serwerze.

Nie jest zupełna automatyzacja bo połączenie VPN nawiązywane jest ręcznie. Korzystam już od dawna ze skryptu, który podnosi VPN-a ale w tym rozwiązaniu jeszcze tego nie zaimplementowałem.

W całym tym bałaganie korzystam z hooka i repozytorium pośredniczącego. Hook, jakby ktoś nie wiedział, to skrypt odpalający jakieś akcje przed lub po wykonaniu czegoś w repozytorium, w tym przypadku będzie to post-receive czyli aktualizacji repo.

Na serwerze docelowym w homedirze swojego użytkownika (tu: paczor) tworzę folder o nazwie np. "intersite" i inicjuję w nim repozytorium pośredniczące git-a:

mkdir ~/inersite
cd ~/intersite
git init --bare

Na tym samym serwerze pliki website'u znajdują się w defaultowej lokalizacji Apache'a na Ubuntu czyli /var/www/html, w tym przypadku niech będzie to folder o nazwie "website":

sudo mkdir /var/www/html/website

Dodaję swojego użytkownika do grupy www-data:

sudo usermod -a -G www-data paczor

Nadaję grupie www-data uprawnienia do zapisu w folderze website'u:

sudo chmod g+w /var/www/html/website

W repozytorium pośredniczącym tworzę hook post-receive:

cat ~/intersite/hooks/post-receive↲
#!/bin/sh
git --work-tree=/var/www/html/website --git-dir=/home/paczor/intersite -f mojwebsite

Jeszcze nadanie bitu wykonywalności dla skryptu:

chmod +x ~/intersite/hooks/post-receive

W lokalnym repozytorium, czyli tym w którym pracuję, czyli np. na laptopie w VIM-ie czy Visual Code - może ich być kilka, na różnych komputerach - muszę dodać to nowe repozytorum pośredniczące:

git remote add mojwebsite ssh://paczor@ip_serwera/home/paczor/intersite

Po wypchnięciu zmian na główne repozytorium (często Github [GitGułag]):

git push

wypycham zmiany na repozytorum pośredniczące:

git push mojwebsite

i wtedy dzieje się cała magia czyli uruchamiany jest skrypt post-receive, który aktualizuje folder /var/www/html/webiste.