1. 程式人生 > >CentOS7安裝配置svn及svn hook實戰

CentOS7安裝配置svn及svn hook實戰

子函數 集合 sha 管理 print 我們 註釋 reat 行處理

一、概述

1、何為svn?
Apache Subversion(簡稱SVN,svn),一個開放源代碼的版本控制系統;用來管理文檔,程序代碼等文檔的版本;svn相對git來說有點古老,是一個中心控制的版本控制系統,時至今日仍有不少企業依然使用svn做為代碼等文檔的管理服務;
今天我們就來先介紹下在CentOS7下安裝部署svn服務與日常使用以及重點介紹svn的兩個hooks使用;
2、環境介紹
Svn server:CentOS7.4_x64 ip:172.16.3.167 subversion 1.97 (最新穩定版);何用yum安裝
關閉selinux 關閉防火墻(生產線上務必添加好防火墻規則)
測試端win7 下載安裝Tortoisesvn客戶端請下載與系統版本對應的客戶端軟件

3、安裝Subversion

添加repo源
[root@localhost ~]# cat /etc/yum.repos.d/svn.repo 
[WandiscoSVN]
name=Wandisco SVN Repo
baseurl=http://opensource.wandisco.com/centos/$releasever/svn-1.9/RPMS/$basearch/
enabled=1
gpgcheck=0

安裝
[root@localhost ~]# yum install subversion -y

註意 系統自帶源中安裝的是1.7.x的版本,所以通過此源安裝最新的版本;

二、svn服務器的配置

1、添加到系統服務
默認安裝完安裝包中不提供systemd服務,因此需要自行配置,以下是我的配置

[root@localhost ~]# cat /usr/lib/systemd/system/svnd.service 
[Unit]
Description=subversion server daemon
Documentation=man:svn(8) man:svn(5)
After=network.target

[Service]
Type=forking
#User=svn
#Group=svn 
EnvironmentFile=/etc/sysconfig/svnd      ##相關配置參數所在文件
ExecStart=/usr/bin/svnserve -d --listen-port $PORT --pid-file $pid_file --log-file $log_file -r $SVN_HOME 
ExecReload=/bin/kill -HUP $MAINPID 
KillMode=process
Restart=on-failure
RestartSec=20s

[Install]
WantedBy=multi-user.target

[root@localhost ~]# cat /etc/sysconfig/svnd
##Configure for subversion

pid_file=/var/run/svn.pid
SVN_HOME=/data1/svn_data/projects      #svn主數據目錄
log_file=/var/log/svnd.log
PORT=33690                  #自定義端口為33690

說明:以上的參數均是通過 svnserve --help 獲取配置進去的!
創建目錄
mkdir -pv /data1/svn_data/projects

啟動服務

[root@localhost ~]# systemctl start svnd
[root@localhost ~]# systemctl status svnd
● svnd.service - subversion server daemon
   Loaded: loaded (/usr/lib/systemd/system/svnd.service; disabled; vendor preset: disabled)
   Active: active (running) since 五 2018-01-26 15:39:22 CST; 30min ago
     Docs: man:svn(8)
  Process: 4347 ExecStart=/usr/bin/svnserve -d --listen-port $PORT --pid-file $pid_file --log-file $log_file -r $SVN_HOME (code=exited, status=0/SUCCESS)
 Main PID: 4348 (svnserve)
   CGroup: /system.slice/svnd.service
           └─4348 /usr/bin/svnserve -d --listen-port 33690 --pid-file /var/run/svn.pid --log-file /var/log/svnd.log -r /data1...
1月 26 15:39:22 localhost.localdomain systemd[1]: Starting subversion server daemon...
1月 26 15:39:22 localhost.localdomain systemd[1]: Started subversion server daemon.

添加開機啟動:
[root@localhost ~]#  systemctl enable svnd

2、添加賬號
由於添加賬號和密碼比較頻繁與繁瑣,因此編寫腳本處理,參考如下:

#!/bin/bash
#Author: san
#version: 1.0
#date: 2018-01-26
###########################
SvnDataDir=/data1/svn_data/projects
pre_commit_config=${SvnDataDir}/pre-commit
[ -d ${SvnDataDir}/CodeAuth ] || mkdir -pv ${SvnDataDir}/CodeAuth
[ -f ${SvnDataDir}/CodeAuth/authz ] || touch ${SvnDataDir}/CodeAuth/authz
[ -f ${SvnDataDir}/CodeAuth/passwd ] || touch ${SvnDataDir}/CodeAuth/passwd

prog="$1"
if [ $# -eq 0 ]
then
echo  "Have no project‘s name input,progame exit." && exit 0
fi
cd $SvnDataDir
[ -d $prog ]|| mkdir -p ${SvnDataDir}/$prog
read -p "Give a paassword:-> " propwd
#echo $propwd >>propwd.txt

/usr/bin/svnadmin create $SvnDataDir/$prog
cd $SvnDataDir/$prog/conf
if [ -f ${SvnDataDir}/CodeAuth/passwd ]
   then
    echo "$prog = $propwd" >>${SvnDataDir}/CodeAuth/passwd
else
        echo "[users]" >>${SvnDataDir}/CodeAuth/passwd
        echo "$prog = $propwd" >>${SvnDataDir}/CodeAuth/passwd
fi
echo "[$prog:/]" >>${SvnDataDir}/CodeAuth/authz
echo "$prog = rw" >>${SvnDataDir}/CodeAuth/authz

sed -i ‘s/^# anon-access = read/anon-access = none/g‘ svnserve.conf
sed -i ‘s/^# auth-access = write/auth-access = write/g‘ svnserve.conf
sed -i ‘s/^# password-db = passwd/password-db = \/data1\/svn_data\/projects\/CodeAuth\/passwd/g‘ svnserve.conf
sed -i ‘s/^# authz-db = authz/authz-db = \/data1\/svn_data\/projects\/CodeAuth\/authz/g‘ svnserve.conf
sed -i "s/^# realm = .*./realm = $prog projects /g" svnserve.conf

cp $pre_commit_config ${SvnDataDir}/$1/hooks/ && chmod +x ${SvnDataDir}/$1/hooks/pre-commit
systemctl restart svnd

添加可執行權限
[root@localhost ~]# chmod +x add.sh

說明:腳本中有一個pre-commit文件,這個文件是svn hooks 鉤子之一,用於控制向版本庫中提交時的動作;比如很多開發人員提交代碼到庫中時不填寫備註信息,導致後期回滾時或檢查時找不到對應的說明,因此可以通過pre-commit鉤子來強性讓提交代碼時填寫點信息;這個文件默認是shell可執行文件;也可以是其他語言寫的可執行文件;
以下就是強制提交代碼時需要填寫信息的鉤子,作為默認的模板放在svn數據根目錄下~

[root@localhost ~]# cat /data1/svn_data/projects/pre-commit 
#!/bin/bash
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
LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
if [ "$LOGMSG" -lt 5 ];#要求註釋不能少於5個字符,您可自定義 
then
  echo -e "\nLog message cann‘t be empty! you must input more than 5 chars as comment!." 1>&2
  exit 1
fi
# All checks passed, so allow the commit.
exit 0

此時就可以通過add.sh腳本來添加一個svn庫(賬號和庫同名);如添加san賬號也在/data/svn_data/projects/下創建了針對san的svn版本庫,示例如下:

[root@localhost projects]# ./add.sh san
mkdir: 已創建目錄 "/data1/svn_data/projects/CodeAuth"
Give a paassword:-> 123.com
[root@localhost projects]# ls
add.sh  CodeAuth  pre-commit  san
[root@localhost projects]# cat CodeAuth/authz 
[san:/]
san = rw
[root@localhost projects]# cat CodeAuth/passwd 
[users]
san = 123.com

到此svn server配置完成;接下看看客戶端的使用!

三、svn客戶端使用

1、安裝Tortoisesvn
下載地址看上面,安裝很方便直接下一步到完成!

2、添加版本庫
在桌面上新建一個文件夾名字隨便取這裏叫work
把work目錄作為庫目錄checkout 如下:
技術分享圖片
彈出如下:填寫版本庫地址並輸入賬號密碼
技術分享圖片
點擊OK 如圖:表示版本庫配置成功!
技術分享圖片

3、向版本庫提交文檔
在庫文件夾中創建1.txt文件添加到庫中再提交如圖:
技術分享圖片
技術分享圖片
技術分享圖片
如果不添加備註信息則無法提交成功,出現如下圖所示:
技術分享圖片
以上步聚如果在linux下可以使用命令行處理;
checkout 目錄為版本庫目錄
svn co svn://172.16.3.167:33690/san --username san --password 123.com 目錄
如添加文件到版本庫
svn add 1.txt
提交到庫
svn commit -m "說明信息"
這裏就不多說了!

四、svn之post-commit鉤子使用

1、post-commit鉤子說明
post-commit鉤子默認和pre-commit鉤子一樣是沒有啟用的(所有鉤子函數默認都沒有 啟用);但默認都有一個模板;位置在版本庫的hooks下;如san賬號對應的版本庫

[root@localhost hooks]# ls
post-commit.tmpl  post-revprop-change.tmpl  pre-commit       pre-lock.tmpl            pre-unlock.tmpl
post-lock.tmpl    post-unlock.tmpl          pre-commit.tmpl  pre-revprop-change.tmpl  start-commit.tmpl

2、使用post-commit

通過模板復制成post-commit
[root@localhost hooks]# cp post-commit.tmpl post-commit
默認內容如下:
[root@localhost hooks]# egrep -v ‘(^$|^#)‘ post-commit
REPOS="$1"
REV="$2"
TXN_NAME="$3"
mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf

讓我們修改下,效果是:當我們使用san賬號往san庫中提交時,讓post-commit給我發一份郵件包含版本號,提交時間,提交內容等信息;

[root@localhost hooks]# cat post-commit
#!/bin/bash
export LANG=en_US.UTF-8
REPOS="$1"
REV="$2"
LOGFILE=/data1/svn_data/projects/san/hooks/changedir.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")
echo "$CHANGEDDIRS" >>/data1/svn_data/projects/san/hooks/changedir.log
#獲取修改子項目目錄名
Rsync_Dir=`echo $CHANGEDDIRS |awk -F / ‘{print $1}‘`
#echo "$Rsync_Dir at `date`" >/tmp/testdir.log
function myecho() {
    echo "$TIME" "$*" 
}

myecho "**************************************************************"
myecho "提交版本:$REV 作者:$AUTHOR"
myecho "提交備註:$MESSAGE"
myecho "修改目錄:$(echo $CHANGEDDIRS | tr ‘\n‘ ‘ ‘)"
MASTERDIR=$(echo "$CHANGEDDIRS" | head -1)  #CHANGEDDIRS裏的主目錄

echo "$AUTHOR 代碼更新成功,版本:$REV請熟知 時間:`date +%Y-%m-%d-%H:%M:%S`.項目內容:$Rsync_Dir" | mail -s "$AUTHOR 代碼更新OK" [email protected]     #換成你的郵箱

再按第三節的新建目錄在目錄中創建文件添加和添加到庫中;
你會發現QQ郵箱默認當作垃圾郵件,因為你沒有 備案 不是合法公網ip來源;如果這臺主機備案過綁定過域名一般沒有 這個問題,這裏只測試下邏輯!
如圖:
技術分享圖片

總結:

我們通過svn管理版本,可以實現提交,回溯版本的功能,通過svn hooks可以完成提交前的處理,和提交後的處理工作;這裏只是拋磚引玉,一般中小企業可以使用,比如提交後結合 rsync把更新的內容推到前端服務器上;但需要註意rsync時排除一些配置文件;網頁形式的svn構建請看這裏http://blog.51cto.com/dyc2005/1942131

CentOS7安裝配置svn及svn hook實戰