SVN Post Commit Hook для развертывания веб-сайта

Я читал некоторое время и получил несколько ответов, но мне просто нужна дополнительная помощь.

Я пытаюсь автоматически развернуть веб-сайт, когда определенный набор изменений фиксируется в ветке, поэтому я выпускаю разные версии из разных веток. Например, существует действующая ветвь, которая всякий раз, когда обновляется, новые наборы изменений объединяются с текущим действующим веб-сайтом.

Мой репозиторий (в системе контроля версий Subversion) находится на том же сервере, что и рабочий сервер, поэтому все, что мне нужно сделать, это перенести файлы в другой каталог.

Я знаю, что мне нужно отредактировать файл repo/hooks/post-commit, и у меня это работает, однако я не уверен, что содержимое этого файла делает то, что мне нужно.


person Ian Jamieson    schedule 31.12.2011    source источник


Ответы (1)


Не используйте хуки для целей развертывания. Используйте инструмент сборки (Ant, Maven и т. д.) и инструмент непрерывной интеграции (CruiseControl, CruiseControl.rb, Hudson и т. д.). Использование хуков просто неправильно по нескольким причинам:

  1. Масштабирование. Крючки не масштабируются. Трудно заставить хук-скрипт делать то, что он не должен делать, например, развертывание, которое всегда требует некоторых трюков для успешного выполнения.
  2. Гибкость. Крючки недостаточно гибкие. Вам нужно переписывать их каждый раз, когда в ваших процессах происходят изменения. И ваши исправления могут сломать то, что вам удалось сделать с хуками ранее.
  3. Безопасность. Вы собираетесь хранить логин/пароль для развертывания ftp/ssh прямо в своем хуке? Это будет огромной ошибкой. Вы можете найти обходной путь, но это тоже будет бесполезно, если хуки — это не место для управления безопасностью.
  4. Сложность. Развертывание обычно требует выполнения множества конкретных действий, даже если на первый взгляд кажется, что это не так. Если вы начнете делать деплой в своих скриптах хуков, они окажутся раздутыми и неуправляемыми.
  5. Управление исходным кодом. Вы не можете поставить хуки под контроль источника. Если вы попытаетесь поставить его под контроль версий, вы обязательно потом пожалеете об этом, так как трудно хранить хуки вместе с исходниками вашего проекта в одном месте.

Все, что вам нужно, это:

  1. Напишите сценарий сборки, в котором вы описываете шаги развертывания.
  2. Установить инструмент непрерывной интеграции
  3. Заставьте инструмент непрерывной интеграции использовать ваш скрипт сборки и репозиторий
  4. Настройте инструмент непрерывной интеграции для выполнения сборки при фиксации.
  5. Выполните фиксацию в репозитории и посмотрите, как ваши изменения будут автоматически собраны и развернуты в соответствии с написанным вами сценарием сборки.

Лично я использую 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), чтобы выполнить развертывание наиболее подходящим образом. Хотя может показаться, что это не то, что вы просили, и немного сложнее, это правильно.

person altern    schedule 31.12.2011
comment
Блин, спасибо за совет! Я прочитаю о процессах, которые вы предложили. Большое спасибо. - person Ian Jamieson; 01.01.2012