zoukankan      html  css  js  c++  java
  • svn版本库更新后自动同步到www

    注意:www目录一定要用SVN服务器 checkout出Repositories的代码

     

    步骤:

    (1)新建www根目录 mkdir -p /data/www/lehuo

    (2)在www根目录下检出(checkout,co)仓库中项目的代码

    svn co svn://ip/lehuo (远程主机的SVN仓库)

    svn co file:///opt/svn/lehuo   (本地主机的SVN仓库,若想使用ip地址同上)

    chown -R www:www * (更改文件所有者)

    (3)配置钩子(hooks)实现代码提交前和提交后的操作

    1.pre-commit (提交前添加注释)

    REPOS="$1"
    
    TXN="$2"
    
     
    
    # Make sure that the log message contains some text.
    
    SVNLOOK=/usr/bin/svnlook
    
    #$SVNLOOK log -t "$TXN" "$REPOS" | 
    
    #   grep "[a-zA-Z0-9]" > /dev/null || exit 1
    
     
    
    # Check that the author of this commit has the rights to perform
    
    # the commit on the files and directories being modified.
    
    #commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1
    
     
    
    # All checks passed, so allow the commit.
    
    #exit 0
    
     
    
    LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
    
    if [ "$LOGMSG" -lt 10 ];#要求注释不能少于5个汉字,您可自定义
    
    then
    
    echo -e "
    ======================================================" 1>&2
    
    echo -e "
    请在Commit(提交)前为您的补丁添加必要的注释。
    本次提交被忽略。" 1>&2
    
    echo -e "
    ======================================================" 1>&2
    
    exit 1
    
    fi

     

    2.post-commit (SVN服务器更新后自动同步到WWW目录)

    // 只更新同步修改的文件

    分两种情况,一种:svn版本库和www在同一台服务器上,另一种是两者在不同的服务器上(两者之间能互相访问)

     

    第一种情况:hooks/post-commit

     

     1 #!/bin/sh
     2 
     3 export LANG="zh_CN.UTF-8"
     4 
     5 REPOS="$1"
     6 
     7 REV="$2"
     8 
     9 SVN_PATH=/usr/bin/svn
    10 
    11 SVNDATA_PATH=/opt/svn/oil  # 版本库路径
    12 
    13 WEB_PATH=/home/wwwroot/default/oil  # www根目录路径
    14 
    15 LOG_PATH=/var/log/svn_update.log
    16 
    17 echo "##########开始提交 " `date "+%Y-%m-%d %H:%M:%S"` '##################' >> $LOG_PATH
    18 
    19 for change_dir in `svnlook dirs-changed $SVNDATA_PATH`
    20 
    21     do
    22 
    23         $SVN_PATH update --username "test" --password "123" --no-auth-cache -N $WEB_PATH/$change_dir >> $LOG_PATH
    24 
    25 done
    26 
    27 echo `whoami`,$REPOS,$REV >> $LOG_PATH
    28 
    29 chown -R www:www $WEB_PATH/$change_dir

     

    第二种情况:hooks/post-commit

    (1)配置ssh无密码访问

    SVN服务器需要无密码ssh访问WEB服务器,方便post-commit脚本ssh到WEB服务器上执行svn up。

    在SVN服务器上执行ssh-keygen -t rsa,然后一直按回车键,生成公钥和私钥保存在/root/.ssh/。

    把SVN服务器上/root/.ssh/id_rsa.pub公钥文件的内容拷贝到www服务器的/root/.ssh/authorized_keys文件里。然后设置authorized_keys文件权限为600。

     

    (2)post-commit 钩子

    #!/bin/sh

     REPOS="$1"                  # 仓库的路径

    REV="$2"                    # 新提交的版本号

    LOGFILE=/var/log/svn.log    # 钩子脚本的日志

    # 脚本的标准输出和标准错误输出都打印到日志文件里

    exec 1>>"$LOGFILE"

    exec 2>&1

     

    SVNLOOK=/usr/bin/svnlook

    TIME=$(date "+%Y-%m-%d %H:%M:%S")

    AUTHOR=$($SVNLOOK author -r $REV "$REPOS")  #提交作者

    CHANGEDDIRS=$($SVNLOOK dirs-changed $REPOS) #修改的目录集合

    MESSAGE=$($SVNLOOK log -r $REV "$REPOS")    #提交时的备注信息,不建议用中文

     

    # SVN客户端配置,需要自行修改**********************************

    CLIENT=10.154.5.192   # www服务器的内网地址         

    CLIENTSVNROOT=/data/www/www.halehuo.com/demo1/lehuo    # www根目录

    SVNUSER="lehuo"  # svn账号

    SVNPASSWD="lehuo"  # svn账号

    #**************************************************************

     

    function myecho() {

        echo "$TIME" "$*"

    }

     

    myecho "**************************************************************"

    myecho "提交版本:$REV 作者:$AUTHOR"

    myecho "提交备注:$MESSAGE"

    myecho "修改目录:$(echo $CHANGEDDIRS | tr ' ' ' ')"

     

    MASTERDIR=$(echo "$CHANGEDDIRS" | head -1)  #CHANGEDDIRS里的最上级目录

    # 遍历提交的代码目录,同步到WEB服务器上

    while [ "$CHANGEDDIRS" != "" ];do

        PROJECT=$(echo $MASTERDIR | awk -F / '{print $1}')

        myecho

        myecho "xiangmu:$PROJECT tongbumulu:$MASTERDIR"

        myecho "tongbu $MASTERDIR dao $CLIENT:$CLIENTSVNROOT/$MASTERDIR"

        /usr/bin/ssh root@$CLIENT "export LANG=en_US.UTF-8; svn up --non-interactive --username $SVNUSER --password $SVNPASSWD '$CLIENTSVNROOT/$MASTERDIR';chown -R www:www '$CLIENTSVNROOT/$MASTERDIR'"

        CHANGEDDIRS=$(echo "$CHANGEDDIRS" | grep -v "^$MASTERDIR")

        MASTERDIR=$(echo "$CHANGEDDIRS" | head -1)

    done

     

    参考内容:利用SVN的post-commit钩子实现多项目自动同步

    地址:http://qicheng0211.blog.51cto.com/3958621/1563159

     

    svn的post-commit钩子脚本在每次提交(commit)之后运行,我们可以在这个脚本里实现一些比较实用的功能,比如发送邮件提醒、自动备份版本库,自动同步代码到web服务器等。

        这里用post-commit实现多项目自动同步,思路:在svn版本仓库根目录下划分多个项目文件夹,项目组成员在提交文件时,post-commit自动判断文件所属的项目,然后同步到相应的WEB服务器上。

    测试环境配置:

    SVN服务器:172.16.4.234

    项目1WEB服务器:172.16.4.235

    项目1代码库:svn://172.16.4.234/project1

    项目2WEB服务器:172.16.4.236

    项目2代码库:svn://172.16.4.234/project2

    下面是操作步骤:

    一、WEB服务器

        WEB服务器作为SVN客户端,从SVN服务器上checkout一份代码到本地。注意要先切换到www用户再checkout,因为www是apache或nginx的执行用户(你的环境可能不一样)。

        项目1WEB服务器,站点根目录为/data/apps/project1:

     

    1

    2

    3

    shell# su www

    shell$ cd /data/apps/

    shell$ svn co --username zb --password 123456 svn://172.16.4.234/project1

        项目2WEB服务器,站点根目录为/data/apps/project2:

     

    1

    2

    3

    shell# su www

    shell$ cd /data/apps/

    shell$ svn co --username zb --password 123456 svn://172.16.4.234/project2

    二、配置ssh无密码访问

        SVN服务器需要无密码ssh访问WEB服务器,方便post-commit脚本ssh到WEB服务器上执行svn up。注意这里设置www用户无密码访问,因为WEB服务器上代码是www用户checkout出来的。

        在SVN服务器上执行ssh-keygen -t rsa,然后一直按回车键,生成公钥和私钥保存在/root/.ssh/。

        然后在WEB服务器上先切换到www用户,建立authorized_keys文件:

    1

    2

    3

    4

    5

    [root@localhost ~]# su www

    [www@localhost root]$ cd

    [www@localhost ~]$ mkdir .ssh

    [www@localhost ~]$ chmod 755 .ssh/

    [www@localhost ~]$ vi .ssh/authorized_keys

        把SVN服务器上/root/.ssh/id_rsa.pub公钥文件的内容拷贝到authorized_keys文件里。然后设置authorized_keys文件权限为600。

    1

    [www@localhost ~]$ chmod 600 .ssh/authorized_keys

        测试,SVN服务器登录项目1WEB服务器:

    1

    2

    [root@localhost ~]# ssh www@172.16.4.235

    [www@localhost ~]$

    三、SVN服务器post-commit

        post-commit在SVN的hooks目录下。

        post-commit脚本内容:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    #!/bin/sh

     

    REPOS="$1"                  # 仓库的路径

    REV="$2"                    # 新提交的版本号

    LOGFILE=/var/log/svn.log    # 钩子脚本的日志

    # 脚本的标准输出和标准错误输出都打印到日志文件里

    exec 1>>"$LOGFILE"

    exec 2>&1

     

    SVNLOOK=/usr/bin/svnlook

    TIME=$(date "+%Y-%m-%d %H:%M:%S")

    AUTHOR=$($SVNLOOK author -r $REV "$REPOS")  #提交作者

    CHANGEDDIRS=$($SVNLOOK dirs-changed $REPOS) #修改的目录集合

    MESSAGE=$($SVNLOOK log -r $REV "$REPOS")    #提交时的备注信息,不建议用中文

     

    # SVN客户端配置,需要自行修改**********************************

    CLIENT1=172.16.4.235        #project1的服务器

    CLIENT2=172.16.4.236        #project2的服务器

    CLIENTSVNROOT=/data/apps    #WEB服务器的代码根目录

    SVNUSER="zb"

    SVNPASSWD="123456"

    #**************************************************************

     

    function myecho() {

        echo "$TIME" "$*"

    }

     

    myecho "**************************************************************"

    myecho "提交版本:$REV 作者:$AUTHOR"

    myecho "提交备注:$MESSAGE"

    myecho "修改目录:$(echo $CHANGEDDIRS | tr ' ' ' ')"

     

    MASTERDIR=$(echo "$CHANGEDDIRS" | head -1)  #CHANGEDDIRS里的最上级目录

    # 遍历提交的代码目录,同步到WEB服务器上

    while [ "$CHANGEDDIRS" != "" ];do

        PROJECT=$(echo $MASTERDIR | awk -F / '{print $1}')

        # 判断项目文件夹

        if [ "$PROJECT" == "project1" ];then

            myecho

            myecho "项目:$PROJECT 同步目录:$MASTERDIR"

            myecho "同步 $MASTERDIR 到 $CLIENT1:$CLIENTSVNROOT/$MASTERDIR"

            # 无密码ssh连接到客户端服务器,执行svn up

            /usr/bin/ssh www@$CLIENT1 "export LANG=en_US.UTF-8; svn up --non-interactive --username $SVNUSER --password $SVNPASSWD '$CLIENTSVNROOT/$MASTERDIR'"

        elif [ "$PROJECT" == "project2" ];then

            myecho

            myecho "项目:$PROJECT 同步目录:$MASTERDIR"

            myecho "同步 $MASTERDIR 到 $CLIENT2:$CLIENTSVNROOT/$MASTERDIR"

            /usr/bin/ssh www@$CLIENT2 "export LANG=en_US.UTF-8; svn up --non-interactive --username $SVNUSER --password $SVNPASSWD '$CLIENTSVNROOT/$MASTERDIR'"

        else

            :

        fi

        # 在目录集合里删除子目录

        CHANGEDDIRS=$(echo "$CHANGEDDIRS" | grep -v "^$MASTERDIR")

        # 获取新的需要同步的最上级目录

        MASTERDIR=$(echo "$CHANGEDDIRS" | head -1)

    done

        不要忘记给post-commit可执行权限。

    四、测试

        在项目1的"project1/client"和"project1/server"目录下分别上传一个"新建文本文档.txt",查看日志文件/var/log/svn.log:   

        日志显示文件已经同步到项目1WEB服务器上了。

  • 相关阅读:
    UVA1349 Optimal Bus Route Design 最优巴士路线设计
    POJ3565 Ants 蚂蚁(NEERC 2008)
    UVA1663 Purifying Machine 净化器
    UVa11996 Jewel Magic 魔法珠宝
    NEERC2003 Jurassic Remains 侏罗纪
    UVA11895 Honorary Tickets
    gdb调试coredump(使用篇)
    使用 MegaCLI 检测磁盘状态并更换磁盘
    员工直接坦诚直来直去 真性情
    山东浪潮超越3B4000申泰RM5120-L
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/6631481.html
Copyright © 2011-2022 走看看