Для создания простейшего механизма автодеплоя или «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>
Если статья была Вам полезна, то буду благодарен за клик по рекламе.