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

Копирование файлов с сервера SVN на внешний сервер через FTP

В настоящее время у меня около 5 серверов, один из которых я хотел бы использовать в качестве SVN-сервера в целях разработки, но я хочу, чтобы он мог обновлять внешний сервер, например, копировать зафиксированные файлы на внешний сервер через FTP (или любой другой охранник перевод).

В основном, когда я совершаю фиксацию на своем сервере SVN с необходимыми изменениями файлов, он должен копировать эти файлы с сервера SVN на мой основной сайт. Есть ли какой-нибудь способ сделать это?

Я использую nginx и Ubuntu 11.04.

Похоже, с тем, что вы ищете, лучше всего справится Скрипт перехвата SVN. Скрипты хуков в основном существуют на сервере SVN и могут использоваться для автоматического выполнения действий, таких как выполнение и обновление файлов.

Хотя в вашем вопросе упоминается FTP, я настоятельно рекомендую вам использовать вместо этого ssh / scp / rsync. Вы могли бы просто использовать SSH-скрипт и запустить экспорт / проверку svn в другой системе.

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