Как организовать синхронизацию сайта с bare-репозиторием на сервере?

Здравствуйте.

Установил gitolite на сервер (под пользователем git). В "/home/git/repositories/site.com.git" лежит bare-репозиторий сайта с ветками "master" и "test". Также есть папка "site.com", где лежит сайт, и папка "test.site.com", где лежит тестовая версия сайта, владелец - user.
Теперь проблема: как правильно сихронизировать файлы сайта и его тестовой версии с репозиторием?
Создать в папках с сайтом и тестовой версией по репозиторию, и написать хук, который при пуше в в ветку master bare-репозитория пушит в папку с сайтом, а при пуше в ветку test пушит в папку с тестовой версией?
Или есть более умные и проверенные временем способы?
  • Вопрос задан
  • 3416 просмотров
Решения вопроса 1
@kaasius
Только не пушит, а переходит в нужный каталог и делает оттуда pull.

Например так:
branch=$(git rev-parse --symbolic --abbrev-ref $1)
if [ $(git rev-parse --is-bare-repository) = true ]
then
    rep=$(basename "$PWD"|sed 's/.git//')
else
    rep=$(basename $(readlink -nf "$PWD"/..|sed 's/.git//'))
fi

/home/scripts/git/post-update.sh $rep $branch


И в post-update.sh например так:
#!/bin/sh
DATADIR=/var/www/$1/$2
REPO=$1
BRANCH=$2

if [ ! -d $DATADIR ]
then
    mkdir -p $DATADIR
    git clone gituser@example.com:$REPO $DATADIR
    cd $DATADIR
    git checkout $BRANCH
else
    cd $DATADIR
    /usr/bin/git config user.email "deploy@local"
    /usr/bin/git config user.name "Deploy Robot"
    /usr/bin/git fetch origin
    /usr/bin/git reset --hard origin/$BRANCH
    /usr/bin/git stash
    /usr/bin/git checkout
    /usr/bin/git pull    
fi


Ну, можно еще сверху навернуть создание виртуалхостов в апаче, или удаление удаляемых веток.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
AMar4enko
@AMar4enko
Проще всего это сделать через веб-запрос.
Напишите хуки, которые будут дергать url по заданному адресу, в самом сайте сделайте обработку этого запроса, чтобы делал git pull.
У вас ситуация, конечно, попроще - репозиторий и деплой на одной машине, но этот способ наиболее универсальный.
Да и на будущее пригодится, если будете делать автодеплой с битбакета, например. Там вам вручную хуки писать не дадут, зато у них есть готовый хук c http-запросом.
Ответ написан
Комментировать
Универсальным решением будет использование сервера непрерывной интегации (Continuous Integration), например Jenkins.
Сделайте на нем 2 задания, одно для ветки master, второе для вертки test. В этих заданиях в ответ на появление коммитов в ветке сделайте публикацию на сайт по SSH, FTP или простым копированием.
Преимуществом подхода является то, что вся информация о deployment сосредоточена в одном месте - заданиях Jenkins, для разных проектов можно по разному организовать выкладку файлов на сервер, но принципиально задания будут одинаковыми.
Если пойти дальше, то в этих же заданиям можно запускать автоматическое тестирование.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Искра Екатеринбург
от 80 000 до 100 000 ₽
Art gorka Санкт-Петербург
от 60 000 ₽
от 40 000 до 60 000 ₽
19 апр. 2024, в 20:43
20000 руб./за проект
19 апр. 2024, в 20:11
500 руб./за проект