SVN Post Commit钩子部署网站

SVN Post Commit钩子部署网站,svn,bash,version-control,svn-hooks,Svn,Bash,Version Control,Svn Hooks,我已经阅读了一段时间,得到了一些答案,但我只是需要更多的帮助 当某个更改集提交到某个分支时,我试图自动部署一个网站,因此我从不同的分支发布了不同的版本。例如,有一个实时分支,每当更新时,新的更改集都会合并到当前的实时网站中 我的存储库(在Subversion版本控制系统上)与live server位于同一台服务器上,因此我需要做的就是将文件传输到不同的目录 我知道我需要编辑repo/hooks/post-commit文件,并且我已经完成了这项工作,但是我不确定该文件的内容是否能满足我的需要。不要

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

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

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


我知道我需要编辑repo/hooks/post-commit文件,并且我已经完成了这项工作,但是我不确定该文件的内容是否能满足我的需要。

不要将hooks用于部署目的。使用构建工具(Ant、Maven等)和持续集成工具(CruiseControl、CruiseControl.rb、Hudson等)。由于以下几个原因,使用挂钩是错误的:

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

  • 编写描述部署步骤的构建脚本
  • 安装持续集成工具
  • 使持续集成工具使用您的构建脚本和存储库
  • 配置持续集成工具以执行提交时生成
  • 执行对存储库的提交,并查看如何根据您编写的构建脚本自动构建和部署您的更改
  • 就我个人而言,我使用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>
    

    我建议花一些时间学习构建管理(Ant)和持续集成(CruiseControl)的基础知识,以最合适的方式执行部署。尽管这似乎不是您所要求的,而且有点复杂,但这是一件正确的事情。

    太棒了,谢谢您的建议!我将仔细阅读你建议的流程。谢谢。
    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