SVN Post Commit Hook部署网站

时间:2011-12-31 13:17:03

标签: svn bash version-control svn-hooks

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

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

我的存储库(在Subversion版本控制系统上)与实时服务器位于同一服务器上,因此我需要做的就是将文件传输到另一个目录。

我知道我需要编辑repo / hooks / post-commit文件,我有这个工作,但我不确定这个文件的内容是否需要做我需要做的事。

1 个答案:

答案 0 :(得分:5)

不要将钩子用于部署目的。使用构建工具(Ant,Maven,无论如何)和持续集成工具(CruiseControl,CruiseControl.rb,Hudson等)。使用钩子是错误的,原因如下:

  1. 缩放即可。挂钩不会伸缩。很难让钩子脚本做他们不应该做的事情,例如部署,这总是需要一些技巧才能成功执行。
  2. 灵活性即可。钩子不够灵活。每当流程发生变化时,您都需要重写它们。而你的更正可能会破坏你以前用钩子做过的事情。
  3. 安全即可。您是否要直接在挂钩中存储ftp / ssh部署的登录名/密码?那将是一个巨大的错误。您可能会找到解决方法,但只要挂钩不是安全管理的地方就不会有好处。
  4. 复杂性即可。部署通常需要执行大量特定操作,即使它最初看起来并非如此。如果您开始在钩子脚本中进行部署,那么它们将变得肿胀且难以管理。
  5. 来源控制。你不能把钩子放在源代码控制之下。如果您试图将其置于源代码管理之下,只要难以将钩子与您的项目源存储在一起,您肯定会后悔。
  6. 您需要的只是:

    1. 编写构建脚本,描述部署步骤
    2. 安装持续集成工具
    3. 使持续集成工具使用您的构建脚本和存储库
    4. 配置持续集成工具以执行 build on commit
    5. 执行对存储库的提交,并查看您的更改将如何自动构建&根据您编写的构建脚本进行部署。
    6. 我个人使用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)的基础知识,以便以最合适的方式执行部署。即使它似乎不是你所要求的而且更复杂,但这是正确的做法。