SVN Post Commit Hook部署网站

Ian*_*son 2 svn bash version-control svn-hooks

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

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

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

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

alt*_*ern 5

不要使用挂钩进行部署.使用构建工具(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>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我建议花一些时间学习构建管理(Ant)和持续集成(CruiseControl)的基础知识,以便以最合适的方式执行部署.即使它似乎不是你所要求的而且更复杂一点,但这是正确的做法.