使用SVN后提交钩子部署网站

3

我已经阅读了一段时间并得到了一些答案,但我还需要更多的帮助。

我正在尝试在提交某个变更集到分支时自动部署网站,因此我从不同的分支发布不同版本。例如,有一个实时分支,每当更新时,新的变更集就会合并到当前实时网站中。

我的存储库(使用Subversion版本控制系统)与实时服务器位于同一台服务器上,因此我只需要将文件传输到不同的目录即可。

我知道我需要编辑repo/hooks/post-commit文件,并且我已经做到了这一点,但是我不确定如何编写该文件以完成我需要完成的任务。

1个回答

6
不要使用钩子进行部署。使用构建工具(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),以最合适的方式进行部署。虽然这似乎不是你所要求的,而且有点复杂,但这是正确的做法。


太棒了,谢谢你的建议!我会研究一下你建议的流程。非常感谢。 - Ian Jamieson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接