Git Post-receive крюк с частью рабочего дерева

17

Я хотел бы использовать git для развертывания на веб-сайте на сервере тестирования. Мой сайт - это тема Wordpress, построенная с помощью gulp, и репозиторий выглядит как

theme.git/
-- gulpfile.js
-- src/
-- build/

Я выполнил описанные ниже шаги здесь и здесь, которые устанавливают голый репозиторий на сервере, настройте местоположение рабочего дерева git и напишите post-receive hook для проверки репо на это место.

Проблема в том, что я ищу только для перемещения или копирования папки build/ в ее местоположение на сервере. Моя единственная мысль заключалась в том, чтобы написать post-receive hook для того, чтобы вытащить репо на одно местоположение дерева работ (потому что я думаю, что я читал, что в голых репозиториях обычно нет рабочего дерева), а затем cp папка сборки в wp-content/themes/

Это кажется излишне сложным, поэтому мне интересно, есть ли более эффективный/более общий способ его решения. Спасибо!

Теги:
deployment
githooks

4 ответа

4
Лучший ответ

Ваш подход к использованию git настолько широко для развертывания кажется немного странным, главным образом потому, что git является основной системой управления исходным кодом, а не средством развертывания. Это правда, что вы можете сделать много странных вещей с помощью крючков git, но по тем или иным причинам я чувствую, что они склонны возвращаться, чтобы преследовать вас.

Обычно я рекомендовал бы использовать somekind инструмент непрерывной интеграции для работы. Один возможный рабочий процесс, который я мог бы использовать сам, был бы

  • Храните файлы тем в публичном репозитории GitHub. Это бесплатно, вероятно, нет больших секретов в исходном тексте вашей темы, а в качестве дополнительного бонуса вы можете даже открыть исходную тему.
  • Настройте задание CI с Travis CI для вашего репозитория. Вы в основном получаете экземпляр бесплатной сборки в облаке, и вы можете делать всевозможные вещи до или после сборки. Вы могли бы, например. запустите gulp build (или независимо от имени вашей задачи), поэтому вам не нужно будет хранить каталог build в репозитории git вообще.
  • В Travis after_success вы можете скопировать каталог сборки на целевой сервер, например, с помощью scp. Вот пример того, что нужно делать с FTP. Travis поддерживает шифрование конфиденциальных данных, поэтому вам не нужно беспокоиться (по крайней мере, так много) о сохранении имени пользователя и пароля в git репо.

Этот поток полезен, когда вы хотите развернуть сборку каждый раз, когда вы что-то передаете в репозиторий git.. Кстати, когда вы впервые используете его, это действительно похоже на магию: "Я просто сделал это git push, и теперь изменение уже работает на моем сервере."

Однако вы упомянули, что хотите развернуть код на сервере тестирования. Это правда, что инструменты CI (такие как Travis) могут использоваться для поддержания потока между различными этапами развертывания, из которых многие тестируют серверы. Один пример потока для больших проектов может быть

development -> tests passing? -> release -> tests passing? -> integration -> tests passing? -> staging -> tests passing? -> production

... где поток может быть частично или полностью автоматизирован с помощью инструмента CI.

Однако вы сделали это так, как в вашем случае развертывание сборки - это однообразная вещь, которую вы иногда просто хотите сделать вручную. (Приносим извинения, если я неверно истолковал вас.) Для такого рода одноразовых задач использование сценариев оболочки или инструментов управления задачами является более подходящим.

Вы упомянули, что уже используете gulp. Это очень удобный инструмент для работы, особенно потому, что вы можете легко комбинировать разные "потоки задач". У вас может быть одна задача для создания темы (gulp build) и другая для развертывания тестового сервера (gulp deploy-test), которая просто расширяет задачу build с дополнительным шагом для копирования файлов на тестовый сервер. gulp-scp выглядит как прекрасный плагин для задачи (я не использовал его сам, хотя это был только первый результат поиска из Google). Если это не сработает, вы всегда можете вызвать scp вручную с помощью gulp-shell или аналогичного.

Вы даже можете параметризовать задачи развертывания, чтобы вы могли сделать что-то вроде: gulp deploy --test и gulp deploy --production

Там вы идете, это был ваш первый урок в devops. Там есть целый мир вещей, чтобы узнать, насколько вам интересна эта автоматизация задач в программных проектах.

  • 0
    Хотя здесь есть хорошая информация, она не отвечает на вопрос об использовании хитов Git.
  • 0
    Я проголосовал за этот ответ, так как думал, что это был полезный ответ на запрос OP относительно «более эффективного / более распространенного способа», в то время как ответ jthill был полезен для аспекта git hooks.
Показать ещё 1 комментарий
3

Это простая работа git read-tree. Храните манифест aka index для того, что в вашем каталоге развертывания и обрабатывайте ваши обновления с помощью предварительного приема:

#!/bin/sh
while read old new ref; do [[ $ref = refs/heads/master ]] && {
    export GIT_INDEX_FILE=deployment-manifest
    export GIT_WORK_TREE=/path/to/deployment
    git read-tree -um `git write-tree` $new:build || exit 1
}; done

Обратите внимание, что если какой-либо файл, развернутый таким образом, был изменен в дереве развертывания, git read-tree здесь и нажатие не будут выполнены, потому что git не будет перезаписывать контент, который у вас нет рассказал об этом.

0

Я использую git для развертывания все время. В этом нет ничего странного, и я не знаю, что против этого противник @cido. Там большое значение имеет возможность вернуться во времени в любую точку вашего ветки "развертывания" и иметь возможность точно видеть, что было на вашем сервере в то время.

Не путайте репозиторий git, который вы используете для хранения, и тот, который вы используете для развертывания. У вас должно быть полностью очищенное дерево git, извлеченное в вашу производственную зону (независимо от того, что это), и, как я предложил, вы можете захотеть иметь отдельный филиал под названием "развертывание" или "производство" или "постановка" или что-то еще.

Затем ваш крюк для отправки должен запускать script, который входит в вашу производственную область, и вытягивает ветвь развертывания для обновления.

Если вам нужно, чтобы это было надежным для файлов, размещенных там вне того, что будет делать git (например, файлы temp, созданные во время выполнения), вы можете вызвать git clean -dfx перед тем, как потянуть. И есть другие вещи, которые вы можете захотеть сделать, если вы ожидаете, что этот сервер будет перестраиваться с нуля на регулярной основе (например, в облачном развертывании), но похоже, что первоначальная настройка вручную должна быть в порядке для вашего случая использования.

cp Вставляя директорию сборки на место, звучит нормально, только я бы использовал rsync, потому что обычно это будет быстрее, если изменения будут только инкрементальными.

  • 0
    Извините, Эван, если я сказал, что имею что-то против использования git для развертывания; это не было моим намерением вообще. Я работаю в программном агентстве, так что я видел довольно много проектов, проходящих через наши руки. Просто я буквально никогда не видел проект, где git использовался для развертывания. Конечно, есть теги для выпусков (например, при использовании git flow) и так далее, но фактическое развертывание всегда обрабатывалось другими инструментами. Я верю вам, если вы говорите, что используете это все время. Просто из моего POV и из моего опыта идея использования git для развертывания кажется странной.
0

Я бы разделил ваш проект на два репозитория.

  • Источник. Включает источник и все остальное. Исключает каталог /build/. Используйте это только для управления версиями. Это никогда не касается веб-сайта (может быть небезопасно хранить ваш код на веб-сайте даже в форме репозитория git).

  • Развертывание. Только каталог /build/. Вы можете инициировать новый git репо внутри каталога. У этого есть дистанционное репо на сервере; вы можете использовать крюк post-receive для развертывания, как и раньше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню