#linux #git #bash #ssh
#linux #git #bash #ssh
Вопрос:
просто пытаюсь написать свой 1-й git-хук. У меня есть удаленный источник, и когда я нажимаю на него, я хотел бы, чтобы сработал перехват после получения, который подключит ssh к моему живому серверу и git pull. Можно ли это сделать, и хороший ли это подход?
Хорошо, у меня сработал хук, и живой сервер выполняет git pull, но он говорит, что он уже обновлен? есть какие-нибудь идеи?
Ответ №1:
да, это можно сделать, и да, на мой взгляд, это хорошая практика. Вот наш пример использования: я работаю в небольшой группе разработчиков, которая поддерживает несколько сайтов для разных групп людей.
У каждого сайта есть несколько сред (бета-версия, которая является «песочницей» для всех разработчиков, staging, где мы демонстрируем изменения владельцам контента перед выходом в эфир, training, который наш тренер использует для обучения новых контент-менеджеров, и live, куда все идут потреблять контент).
Мы контролируем развертывание во всех этих средах с помощью перехватов после получения на основе названий ветвей. У нас может быть ветка ‘hot fix’, которая нигде не развертывается, но когда мы объединяем ее, скажем, с веткой ‘beta’, она автоматически развертывается на бета-сервере, чтобы мы могли проверить, как наш код взаимодействует с кодом других разработчиков.
Есть много способов, которыми вы можете это сделать, что мы делаем, так это настраиваем ваши ssh-ключи так, чтобы git-сервер мог подключаться по ssh к вашему веб-серверу и выполнять git pull. Это означает, что вы должны добавить открытый ключ для git @ gitserver в ваш файл git @ webserver authorized_keys и наоборот, затем в перехвате после получения вы анализируете ветку и пишете для нее оператор ‘case’, вот так:
read line
echo "$line" | . /usr/share/doc/git-core/contrib/hooks/post-receive-email
BRANCH=`echo $line | sed 's/.*///g'`
case $BRANCH in
"beta" )
ssh git@beta "cd /var/www/your-web-folder-here; git pull"
;;
esac
Надеюсь, это поможет.
Ответ №2:
Это, безусловно, можно сделать, но это не лучший подход. Когда вы используете git pull
, git извлечет, а затем объединит с вашей рабочей копией. Если можно гарантировать, что слияние всегда будет быстрым, это может быть нормально, но в противном случае вы можете столкнуться с конфликтами, которые необходимо разрешить в развернутом коде на вашем реальном сервере, что, скорее всего, приведет к его поломке. Другая проблема с развертыванием с помощью pull заключается в том, что вы не можете просто вернуться к более ранней фиксации в истории, поскольку pull просто сообщит вам, что ваша ветка уже обновлена.
Кроме того, если вы подключаетесь к репозиторию, не являющемуся открытым, на вашем действующем сервере, вам необходимо предпринять шаги, чтобы данные в вашем .git
каталоге не были общедоступными.
Аналогичный, но более безопасный подход заключается в развертывании через перехват в открытом репозитории на действующем сервере, который будет использовать git checkout -f
, но с рабочим каталогом, установленным на каталог, в который должен быть развернут ваш код. Вы можете найти пошаговое руководство по настройке такой системы здесь.
Комментарии:
1. Я действительно не понимаю, почему это не очень хороший подход. Если извлечения выполняются автоматически, как бы он в конечном итоге столкнулся с конфликтом в рабочей копии текущего сайта? Кроме того, наличие еще одной голой копии для каждого текущего сайта, которым вы управляете, кажется ненужными административными накладными расходами.
2. Если каждое извлечение выполняется быстрой перемоткой вперед из предыдущего состояния
HEAD
, вы не получите никаких подобных конфликтов. Однако это не всегда так — вы можете захотеть развернуть версию из расходящейся ветви разработки. Что еще более важно, если вы хотите вернуться к более старому коммиту в той же ветке, извлечение оставит вас в том же состоянии и сообщит вам, что вы уже обновлены.3. итак, в моей настройке моя локальная машина может подключаться по ssh к моему удаленному источнику, мой исходный сервер имеет ssh-ключ к моему текущему серверу. У меня есть две ветки, live и dev. Я хотел бы, чтобы, когда я отправляю в origin dev, он обновлял сборку dev на сервере origin, а когда я отправляю в live branch, он будет развернут на live server. Есть ли у кого-нибудь аналогичный скрипт перехвата после получения, который я мог бы изучить?