SVN Post Commit Hook для развертывания веб-сайта - PullRequest
2 голосов
/ 31 декабря 2011

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

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

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

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

1 Ответ

5 голосов
/ 31 декабря 2011

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

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

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

  1. Напишите скрипт сборки, в котором вы опишете шаги развертывания
  2. Установите инструмент непрерывной интеграции
  3. Сделайте так, чтобы инструмент непрерывной интеграции использовал ваш скрипт сборки и репозиторий
  4. Сконфигурируйте инструмент непрерывной интеграции для выполнения build on commit
  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) для наиболее эффективного развертывания.Даже если это может показаться не тем, о чем вы просили, и немного сложнее, это правильно.

...