Назад | Перейти на главную страницу

обновление удаленного сервера с помощью git repo

Итак, я знаю о хуках git и буду изучать их дальше, но хочу написать простой сценарий bash, запускаемый через cron, чтобы поддерживать репозиторий на удаленном сервере в актуальном состоянии. Я представляю, как это работает:

В настоящее время у меня это работает как задача cron, которая выглядит так:

*/1 * * * * cd /my/sites/staging && git pull -q origin master && grunt production

Я пытаюсь избежать запуска моей сборки grunt, если ничего не изменилось. Думаю, все сводится к тому, как я могу узнать, действительно ли git pull что-нибудь потянул, и использовать это как условие для запуска моей сборки grunt. Сервер Ubuntu, ключ установлен на github, и все такое хорошее. Спасибо за любую помощь!

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

Итак, мой совет - избавиться от cron задач и как можно скорее переключитесь на управление репозиториями через хуки.

Как это обычно делается, подробно описано. Вот, и в основном требует наличия bare репозиторий (a концентратор репо) для отправки / извлечения и извлеченная версия того же репо ( жить репо), расположенный по соответствующему пути, скажем /srv/www/html, например.

Я люблю использовать gitolite3 справиться с концентратор репо, но это не обязательно, хотя иметь детальный контроль доступа, привязанный к выбранному вами LDAP если нужно.

Также хорошей практикой является ограничение возможностей gitolite3 пользователь через sudo, и держите крючки с помощью sudo звонки. Это рабочий пример с использованием gitolite3 крючки (не стесняйтесь адаптировать их - или улучшать / исправлять - в соответствии с вашими потребностями):

  • концентратор репо post-update крючок:

    #!/bin/sh
    
    echo "****"
    echo "**** Calling publisher-hub2live script [Hub's post-update hook]"
    echo "****"
    
    sudo /usr/local/sbin/publisher-hub2live "/srv/www/html" "root:apache" "2750" "640"
    
    exit 0
    
  • publisher-hub2live сценарий:

    #!/bin/sh
    
    echo "****"
    echo "**** Pulling changes into Live [publisher-hub2live]"
    echo "****"
    
    cd "$1" || exit
    umask 0022
    unset GIT_DIR
    /usr/bin/git pull hub master
    
    # custom actions here
    # e.g call grunt tasks
    /bin/chown -R "$2" "$1"
    /bin/find "$1" -type d -exec chmod "$3" {} +
    /bin/find "$1" -type f -exec chmod "$4" {} +
    /bin/chmod u+x "$1"/.git/hooks/post-commit
    /sbin/restorecon -R -v "$1"
    exec /usr/bin/git update-server-info
    
    exit 0
    
  • А жить репо post-commit также может быть полезен, если вы когда-нибудь будете вносить изменения в извлеченное рабочее дерево жить репо и хотите синхронизировать хаб.

Эта инфраструктура требует следующих записей (или эквивалентных) в вашем sudoers файл:

Cmnd_Alias        GITOLITE_CMDS = /usr/bin/git, /bin/chown, /bin/find, /bin/chmod, /sbin/restorecon, /usr/local/sbin/publisher-hub2live
Defaults:gitolite3 !requiretty
Defaults:gitolite3 lecture=never
gitolite3                ALL = (root)NOPASSWD: GITOLITE_CMDS

Также Match блокировать в вашем sshd_config было бы полезно, в зависимости от того, как вы управляете идентификацией на своих машинах:

 Match Group gitolite3
  Banner /etc/issue.empty
  RequiredAuthentications2 publickey

Имея все это на месте, подталкивая к концентратор репо запускает post-update ловушка, гарантирующая выполнение ваших пользовательских действий только когда есть что-то новое.

Я думаю, вы можете решить эту проблему, просто сделав это:

*/1 * * * * cd /my/sites/staging && git pull -q origin master|grep -v "up-to-date" && grunt production

Хотя я сам не использовал его из-за моего понимания марионетки http://puppetlabs.com/ ты можешь сделать это.

Каждый раз, когда марионетка запускается, если что-то меняется, она автоматически отправляется на другие серверы в зависимости от того, что такое золотой образ. И если у вас есть большое количество серверов после создания золотого образа, вы можете создать марионетку базовой установки на другом, и новый сервер получит остальную часть конфигурации с главного сервера.