• SVN利用Hooks自动发布网站


    出于管理需要,也需要在公司内部实现自动发布流程。当开发机提交SVN代码之后,自动同步到测试服务器进行测试。

    网络的拓扑简化为:

    1台核心SVN服务器,使用的svn管理软件为Subversion Edge3.2版本,Subversion核心版本为1.8.x,内网IP为:xx.xx.xx.54;

    1台Web服务器,CentOS6.5 x64,内网IP为:xx.xx.xx.53。

    基本的操作流程如下:

    一、创建版本库:

    在Subversion Edge中创建版本是比较简单的。假设创建好的版本库为:http://xx.xx.xx.54/svn/assistant/

    权限设置等,可参见其他相关文章。

    二、目录、权限设置:

    自动发布的原理,其实只是在于:当开发机提交更新之后,脚本会自动执行某段代码,将代码更新到某个副本中。如果svn服务器和wen服务器在一台电脑中,这步操作已经完成自动发布(准备下面的1,2步);如过svn服务器和web服务器不在一台电脑中,则还需要使用其他办法将更新文件,同步到web服务器中。

    1、在 svn服务器中,创建 "/data/assistant/"目录;

    2、将版本库代码,"checkout"至该目录;

    3、在web服务器中,创建"/web/assistant/"目录;

    4、设置ssh权限,在使用rsync时,不需要手工录入密码;

    5、建议将web服务器的web用户权限,在svn种也创建一份,这样一来,rsync可以直接将权限传递过去,无需再次操作(假设"webgroup:webuser")。

    #1、创建svn副本
    mkdir /data/assistant/
    #2、签出代码
    /csvn/bin/svn checkout http://xx.xx.xx.54/svn/assistant/ /data/assistant/ 
    #4、设置安全同步密钥,建议操作完之后,先执行一下rsync输入一次密码,则不需要再次输入了
    ssh-keygen
    ssh-copy-id -i ~/.ssh/id_rsa.pub xx.xx.xx.53
    #5、设置权限
    chown webuser:webgroup -R /data/assistant

    三、复制并修改"post-commit"脚本:

    Edge操作钩子比较简单,根本不需要考虑权限问题,只需要在"Hook Scripts"中,选中'post-commit.tmpl",再点击"copy",复制为"post-commit"文件即可。

    编辑内容如下:

    #!/bin/sh
    
    REPOS $1
    REV $2
    
    #指定命令路径
    SVNPATH=/data/csvn/bin/svn
    SVNLOOKPATH=/data/csvn/bin/svnlook
    RSYNC=/usr/bin/rsync
    
    #定义环境变量
    LOCALCOPY=/data/assistant/
    REMOTEIP=/web/assistant/
    REMOTEIP="172.16.6.53"
    EXCLUED=/data/csvn/exclude.list
    LOG=/tmp/rsync_web_server.log
    CHANGE=$($SVNLOOKPATH changed -r $REV $REPOS)
    
    #设置输出字符集,避免乱码
    export LANG=en_US.UTF-8
    
    #更新本地副本
    $SVNPATH update $LOCALCOPY --username publisher --password Q1w2e3r4t5 
    
    if [ $? == 0 ] && [ $CHANGE =~ "branches"]; then
      echo `date` >> $LOG  
      echo "##############################" >> $LOG
      echo $CHANGE >> $LOG
      #修改更新文件的权限
      chown -R webuser:webgroup $LOCALCOPY
      $RSYNC -vaztpH  --timeout=90 --exclude-from=$EXCLUED  $LOCALCOPY/ root@$REMOTEIP:$REMOTEIP >> $LOG
    else
      echo "no update file." >> $LOG
    fi

    1、指定svn路径的原因在于,一般的centos通过yum安装的svn,是1.6.x版本,而edge是1.8.x版本,会导致更新时提示版本不一致,因此直接指定为edge自带的svn命令;

    2、EXCLUED是设置的排除文件,包含在rsync同步时无需同步的文件或者目录,基本内容如下:

    .svn/
    .DS_Store
    images/

    3、目前的使用,仅限于提交后触发的post-commit脚本,实际上,当你查看版本库的hooks目录时,会发现其他很多事件的脚本,只是对于我们的应用场景来说,还不需要那么严谨,其余的,遇到再说吧;

    4、理论上,目前的方式,当集中管理的项目较多时,会在svn上产生较多的svn副本,这对svn服务器也是一个压力。更优的方案,应该在于当触发提交时,请求对应web服务器的某个脚本,主动去拉取代码至对应web服务器,应该是更优的做法。

  • 相关阅读:
    手机开发中的AP与BP的概念
    pk8和x509.pem转换成keystore
    android系统release签名
    java读取pfx或P12格式的个人交换库公私钥
    使用IntelliJ IDEA查看类的继承关系图形
    Java日志框架与日志系统
    Java常见加密技术的密钥与加密串长度
    quartz的持久化任务调度使用应用的dataSource
    敏感数据脱敏
    Jquery的Ajax中contentType和dataType的区别
  • 原文地址:https://www.cnblogs.com/bashenandi/p/5308547.html
Copyright © 2020-2023  润新知