← Все посты

Простая система деплоя на основе хуков gitolite для PHP

Пост • 24.03.2015 18:26
Веб разработка Администрирование FreeBSD
#gitolite #git #repositories #push to deploy #git push #git commit #hooks #post-receive

push to deployДля создания простейшего механизма автодеплоя или "push to deploy", воспользуемся системой хуков gitolite репозиториев. Хуки представляют собой файлы лежащие внутри репозитория в папке hooks и реагирующие на определенные события связанные с репозиторием. В нашем случае нам нужен хук post-receive. Как можно догадаться из названия, он срабатывает сразу после обработки нового коммита в репозитории. Материал по установке самой системы gitolite мы рассматривали в прошлый раз.

Для создания хука подключимся по SSH к машине с репозиторием и перейдем в папку с хуками
cd /home/git/repositories/newproject.git/hooks
Создадим там файл самого хука
touch /home/git/repositories/newproject.git/hooks/post-receive
И сделаем его исполняемым
chmod u+x post-receive
Теперь добавим код обновления рабочей копии в созданный хук
#!/bin/bash
#CONFIG
LIVE="/home/www/our_site/"

read oldrev newrev refname
if [ $refname = "refs/heads/master" ]; then  
    echo "===== DEPLOYING TO LIVE SITE ====="  
    cd $LIVE
    git pull origin master
    echo "===== DONE ====="
fi

 Для сброса всех изменений которые могли оказаться в рабочей копии перед коммитом можем добавить команду

git reset --hard

Так же если при разработке проекта используется composer, то можно обновлять и его зависимости

composer update

Таким образом хук может выглядеть следующим образом

#!/bin/bash
#CONFIG
LIVE="/home/www/our_site/"

read oldrev newrev refname
if [ $refname = "refs/heads/master" ]; then  
    echo "===== DEPLOYING TO LIVE SITE ====="  
    cd $LIVE
    umask 002
    git reset --hard
    git pull origin master
    composer update
    echo "===== DONE ====="
fi

umask ставится в зависимости от пользователя под которым запущен сервер, если это тот же пользователь от которого делается pull, то маска должна быть 022. Если  в одной группе - 002 и если это никак не связанные пользователи - 000

Теперь после каждого коммита в ветку master репозитория будет исполняться наш хук и соответственно будет обновляться и рабочая копия нашего сайта.

Важное замечание по безопасности при работе с git

Всегда закрывайте папку .git в корне вашего сайта от посторонних глаз. В большинстве современных систем папка работы веб-сервера не настроена на корневую папку сайта (обычно это или web или public_html в корневой папке сайта), но иногда получается так, что папка .git оказывается доступна снаружи - http://bigmistake.ru/.git/ Проще всего запретить к ней доступ правами:
chmod -R og-rx /home/www/bigmistake/.git
Так же в папку .git можно положить файл .htaccess содержащий текст: Deny from all

 Для полной блокировки папки на всем сервере добавим следующие строки в конфиг сервера

<Files ".git">
Order Deny,Allow
Deny from all
</Files>

 Если статья была Вам полезна, то буду благодарен за клик по рекламе.