sabato, settembre 08, 2018

Git Hooks - A way to automate deploy tasks

During my work I use git for automate the deploy on production system. Sometimes I need execute some command or script immediately after checkout. Git has a very powerful mechanism called hooks (you can read more about it on official documentation follow this link).
On client side to install hooks what you have to do is to create a dir called hooks under .git/ . But  you do not have to do any of this because when you have initialized your project git create it for you.
If you list the content of hooks dir you can found a list of samples script to use (all of them are bash scripts). Most of this script start with the prefix  pre- or post- followed by action name.
The script that I found helpful is post-checkout that is automatically executed after a successful git checkout. My post-checkout script contain commands for adjust permissions on files and ask to restart web server.

#!/bin/bash
git ls-files -z --with-tree="$2" --directory | xargs -0 chmod o-rxw --
git ls-files -z --with-tree="$2" --directory | xargs -0 chown www-data:www-data --
find . -type d | xargs -I {} chown www-data:www-data {}
find . -type d | xargs -I {} chmod o-rwx {}
exec < /dev/tty

while true;
   do
      read -p "Do you want to restart apache?  [Y/N]:" choice
      case "$choice" in
         y|Y) service apache2 restart;break;;
         n|N) break;;
         *) echo "invalid" && break;;
      esac
   done

Remember to add execute permission to this script or git won't execute it after the checkout.