Не использовать хуки для развертывания .Используйте инструмент сборки (Ant, Maven и т. Д.) И инструмент непрерывной интеграции (CruiseControl, CruiseControl.rb, Hudson и т. Д.).Использование хуков просто неправильно по нескольким причинам:
- Масштабирование .Крючки не масштабируются.Трудно заставить подключаемый скрипт выполнять то, что он не должен делать, как, например, развертывание, которое всегда требует некоторых приемов для успешного выполнения.
- Гибкость .Крючки не достаточно гибки.Вам нужно переписывать их каждый раз, когда происходят изменения в ваших процессах.И ваши исправления могут нарушить то, что вам удалось сделать с крючками ранее.
- Безопасность .Собираетесь ли вы хранить логин / пароль для развертывания ftp / ssh прямо в вашем хуке?Это будет огромной ошибкой.Возможно, вы найдете обходной путь, но он также не принесет пользы, если хуки не являются местом управления безопасностью.
- Сложность .Для развертывания обычно требуется выполнить множество конкретных действий, даже если на первый взгляд кажется, что это не так.Если вы начнете выполнять развертывание в своих скриптах ловушек, они окажутся раздутыми и неуправляемыми.
- Контроль источника .Вы не можете поставить хуки под контроль исходного кода.Если вы попытаетесь поставить его под контроль исходного кода, вы, безусловно, пожалеете об этом позже, поскольку трудно хранить хуки вместе с исходными файлами проекта в одном месте.
Все, что вам нужно, этоto:
- Напишите скрипт сборки, в котором вы опишете шаги развертывания
- Установите инструмент непрерывной интеграции
- Сделайте так, чтобы инструмент непрерывной интеграции использовал ваш скрипт сборки и репозиторий
- Сконфигурируйте инструмент непрерывной интеграции для выполнения build on commit
- Выполните коммит в репозиторий и посмотрите, как ваши изменения будут автоматически собраны и развернуты в соответствии с написанным вами скриптом сборки.
Лично я использую Ant и CruiseControl.rb для целей, которые вы описали.Вот пример сценария сборки для развертывания моих изменений по протоколу ftp: файл
<?xml version="1.0"?>
<project name="myproject" default="deploy-local">
<property file="build.properties"/>
<target name="deploy-local">
<echo message="Deploying version ${version}" />
<delete dir="${deploy.path.local}" />
<copy todir="${deploy.path.local}">
<fileset dir="." includes="**/*" >
<exclude name=".svn/**" />
<exclude name="build.*" />
</fileset>
</copy>
</target>
<target name="deploy-remote">
<echo message="Deploying project" />
<ftp action="del"
server="${deploy.remote.server}"
userid="${deploy.remote.login}"
password="${deploy.remote.pass}">
<fileset>
<include name="${deploy.path.remote}"/>
</fileset>
</ftp>
<ftp action="mkdir"
server="${deploy.remote.server}"
userid="${deploy.remote.login}"
password="${deploy.remote.pass}"
remotedir="${deploy.path.remote}">
</ftp>
<ftp server="${deploy.remote.server}"
userid="${deploy.remote.login}"
password="${deploy.remote.pass}"
remotedir="${deploy.path.remote}"
passive="yes">
<fileset dir="." includes="**/*" >
<exclude name=".svn/**" />
<exclude name="build.*" />
</fileset>
</ftp>
</target>
</project>
build.properties
имеет следующее содержимое:
deploy.path.local = C:\\apache\\htdocs\\myproject
deploy.path.remote = /http/deploy
deploy.remote.server = ftp.myproject.com
deploy.remote.login = mylogin
deploy.remote.pass = mypass
Я бы порекомендовал потратить некоторое время на изучение основуправления сборкой (Ant) и непрерывной интеграции (CruiseControl) для наиболее эффективного развертывания.Даже если это может показаться не тем, о чем вы просили, и немного сложнее, это правильно.