3

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

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

我的存储库(在 Subversion 版本控制系统上)与实时服务器在同一台服务器上,所以我需要做的就是将文件传输到不同的目录。

我知道我需要编辑 repo/hooks/post-commit 文件,并且我已经完成了这项工作,但是我不确定这个文件的内容是否可以做我需要做的事情。

4

1 回答 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) 的基础知识,以便以最合适的方式执行部署。尽管它可能看起来不是您所要求的并且有点复杂,但这是正确的做法。

于 2011-12-31T14:18:49.963 回答