Skip to content

14 Ноябрь 2011

98

Git post receive auto deployment hook

images

Один из неприятных моментов в разработке веб приложений — deployment. Вы уже на завершающей стадии, новый функционал уже не добавляется, самое время запускать на сайт тестеров и показывать его заказчику. Так давайте автоматизируем это процесс, а выигранное время потратим на кофе с привлекательными коллегами  :wink:

Когда начинается стадия тестирования — сайт приходится обновлять очень часто. После каждого ‘пака’ багов, нарытых усердными сотрудниками отдела качества. Поэтому вопрос auto-deployment‘а встает весьма остро.

Для решения этой задачи, прекрасно подходит мой любимый git. Удивлены?  :smile:

На самом деле в любой VCS присутствуют хуки. Это своего рода callback функция, вызывающий определенный скрипт на определенных событиях репозитория.

:!: Основное условие:

Центральный гит репозиторий должен быть расположен на той же машине, на которой будет разворачиваться сайт. Это не критичное требование, но оно очень сильно облегчает нашу задачу. И приведенный ниже скрипт будет работать только с этим условием.

:!: Настройка:

  1. Клонируем центральный репо в место, где будет разворачиваться наш сайт. `git clone /home/git-repo/repositories/site.git/ ` (путь до репо подставить свой)
  2. Переходим в ../site.git/hooks
  3. Создаем файл post-receive со следующим содержимым: (настройки поставить свои)
    #!/bin/sh
    #
    # An example hook script for the "post-receive" event.
    #
    # The "post-receive" script is run after receive-pack has accepted a pack
    # and the repository has been updated.  It is passed arguments in through
    # stdin in the form
    #  <oldrev> <newrev> <refname>
    # For example:
    #  aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master
    #
    # see contrib/hooks/ for a sample, or uncomment the next line and
    # rename the file to "post-receive".
    
    #. /usr/share/doc/git-core/contrib/hooks/post-receive-email
    
    while read oldrev newrev refname
    do
    
    	BRANCH='master'
    	DEPLOY_PATH='/opt/www/site.ru/htdocs'
    
    	if [ "${refname}" = "refs/heads/${BRANCH}" ]; then
    		echo "[hook] Updating '${DEPLOY_PATH}' "
                    umask 0002
    		cd $DEPLOY_PATH
    		unset GIT_DIR
    		git checkout $BRANCH > /dev/null
    		git clean -f -d > /dev/null
    		git fetch > /dev/null
    		git reset --hard remotes/origin/$BRANCH > /dev/null
    	fi
    
    done

     

  4. :?:  ВНИМАНИЕ! Хук будет запускаться от пользователя вашего git сервера! У него обязательно должны быть права на изменение каталога с сайтом. Я рекомендую выставить права на папку с сайтом 2775 и внести пользователя git в группу вашего веб-сервера. Ну и все файлы/папки должны иметь владельца в виде пользователя веб-сервера с правами 775 (папки) и 664 (файлы). Массовое изменение прав.
  5. Теперь при push в ваш центральный репо (site.git), в ветку master — будет автоматически обновляться ваш сайт. Ну разве не чудесно?  :smile:

 

 

Обсуждение закрыто.