目前我有大约 5 台服务器,其中一台我想用作 SVN 服务器,用于开发,但我希望它能够更新外部服务器,例如通过 FTP 将已提交的文件复制到外部服务器(或任何安全者转移)。
基本上,当我向 SVN 服务器提交需要更改的文件时,它应该将这些文件从 SVN 服务器复制到我的主站点。有什么方法可以做到这一点吗?
我正在运行 nginx 和 Ubuntu 11.04。
答案1
听起来你正在寻找的东西最好由SVN 钩子脚本. 钩子脚本基本上存在于SVN服务器上,可以用来自动执行操作,比如执行和更新文件。
虽然您的问题提到了 FTP,但我强烈建议您考虑使用 ssh/scp/rsync。您可能只是让您的钩子脚本使用 SSH 并在另一个系统上运行 svn export/checkout。
答案2
使用构建工具(Ant、Maven 等等)和持续集成工具(CruiseControl、CruiseControl.rb、Hudson 等)。
不要使用钩子进行部署如果有人推荐的话。具体来说,在这种情况下钩子方法是错误的,原因如下:
- 扩展。钩子无法扩展。很难让钩子脚本执行它们不应该执行的操作,例如部署,这总是需要一些技巧才能成功执行。
- 灵活性。钩子不够灵活。每次流程发生变化时,您都需要重写它们。而且您的更正可能会破坏您之前使用钩子完成的某些操作。
- 安全。您要直接在钩子中存储 ftp/ssh 部署的登录名/密码吗?这将是一个巨大的错误。您可能会找到解决方法,但只要钩子不是安全管理的地方,这也没什么用。
- 复杂部署通常需要执行许多特定操作,即使乍一看似乎并非如此。如果您开始在钩子脚本中进行部署,它们将变得臃肿且难以管理。
- 源代码控制。您不能将钩子置于源代码控制之下。如果您尝试将其置于源代码控制之下,您以后肯定会后悔,因为很难将钩子与您的项目源代码一起存储在一个地方。
您需要做的就是:
- 编写构建脚本来描述部署步骤
- 安装持续集成工具
- 使持续集成工具使用您的构建脚本和存储库
- 配置持续集成工具来执行基于承诺构建
- 执行对存储库的提交并查看您的更改如何根据您编写的构建脚本自动构建和部署。
就我个人而言,我使用 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) 的基础知识,以便以最合适的方式执行部署。尽管这看起来可能有点复杂,但这是正确的做法。