GitLab и авто-деплой

Иногда возникает необходимость, чтобы изменения после добавления их на GitLab автоматически обновлялись на удалённом сервере. В моём случае необходимо, чтобы код создаваемого мной сайта автоматически при внесении обновлений в GitLab в ветку dev автоматически разворачивались на веб-сервере для тестирования результатов. Далее идёт небольшая инструкция как сделать это в GitLab, установленном по предыдущей статье.Не смог придумать нормального короткого названия для данной статьи.

У каждого проекта есть директория hooks (/var/lib/git/repositories/user/MyProject.git/hooks) для скриптов, запускающихся на определённые события (например, обновления). В эпоху geolite здесь хранились индивидуальные для каждого проекта скрипты, но с приходом gitlab-shell она стала симлинком на  /usr/share/gitlab-shell/hook в которой содержатся активируемые на события скрипты, общие для всех репозитариев. Это создавало значительные неудобства, но в gitlab-shell v.2.2.0 появилась возможность добавлять свои скрипты, индивидуальные для каждого проекта, в папку custom_hooks (/var/lib/git/repositories/user/MyProject.git/custom_hooks).

Необходимо создать исполняемый скрипт /var/lib/git/repositories/user/MyProject.git/custom_hooks/post-receive

#!/bin/sh

while read oldrev newrev refname
do
    REPO="git@git.server.ru:user/MyProject.git"
    BRANCH=`echo $refname | sed -n 's/^refs\/heads\///p'`
    BRANCH_DIR="/var/www/site"
    SSH_ARGS="-i /var/lib/git/.ssh/id_rsa"
    SSH_DEST="user@www.server.ru"

    # echo oldrev: $oldrev
    # echo newrev: $newrev
    # echo refname: $refname

    # If working on the dev branch, its really production and should go to server
    if [ "$BRANCH" == "dev" ] ; then
        BRANCH_REAL="htdocs"
        if [ "$newrev" -eq 0 ] 2> /dev/null ; then
            # branch is being deleted
            echo "Deleting remote branch $BRANCH_DIR/$BRANCH_REAL"
            ssh $SSH_ARGS $SSH_DEST /bin/sh +x < cd $BRANCH_DIR && rm -rf $BRANCH_REAL
        else
            # branch is being updated
            echo "Updating remote branch $BRANCH_DIR/$BRANCH_REAL"
            ssh $SSH_ARGS $SSH_DEST /bin/sh +x <<-EOF
{ cd $BRANCH_DIR/$BRANCH_REAL && git pull origin $BRANCH ; } || { mkdir -p $BRANCH_DIR && cd $BRANCH_DIR && git clone $REPO $BRANCH_REAL && cd $BRANCH_REAL && git checkout -b $BRANCH origin/$BRANCH ; }
EOF

        fi
    fi
done