2011-12-31 89 views
2

我一直在阅读一段时间,并得到了一些答案,但我只需要一些更多的帮助。SVN发布提交挂钩部署网站

我试图自动部署一个网站,当某个变更集被提交给一个分支,所以我从不同的分支发布我的不同版本。例如,每当更新时都会有一个活动分支,新的更改集将合并到当前的活动网站中。

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

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

回答

5

请勿使用挂钩进行部署。使用构建工具(Ant,Maven,无论)和持续集成工具(CruiseControl,CruiseControl.rb,Hudson等)。由于以下几个原因,使用挂钩是错误的:

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

所有你需要是:

,你描述你的部署步骤
  • 安装持续集成工具
    1. 写构建脚本
    2. 进行持续集成工具使用您的构建脚本和存储库
    3. 配置连续集成工具执行构建提交
    4. 执行提交到存储库并查看如何根据您编写的构建脚本部署自动更改&。

    就我个人而言,我使用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 
    

    我会建议花一些时间来学习构建管理的基础知识(蚂蚁)和持续集成(CruiseControl)以最合适的方式执行部署。尽管它看起来可能不是你所要求的,并且稍微复杂一些,但这是一件正确的事情。

  • +0

    辉煌,谢谢你的建议!我会阅读你建议的流程。非常感谢。 – 2012-01-01 14:27:01