Anksčiau rašiau kaip su GIT PUSH komanda atnaujinti projektus ir serveryje įvykdyti automatinius veiksmus. Dažniausiai tai:
- Python, PHP ar kitokio programinio kodo atnaujinimas;
- duomenų bazės migracijos;
- media ir kitų statinių failų atnaujinimai;
- duomenų valymo operacijos (sesijų, kešo);
- trečios šalies programinės įrangos konfigūracijos (pvz. apache/nginx perkrovimas).
Produkcinėje sistemoje norėsis ne tik „atominių“ operacijų (čia pagelbės tik nebent load balancer’ų panaudojimas), bet ir kuo optimaliau atlikti šias operacijas. Nes laikas ypatingai brangus dalykas, tuo labiau produkcinėje sistemoje.
Vienas iš patarimų kaip daryti tokius deployment’us greičiau - vykdyti komandas tik kai tam tikri failai buvo keisti. Pavyzdžiui nenaujinti duomenų bazės, jeigu tarp pakeistų failų nėra migracijų katalogo redagavimų.
O padaryti tokį tikrinimą nėra sunku su post-rewrite
hook’u kurį aprašytume .git/hooks/post-rewrite
faile:
#!/bin/bash
changedfiles=( $(git diff --name-only HEAD@{1} HEAD) )
if [[ "${changedfiles[*]}" =~ "bower.json" ]]; then
bower install && bower update
fi
if [[ "${changedfiles[*]}" =~ "package.json" ]]; then
npm install
fi
if [[ "${changedfiles[*]}" =~ "migrations/" ]]; then
python manage.py migrate
fi
if [[ "${changedfiles[*]}" =~ "migrations/" ]]; then
php vendors/phpmigrations/manage.py migrate
fi
Ir jeigu esate pastabus programuotojas, žinosite, kad reikia suteikti šiam failui vykdymo teises su chmod +x .git/hooks/post-rewrite
.
Trumpi paaiškinimai. Kintamajam changedfiles
priskiriame masyvą pakeistų failų (dėl to ir yra skliaustai apie komandą git diff --name-only HEAD@{1} HEAD
). Vėliau if
sąlygomis tikriniame ar jis turi bent vieną elementą kuris gali atitikti užklausą (operatorius =~
). Ir jeigu atitinka - vykdome komandas. Aukščiau pateikiau ne vieną variantą kuris gali praversi JavaScript, PHP ar kitų kalbų programuotojams. Žinoma, nenaudokite to vien tik migracijoms - panaudokite ir kitoms operacijoms.
Šis post-rewrite
hook’as vykdomas kai vyksta istorijos redagavimas. Jis pavykdys „commit“ žinutės keitimo (git commit --amend
) ar istorijos medžio lipdymo/konstravimo metu (git rebase
).
Jums gali praversti angliškas hook’ų aprašymas GIT dokumentacijoje.