Sanu0074
@Sanu0074

Как сделать автодеплой при пуше в конкретную ветку в репозитории?

Допустим есть Gitlab, с репозиторием test.git. В нем есть множество веток, и две основные master и qa. В процессе разработки, разработчики создают свои ветки которые соответствуют задачам, далее все это мержится через мержреквесты в ветку dev. Когда нужно выкатить релиз, есть необходимость делать деплой на тестовый сервер из ветки qa, и когда тест прошел успешно нужно сделать деплой на продакшн из ветки master.

Предположим что тестовый сервер и продакшн-сервер находятся на одной машине. В данный момент, после того как были подмержены все изменения из dev в qa, после пуша, я иду на сервер и выполняю там команду, что-то вроде этой:

git archive --remote=/git-data/repositories/root/test.git qa | tar -x -C /test-server/sites/test/


Если протестили и все ок, ветка qa мержится в master, и я опять иду на сервер, и выполняю такую команду:

git archive --remote=/git-data/repositories/root/test.git master | tar -x -C /prod-server/sites/test/


Это все напряжно, и хочется автоматизировать этот процесс. Хочется создать какой-нибудь bash-скрипт (например просто вбить в него эту же git archive покачто), который будет автоматически запускаться после внесения изменений в ветку master или qa. Например после пуша в qa сработает скрипт /home/testuser/deplloy-qa.sh, а после пуша в master сработает скрипт /home/testuser/deplloy-master.sh. Или же, можно было бы выполнять такие скрипты не автоматически при пуше, а из интерфейса Gitlab'a (что более интереснее, и на мой взгляд удобнее), там есть такие штуки как Builds/Runners - я не знаю можно ли их использоваться для решения моей задачи.

Буду признателен за полезные ответы, хотелось бы на моем примере понять и увидеть как можно решить задачу, и первым, и вторым способами.
  • Вопрос задан
  • 2088 просмотров
Пригласить эксперта
Ответы на вопрос 3
@vayho
Используйте CI - Jenkins/Teamcity etc.
Ответ написан
Andr1an
@Andr1an
Нужно сделать post-receive-хук, git передаёт ему в stdin аргументы в таком вот порядке: oldrev newrev ref. Вот пример:
#!/bin/bash
while read oldrev newrev ref; do
    branch=${ref##*/}
    if [[ "$branch" = "master" ]]; then
        # вот он, ваш мастер
    elif [[ "$branch" = "qa" ]]; then
        # qa
    fi
done
Ответ написан
Комментировать
@ArturF
php dev
Если еще актуально, то посмотрите в сторону использования встроенного CI. Вам понадобится SSH-раннер для доступа к целевой машине, а сценарий развертывания нужно будет залить в репозиторий
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы