记录日常工作关于系统运维,虚拟化云计算,数据库,网络安全等各方面问题。

CENTOS 搭建SVN服务器(附自动部署到远程WEB)

安装subversion服务端

01# 安装
02yum install -y subversion
03 
04# 测试是否安装成功 如果显示了版本信息则表示安装成功
05svnserve --version;sleep 5s
06 
07# svn配置建立svn版本库目录可建多个:
08PATHSSS="/home/svn"
09echo SVN仓库将创建在:$PATHSSS;sleep 5s
10 
11# 新建一个版本库目录
12mkdir -p $PATHSSS
13cd $PATHSSS
14# 建立svn版本库:
15svnadmin create $PATHSSS
16 
17# 先设置passwd
18cat >$PATHSSS/conf/passwd<<ANGIE.K
19[users]
20jianglinzhi = jianglinzhi
21root1 = root
22ANGIE.K
23 
24# 再设置权限authz
25cat >$PATHSSS/conf/authz<<ANGIE.K
26[groups] #用户组
27admin = jianglinzhi,root1
28coder = coders1,coders2,coders3
29ui_and_ue = ui1,ui2,ui3
30[/] #/仓库权限
31@admin = rw
32@coder = rw
33@ui_and_ue = rw
34ANGIE.K
35 
36# 最后设定svnserve.conf
37cat >$PATHSSS/conf/svnserve.conf<<ANGIE.K
38[general]
39# 使非授权用户无法访问
40anon-access = none
41# 使授权用户有写权限
42auth-access = write
43# 用户密码文件
44password-db = passwd
45# 访问控制文件
46authz-db = authz
47# 认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字。
48realm = 姜林志的第一个SNV服务器 欢迎你.
49ANGIE.K
50 
51# 启动 默认端口 3690
52killall svnserve
53svnserve -d -r $PATHSSS
54 
55# 加入开机启动
56echo svnserve -d -r $PATHSSS >> /etc/rc.local

 

导入工程和第一次检出

导入到仓库

cd 进入工程目录上一级
执行:

01#导入前先处理下WIN不支持的文件名 如  : * ? " < > |
02# find ./ -name "*\?*" #查找
03# find ./ -name "*\?*" -print -exec rm -rf {} \; #删除
04# find ./ -name "*\:*" -print -exec rm -rf {} \; #删除
05# find ./ -name "*\"*" -print -exec rm -rf {} \; #删除
06# find ./ -name "*\<*" -print -exec rm -rf {} \; #删除
07# find ./ -name "*\>*" -print -exec rm -rf {} \; #删除
08# find ./ -name "*\|*" -print -exec rm -rf {} \; #删除
09 
10提示:如果你设置了pre-commit钩子(比如:强制要求注释,请先解除这个钩子,以免导入失败)
11 
12svn import 待导入工程路径(目录) svn://127.0.0.1/定义工程在仓库的目录名字 -m "对于本次操作的注释"
13或者 切换到待导入目录
14svn import ./ svn://127.0.0.1/定义工程在仓库的目录名字 -m "对于本次操作的注释"

将在仓库中新建工程目录和文件

检出到工程

cd 进入工程目录 执行即可

1svn co svn://127.0.0.1 ./

判定程序员是否为补丁添加注释(per-commit)

这个钩子脚本,在每次commit之后会执行,格式是SHELL脚本,是从网上收集来的测试可用
这个文件的详细路径请看下面的cd命令

01cd $PATHSSS/hooks
02cp per-commit.tmpl per-commit
03chmod 755 per-commit
04vi $PATHSSS/hooks/per-commit
05###############################################
06#!/bin/sh
07# PRE-COMMIT HOOK
08# .... 中间省略
10REPOS="$1"
11TXN="$2"
12SVNLOOK=/usr/bin/svnlook
13 
14LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
15if [ "$LOGMSG" -lt 8 ];#要求注释不能少于8个字符,您可自定义
16then
17echo -e "\n======================================================" 1>&2
18echo -e "\n请在Commit(提交)前为您的补丁添加必要的注释。\n本次提交被忽略。" 1>&2
19echo -e "\n======================================================" 1>&2
20exit 1
21fi

自动同步到WEB服务器(post-commit)

这个钩子脚本,在每次commit之后会执行,格式是SHELL脚本,是从网上收集来的测试可用
这个文件的详细路径请看下面的cd命令

01# 配置自动发布到WEB服务器 编辑 post-commit 文件
02cd $PATHSSS/hooks
03cp post-commit.tmpl post-commit
04chmod 755 post-commit
05vi $PATHSSS/hooks/post-commit
06###############################################
07#!/bin/sh
08# -------------------------------------------------------------------------------
09# Filename:    post-commit
10# Description: WEB server with synchronization code by SVN
11# -------------------------------------------------------------------------------
12#Version 1.0
13#当用戶把代碼提交完成时,把代碼中的最新更改同步到 WEB服務器,同時注意不包括刪除操作。
14 
15#Set variable
16SVN=/home/svn
17SVNUSER=root1
18SVNPASD=root
19WEB=/home/ftp/svn #待上传到WEB服务器的文件存放路径 第一次 需要先到该目录检出一次svn co svn://127.0.0.1 ./
20  
21WEBIP="192.168.0.23"
22RSYNC=rsync
23LOG=/home/svn/post-commit.log
24export LANG=en_US.UTF-8
25 
26mkdir -p $SVN
27mkdir -p $WEB
28 
29#更新文件到本地文件夹
30svn update $WEB --username $SVNUSER --password $SVNPASD
31#如果前面的代码成功完成,会继续执行下面的代码
32if [ $? == 0 ]
33then
34    echo ""     >> $LOG
35    echo `date` >> $LOG
36    echo "##############################" >> $LOG
37    chown -R nobody:nobody $WEB
38    #同步代码从SVN服务器到WEB服务器 通过RSYNC
39    $RSYNC -vaztpH  --timeout=90   --exclude-from=$SVN/exclude.list $WEB root@$WEBIP:$WEB/ >> $LOG
40fi

完善后的另外一个版本

001#!/bin/sh
002 
003# POST-COMMIT HOOK
004# ... 省略
006 
007# mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf
008echo -e "[1 fo 6]================================\n`date`:这次更新将发布到测试和WEB。" 1>&2
009 
010# 库的路径
011REPOS="$1"
012 
013# 新提交的版本号
014REV="$2"
015 
016changed=$(svnlook changed -r $REV $REPOS)
017echo $changed > /home/svn/hooks/last_changed
018echo $REPOS >> /home/svn/hooks/last_changed
019echo $REV >> /home/svn/hooks/last_changed
020 
021 
022######################################################################################
023# 配置自动发布到WEB服务器 编辑 post-commit 文件 ######################################
024######################################################################################
025# -------------------------------------------------------------------------------
026# Filename:    post-commit
027# Description: WEB server with synchronization code by SVN
028# -------------------------------------------------------------------------------
029#Version 1.1
030#当用戶把代碼提交完成时,把代碼中的最新更改同步到 WEB服務器,同時注意不包括刪除操作。
031 
032#Set variable
033SVN=/home/svn
034SVNUSER=root1
035SVNPASD=root
036 
037# 测试服务器路径
038WEB1=/home/ftp/e/ecshop_2013/wwwroot
039WEB2=/home/ftp/c/customer/wwwroot
040 
041# 远端服务器IP
042WEBIP="192.168.1.1"
043 
044# 同步方式
045RSYNC=rsync
046 
047# 同步日志
048LOG=/home/svn/post-commit.log
049 
050# 避免乱码
051export LANG=en_US.UTF-8
052 
053mkdir -p $SVN
054 
055#更新文件到本地文件夹
056svn update $WEB1  --username $SVNUSER --password $SVNPASD
057svn update $WEB2  --username $SVNUSER --password $SVNPASD
058 
059 
060 
061# 必须要检出成功才开始执行下面的 #####################################################
062if [ $? == 0 ]
063then
064    echo -e "[2 fo 6]================================\n`date`:文件顺利检出到测试项目。" 1>&2
065 
066 
067######################################################################################
068# 这里是解析本次操作的文件名 用于提高修改权限的速度 ##################################
069######################################################################################
070    echo -e "[3 fo 6]================================\n`date`:正在改变文件归属,为上传到WEB服务器准备。" 1>&2
071    str=$changed
072 
073    # 字符串变成类似数组的东西,下面的for可以一次打印一个出来
074    var=`echo $str | awk -F',' '{print $0}' | sed "s/,/ /g"`
075 
076    # list为文件名和SVN标记码一次搞一个出来
077    for list in $var
078    do
079        # 获取每次list字符串的长度
080        filesneme_len=`expr length $list`
081        # 这个if对长度小于1的文件名过滤掉>符号需要转义
082        if [ "$filesneme_len" \> "1" ]
083        then
084            # 这里取得的是字符串的第一个/前后的字符串 分别为仓库名字和带路径文件名
085            #echo 仓库:${list%%/*}
086            #echo 文件:/${list#*/}
087         
088            # 根据仓库名字给文件分派权限
089            if [ "${list%%/*}" == "ec_qiuyi" ]
090            then
091                #设定检出文件为用户组1
092                echo 设定检出文件为用户组1
093                echo 仓库:${list%%/*}
094                echo 文件:/${list#*/}
095                chown 1000:1100 $WEB1/${list#*/}
096                # 只同步修改的内容
097                rsync -vzurtopg --delete --timeout=60 --exclude-from=$SVN/exclude.list "$WEB1/${list#*/}" "root@$WEBIP:$WEB1\_svn/${list#*/}" >> $LOG
098            fi
099             
100            if [ "${list%%/*}" == "customer" ]
101            then
102                #设定检出文件为用户组2
103                echo 设定检出文件为用户组2
104                echo 仓库:${list%%/*}
105                echo 文件:/${list#*/}
106                chown 1002:1100 $WEB2/${list#*/}
107                # 只同步修改的内容
108                rsync -vzurtopg --delete --timeout=60 --exclude-from=$SVN/exclude.list "$WEB2/${list#*/}" "root@$WEBIP:$WEB2\_svn/${list#*/}" >> $LOG
109            fi
110        fi
111    done
112    echo -e "[4 fo 6]================================\n`date`:文件归属修改完成。" 1>&2
113 
114 
115######################################################################################
116# 记录日志和上传文件 #################################################################
117######################################################################################
118 
119    echo ""     >> $LOG;echo `date` >> $LOG;echo "##############################" >> $LOG
120# 修改新检出文件的权限
121# chown -R 1000:1100 $WEB
122# chown -R 1002:1100 $WEB2
123#同步代码从SVN服务器到WEB服务器 通过RSYNC
124#$RSYNC -vaztpH  --timeout=90   --exclude-from=$SVN/exclude.list $WEB root@$WEBIP:$WEB/ >> $LOG
125 
126    echo -e "[5 fo 6]================================\n`date`:正上传到WEB服务器,并检查文件完整。" 1>&2
127 
128 
129    # 同步完整内容 如目录删除文件删除之类..
130     
131    rsync -vzurtopg --delete --timeout=60 --exclude-from=$SVN/exclude.list "$WEB1/" "root@$WEBIP:$WEB1\_svn/" >> $LOG
132    rsync -vzurtopg --delete --timeout=60 --exclude-from=$SVN/exclude.list "$WEB2/" "root@$WEBIP:$WEB2\_svn/" >> $LOG
133 
134 
135    echo -e "[6 fo 6]================================\n`date`:代码已经发布到远端WEB。" 1>&2
136     
137fi
138# 利用钩子错误退出 输出过程信息
139exit 1

完善后的另外二个版本

001#!/bin/sh
002 
003######################################################################################
004# 配置自动发布到WEB服务器 编辑 post-commit 文件 ######################################
005######################################################################################
006# -------------------------------------------------------------------------------
007# Filename:    post-commit
008# Description: WEB server with synchronization code by SVN
009# -------------------------------------------------------------------------------
010#Version 1.0
011#当用戶把代碼提交完成时,把代碼中的最新更改同步到 WEB服務器,同時注意不包括刪除操作。
012 
013 
014echo -e "[1 fo 6]================================\n`date`:这次更新将发布到测试和WEB。" 1>&2
015 
016# 库的路径
017REPOS="$1"
018 
019# 新提交的版本号
020REV="$2"
021 
022changed=$(svnlook changed -r $REV $REPOS)
023echo $changed > /home/svn/hooks/last_changed
024echo $REPOS >> /home/svn/hooks/last_changed
025echo $REV >> /home/svn/hooks/last_changed
026 
027 
028#Set variable
029SVN=/home/svn
030SVNUSER=本地管理员ID
031SVNPASD=本地管理员密码
032 
033mkdir -p $SVN
034 
035# 测试服务器路径
036WEB1=/home/ftp/e/ecshop_2013/wwwroot
037WEB2=/home/ftp/c/customer/wwwroot
038WEB3=/home/ftp/u/ugg_ecshop_2013/wwwroot
039WEB4=/home/ftp/l/luck_ecshop_2013/wwwroot
040 
041# 同步标记
042WEB1_SYNC=NO
043WEB2_SYNC=NO
044WEB3_SYNC=NO
045WEB4_SYNC=NO
046 
047# 待同步操作数
048WEB1_SYNC_NUM=0
049WEB2_SYNC_NUM=0
050WEB3_SYNC_NUM=0
051WEB4_SYNC_NUM=0
052 
053 
054# 同步方式
055RSYNC=rsync
056 
057 
058 
059 
060# 同步日志
061LOG=/home/svn/post-commit.log
062echo "================================================" > $LOG
063echo `date`:这是最近一次SVN提交的信息。>> $LOG
064echo "================================================" >> $LOG
065 
066 
067mkdir -p $WEB1
068mkdir -p $WEB2
069mkdir -p $WEB3
070mkdir -p $WEB4
071 
072# 第一次需要检出
073# svn co svn://127.0.0.1/ec_ugg ./
074 
075# 远端服务器IP
076WEBIP_QY="192.168.1.1"
077WEBIP_UG="192.168.1.2"
078WEBIP_LU="192.168.1.3"
079 
080 
081 
082# 避免乱码
083export LANG=en_US.UTF-8
084 
085#更新文件到本地文件夹
086echo "================================================" >> $LOG
087echo "更新文件到本地文件夹" >> $LOG
088svn update $WEB1  --username $SVNUSER --password $SVNPASD >> $LOG
089svn update $WEB2  --username $SVNUSER --password $SVNPASD >> $LOG
090svn update $WEB3  --username $SVNUSER --password $SVNPASD >> $LOG
091svn update $WEB4  --username $SVNUSER --password $SVNPASD >> $LOG
092echo "================================================" >> $LOG
093 
094# 必须要检出成功才开始执行下面的 #####################################################
095if [ $? != 0 ] ; then
096    echo -e "项目检出失败,同步终止!" 1>&2
097    exit $?
098fi
099echo -e "[2 fo 6]================================\n`date`:文件顺利检出到测试项目。" 1>&2
100 
101######################################################################################
102# 这里是解析本次操作的文件名 用于提高修改权限的速度 ##################################
103######################################################################################
104echo -e "[3 fo 6]================================\n`date`:正在改变文件归属,为上传到WEB服务器准备。" 1>&2
105str=$changed
106 
107# 字符串变成类似数组的东西,下面的for可以一次打印一个出来
108var=`echo $str | awk -F',' '{print $0}' | sed "s/,/ /g"`
109 
110# list为文件名和SVN标记码一次搞一个出来
111for list in $var
112do
113    # 获取每次list字符串的长度
114    filesneme_len=`expr length $list`
115    # 这个if对长度小于1的文件名过滤掉>符号需要转义
116    if [ "$filesneme_len" \> "1" ]
117    then
118        # 这里取得的是字符串的第一个/前后的字符串 分别为仓库名字和带路径文件名
119        #echo 仓库:${list%%/*}
120        #echo 文件:/${list#*/}
121     
122        # 根据仓库名字给文件分派权限
123         
124        # 项目0
125        if [ "${list%%/*}" == "ec_qiuyi" ]
126        then
127            # 设定同步标记
128            WEB1_SYNC="YES"
129            # 累加标记
130            WEB1_SYNC_NUM=$[$WEB1_SYNC_NUM+1]
131            #设定检出文件为用户组1
132            echo 设定检出文件为用户组1
133            echo 仓库:${list%%/*}
134            echo 文件:/${list#*/}
135            chown 1000:1100 $WEB1/${list#*/}
136            # 只同步修改的内容
137            #rsync -vzurtopg --delete --timeout=60 --exclude-from=$SVN/exclude.list "$WEB1/${list#*/}" "root@$WEBIP_QY:$WEB1\_svn/${list#*/}" >> $LOG
138            # 同步完整内容 如目录删除文件删除之类..
139            #rsync -vzurtopg --delete --timeout=60 --exclude-from=$SVN/exclude.list "$WEB1/" "root@$WEBIP_QY:$WEB1\_svn/" >> $LOG # 项目0
140        fi
141         
142        # 项目1
143        if [ "${list%%/*}" == "customer" ]
144        then
145            # 设定同步标记
146            WEB2_SYNC="YES"
147            # 累加标记
148            WEB2_SYNC_NUM=$[$WEB1_SYNC_NUM+1]
149            #设定检出文件为用户组2
150            echo 设定检出文件为用户组2
151            echo 仓库:${list%%/*}
152            echo 文件:/${list#*/}
153            chown 1002:1100 $WEB2/${list#*/}
154            # 只同步修改的内容
155            #rsync -vzurtopg --delete --timeout=60 --exclude-from=$SVN/exclude.list "$WEB2/${list#*/}" "root@$WEBIP_QY:$WEB2\_svn/${list#*/}" >> $LOG
156            # 同步完整内容 如目录删除文件删除之类..
157            #rsync -vzurtopg --delete --timeout=60 --exclude-from=$SVN/exclude.list "$WEB2/" "root@$WEBIP_QY:$WEB2\_svn/" >> $LOG # 项目1
158        fi
159         
160        # 项目2
161        if [ "${list%%/*}" == "ec_ugg" ]
162        then   
163            # 设定同步标记
164            WEB3_SYNC="YES"
165            # 累加标记
166            WEB3_SYNC_NUM=$[$WEB1_SYNC_NUM+1]
167            #设定检出文件为用户组3
168            echo 设定检出文件为用户组3
169            echo 仓库:${list%%/*}
170            echo 文件:/${list#*/}
171            chown 1000:1100 $WEB3/${list#*/}
172            # 只同步修改的内容
173            #rsync -vzurtopg --delete --timeout=60 --exclude-from=$SVN/exclude.list "$WEB3/${list#*/}" "root@$WEBIP_UG:$WEB3\_svn/${list#*/}" >> $LOG
174            # 同步完整内容 如目录删除文件删除之类..
175            #rsync -vzurtopg --delete --timeout=60 --exclude-from=$SVN/exclude.list "$WEB3/" "root@$WEBIP_UG:$WEB3\_svn/" >> $LOG # 项目2
176 
177        fi
178         
179        # 项目3
180        if [ "${list%%/*}" == "ec_luck" ]
181        then
182            # 设定同步标记
183            WEB4_SYNC="YES"
184            # 累加标记
185            WEB4_SYNC_NUM=$[$WEB1_SYNC_NUM+1]
186            #设定检出文件为用户组4
187            echo 设定检出文件为用户组4
188            echo 仓库:${list%%/*}
189            echo 文件:/${list#*/}
190            chown 1000:1100 $WEB4/${list#*/}
191            # 只同步修改的内容
192            #rsync -vzurtopg --delete --timeout=60 --exclude-from=$SVN/exclude.list "$WEB4/${list#*/}" "root@$WEBIP_LU:$WEB1\_svn/${list#*/}" >> $LOG
193            # 同步完整内容 如目录删除文件删除之类..
194            #rsync -vzurtopg --delete --timeout=60 --exclude-from=$SVN/exclude.list "$WEB4/" "root@$WEBIP_LU:$WEB1\_svn/" >> $LOG # 项目3
195        fi     
196 
197 
198    fi
199done
200echo -e "[4 fo 6]================================\n`date`:文件归属修改完成。" 1>&2
201 
202 
203######################################################################################
204# 记录日志和上传文件 #################################################################
205######################################################################################
206 
207echo ""     >> $LOG;echo `date` >> $LOG;echo "##############################" >> $LOG
208# 修改新检出文件的权限
209# chown -R 1000:1100 $WEB
210# chown -R 1002:1100 $WEB2
211#同步代码从SVN服务器到WEB服务器 通过RSYNC
212#$RSYNC -vaztpH  --timeout=90   --exclude-from=$SVN/exclude.list $WEB root@$WEBIP:$WEB/ >> $LOG
213 
214echo -e "[5 fo 6]================================\n`date`:正上传到WEB服务器,并检查文件完整。" 1>&2
215 
216 
217# 同步完整内容 如目录删除文件删除之类..
218echo "================================================" >> $LOG
219echo "同步完整内容 如目录删除文件删除之类.." >> $LOG
220 
221if [ "$WEB1_SYNC" == "YES" ]
222then
223    echo -e "正同步($WEB1_SYNC_NUM个操作记录)到 球衣服务器" 1>&2
224    time rsync -vzurtopg --delete --timeout=60 --exclude-from=$SVN/exclude.list "$WEB1/" "root@$WEBIP_QY:$WEB1\_svn/" >> $LOG # 球衣
225fi
226 
227if [ "$WEB2_SYNC" == "YES" ]
228then   
229    echo -e "正同步($WEB2_SYNC_NUM个操作记录)到 客服系统服务器" 1>&2
230    time rsync -vzurtopg --delete --timeout=60 --exclude-from=$SVN/exclude.list "$WEB2/" "root@$WEBIP_QY:$WEB2\_svn/" >> $LOG # 客服系统
231fi
232 
233if [ "$WEB3_SYNC" == "YES" ]
234then
235    echo -e "正同步($WEB3_SYNC_NUM个操作记录)到 UGG孩子服务器" 1>&2
236    time rsync -vzurtopg --delete --timeout=60 --exclude-from=$SVN/exclude.list "$WEB3/" "root@$WEBIP_UG:$WEB3\_svn/" >> $LOG # UGG鞋子
237fi
238 
239if [ "$WEB4_SYNC" == "YES" ]
240then
241    echo -e "正同步($WEB4_SYNC_NUM个操作记录)到 吉祥符服务器" 1>&2
242    time rsync -vzurtopg '-e ssh -p 10079' --delete --timeout=60 --exclude-from=$SVN/exclude.list "$WEB4/" "root@$WEBIP_LU:$WEB1\_svn/" >> $LOG # 吉祥符
243fi
244 
245echo -e "[6 fo 6]================================\n`date`:代码已经发布到远端WEB。" 1>&2
246echo "================================================" >> $LOG
247 
248 
249# 利用钩子错误退出 输出过程信息
250exit 1

 

一个强制要求程序员为自己的上传注释的钩子(pre-commit)

01REPOS="$1"
02TXN="$2"
03 
04# Make sure that the log message contains some text.
05SVNLOOK=/usr/bin/svnlook
06# $SVNLOOK log -t "$TXN" "$REPOS" | \
07# grep "[a-zA-Z0-9]" > /dev/null || exit 1
08 
09 
10LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
11if [ "$LOGMSG" -lt 8 ];#要求注释不能少于8个字符,您可自定义
12then
13echo -e "\n======================================================" 1>&2
14echo -e "\n请在Commit(提交)前为您的补丁添加必要的注释。\n本次提交被忽略。" 1>&2
15echo -e "\n======================================================" 1>&2
16exit 1
17fi
18 
19# Check that the author of this commit has the rights to perform
20# the commit on the files and directories being modified.
21# commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1
22 
23# All checks passed, so allow the commit.
24# exit 0

 

附件:

exclude.list 文件示例

1vi $SVN/exclude.list
2.svn/
3.DS_Store
4images/


转载请标明出处【CENTOS 搭建SVN服务器(附自动部署到远程WEB)】。

《www.micoder.cc》 虚拟化云计算,系统运维,安全技术服务.

网站已经关闭评论