Copie arquivos do servidor SVN para o servidor externo via FTP

3

Atualmente, tenho cerca de 5 servidores, um que gostaria de usar como servidor SVN por motivos de desenvolvimento, mas quero que ele seja capaz de atualizar o servidor externo, como copiar arquivos confirmados para o servidor externo via FTP (ou qualquer segurança transferência).

Basicamente, quando eu faço um commit no meu servidor SVN com os arquivos que são necessários, ele deve copiar esses arquivos do servidor SVN para o meu site principal. Existe algum método que eu possa fazer isso?

Estou executando o nginx e o Ubuntu 11.04.

    
por MacMac 03.03.2012 / 00:54

2 respostas

4

Parece que o que você está procurando seria mais bem tratado por um script de gancho do SVN . Os scripts de gancho existem basicamente no servidor SVN e podem ser usados para executar ações automaticamente, como fazer e atualizar arquivos.

Embora sua pergunta mencione o FTP, sugiro strongmente que você considere o uso de ssh / scp / rsync. Você poderia apenas ter seu script de gancho usando SSH e executar um svn export / checkout no outro sistema.

    
por 03.03.2012 / 01:00
1

Use a ferramenta de compilação (Ant, Maven, o que for) e ferramenta de integração contínua (CruiseControl, CruiseControl.rb, Hudson, etc).

Não use ganchos para fins de implantação se alguém o recomendar. Especificamente, neste caso, a abordagem hooks está errada por causa das várias razões:

  1. Escala . Ganchos não escalam. É difícil fazer o hook script fazer o que eles não deveriam, como por exemplo, deployment, que sempre requer alguns truques para executar com sucesso.
  2. Flexibilidade . Ganchos não são flexíveis o suficiente. Você precisa reescrevê-las toda vez que houver mudanças em seus processos. E suas correções podem quebrar algo que você conseguiu fazer com ganchos anteriormente.
  3. Segurança . Você vai armazenar login / senha para implantação de ftp / ssh diretamente no seu gancho? Isso será um grande erro. Você pode encontrar uma solução alternativa, mas não será bom, desde que os ganchos não sejam o lugar para o gerenciamento de segurança.
  4. Complexidade . A implantação geralmente requer muitas ações específicas para fazer, mesmo quando, a princípio, parece que isso não acontece. Se você começar a fazer implantações em seus scripts de gancho, eles ficarão inchados e incontroláveis.
  5. Controle de origem . Você não pode colocar ganchos sob controle de origem. Se você tentar colocá-lo sob controle de fonte, você definitivamente vai se arrepender mais tarde, desde que seja difícil armazenar ganchos junto com as fontes do seu projeto, em um só lugar.

Tudo que você precisa é:

  1. Escreva o script de construção no qual você descreve suas etapas de implantação
  2. Instale a ferramenta de integração contínua
  3. Faça da ferramenta de integração contínua use seu script e repositório de construção
  4. Configure a ferramenta de integração contínua para executar compilação no commit
  5. Realize o commit no repositório e veja como suas alterações serão criadas automaticamente & implantado de acordo com o script de construção que você escreveu.

Pessoalmente, uso Ant e CruiseControl.rb para o propósito que você descreveu. Aqui está o exemplo do script de construção para implantar minhas alterações sobre o protocolo 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 tem o seguinte conteúdo:

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

Eu recomendaria gastar algum tempo para aprender noções básicas de gerenciamento de build (Ant) e integração contínua (CruiseControl) para executar a implantação da maneira mais apropriada. Mesmo que pareça um pouco mais complexo, é uma coisa certa a fazer.

    
por 04.03.2012 / 08:51