通过FTP将文件从SVN服务器复制到外部服务器

目前我有大约5个服务器,我想用SVN服务器作为一个开发的原因,但我希望它能够更新外部服务器,如通过FTP(或任何安全传输)将提交的文件复制到外部服务器, 。

基本上,当我使用需要更改的文件向SVN服务器提交时,应该将这些文件从SVN服务器复制到我的主站点。 有什么方法可以做到这一点?

我正在运行nginx和Ubuntu 11.04。

这听起来像你正在寻找最好的SVN钩脚本处理。 钩子脚本基本上存在于SVN服务器上,可用于自动执行操作,如执行和更新文件。

虽然你的问题提到FTP我强烈build议你考虑使用ssh / scp / rsync来代替。 你可能只是让你的钩子脚本使用SSH,并在另一个系统上运行svn导出/签出。

使用构build工具 (Ant,Maven等)和持续集成工具 (CruiseControl,CruiseControl.rb,Hudson等)。

如果有人推荐它, 不要使用钩子来部署 。 特别是在这种情况下, 钩子的做法是错误的,原因有几个:

  1. 缩放 。 挂钩不能缩放。 钩子脚本很难做到他们不应该做的事情,例如部署,总是需要一些技巧才能成功执行。
  2. 灵活性 。 挂钩不够灵活。 每当进程发生变化时,您都需要重写它们。 而你的更正可能会破坏你以前用钩子做的事情。
  3. 安全 。 你打算将ftp / ssh部署的login/密码直接存储在你的钩子中吗? 这将是一个巨大的错误。 您可能会发现解决方法,但只要钩子不是安全pipe理的地方,就不会有好处。
  4. 复杂性 。 部署通常需要执行很多特定的操作,即使起初它似乎没有。 如果你开始在你的钩子脚本中进行部署,它们会变成肿胀和难以pipe理的。
  5. 来源控制 。 你不能在源代码pipe理下挂钩。 如果你试图把它放在源代码控制之下,只要在一个地方很难把钩子和你的项目源一起存储,你一定会后悔的。

所有你需要的是:

  1. 在您描述部署步骤的地方编写构build脚本
  2. 安装持续集成工具
  3. 使持续集成工具使用您的构build脚本和存储库
  4. configuration持续集成工具以在提交时执行构build
  5. 对存储库执行提交,并根据您编写的构build脚本查看您的更改将如何自动构build和部署。

就我个人而言,我使用Ant和CruiseControl.rb来达到您所描述的目的。 以下是通过ftp协议部署我的更改的构build脚本示例:

 <?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 

我build议花一些时间学习构buildpipe理(Ant)和持续集成(CruiseControl)的基本知识,以最合适的方式执行部署。 尽pipe看起来似乎更复杂一点,但这是一件正确的事情。