GIT Hook'o paleidimas pasikeitus failams

2016 sausio 19 d. GIT

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.