Subversion提供了强大的hooks脚本功能,主要用于控制commit操作前,后的执行动作,以及lock,unlock操作前,后的执行动作;默认在版本仓库下的hooks目录下存在着这些脚本的模板文件; 本节中将介绍下hooks目录下post-commit和pre-commit脚本的使用,其他脚本的功能不同,但执行过程类似;一般pre-commit脚本用来检查用户提交前的条件,例如用来检查用户是否对提交的内容进行了注释等;post-commit脚本用来执行commit动作完成后,测试服务器的自动更新等操作;下面就来演示下这两个功能的实现:
1:pre-commit脚本,实现功能:用户提交操作时必须填写注释,且大于5个字符,否则提交将会失败。
- root@java-203-svn:~# cat /usr/local/subversion/repos/sa/hooks/pre-commit
- #!/bin/sh
- #function:verify user's svn commit comment must more than 5 characters,otherwise commit will failure
- #author:lw.yang
- #version: v-1.0
- #modify_time: 2011-03-22
- REPOS="$1"
- TXN="$2"
- SVNLOOK=/usr/local/subversion/bin/svnlook
- LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
- if [ "$LOGMSG" -lt 5 ];then
- echo -e "Log message cann't be empty! you must input more than 5 chars as comment!" 1>&2
- exit 1
- fi
- exit 0
- root@java-203-svn:~# chmod +x /usr/local/subversion/repos/sa/hooks/pre-commit
测试:
2:post-commit脚本,实现功能:用户commit操作完成后,测试服务器(本例中为另外一台linux服务器,ip地址192.168.50.7)自动更新用户提交的内容
- root@java-203-svn:~# cat /usr/local/subversion/repos/sa/hooks/post-commit
- #!/bin/sh
- #funciton:automatic update svn on remote server
- #author:lw.yang
- #version: v-1.0
- #modify_time: 2011-03-22
- IP=192.168.50.7
- DIR=/svn_project/sa
- DATE=$(date)
- /usr/bin/ssh root@$IP /usr/bin/svn update $DIR
- if [ "$?" -eq "0" ];then
- echo "svn update successful on $DATE" >> /var/log/svn_sa_update.log
- exit 0
- else
- echo "svn update failure on $DATE" >> /var/log/svn_sa_update.log
- fi
- 测试:先checkout一份最新的代码
- [root@rhel5 ~]# mkdir -p /svn_project
- [root@rhel5 ~]# cd /svn_project/
- [root@rhel5 svn_project]# svn co http://svn.***.com/sa --username=yangliangwei --password=123456
- A sa/branchs
- A sa/trunk
- A sa/trunk/apache_2.2.16.sh
- A sa/trunk/install-pureftp.sh
- A sa/trunk/mysql_5.1.36.sh
- A sa/trunk/svn_co_ex_rsync.sh
- A sa/trunk/ks.cfg
- A sa/tags
- 迁出后的trunk目录文件如下
- [root@rhel5 trunk]# ls /svn_project/sa/trunk/
- apache_2.2.16.sh install-pureftp.sh mysql_5.1.36.sh svn_co_ex_rsync.sh ks.cfg
- 出现上面的错误,看上去是权限的问题,发现手动运行可以更新成功,基本上可以确定是subversion用户权限的问题,
- 这里的svn是以apache方式运行,所以就是daemon用户的权限问题
- root@java-203-svn:~# /usr/local/subversion/repos/sa/hooks/post-commit
- A /svn_project/sa/trunk/post.txt
- Updated to revision 9.
- [root@rhel5 trunk]# ls /svn_project/sa/trunk/
- apache_2.2.16.sh install-pureftp.sh ks.cfg mysql_5.1.36.sh post.txt svn_co_ex_rsync.sh
- 修改daemon用户的家目录和登录shell配置,并建立公钥信任
- root@java-203-svn:~# ps -ef |grep httpd
- root 11934 1 0 2010 ? 00:00:01 /usr/local/apache2/bin/httpd -k start
- daemon 19722 11934 0 15:30 ? 00:00:00 /usr/local/apache2/bin/httpd -k start
- root@java-203-svn:~# grep 'daemon' /etc/passwd
- daemon:x:2:2:daemon:/home/daemon:/bin/bash
- root@java-203-svn:~# mkdir /home/daemon
- root@java-203-svn:~# cp -rvp /etc/skel/.bash* /home/daemon/
- root@java-203-svn:~# chown -R daemon.daemon /home/daemon/
- root@java-203-svn:~# su - daemon
- [daemon@java-203-svn ~]$ ssh-keygen
- The key fingerprint is:
- 3a:a2:b3:13:a2:9d:ae:00:00:88:4a:06:28:20:8e:fc daemon@java-203-svn
- [daemon@java-203-svn ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.50.7
- 28
- root@192.168.50.7's password:
- Now try logging into the machine, with "ssh 'root@192.168.50.7'", and check in:
- .ssh/authorized_keys
- to make sure we haven't added extra keys that you weren't expecting.
- [daemon@java-203-svn ~]$ date && ssh root@192.168.50.7 date
- Tue Mar 22 16:03:15 CST 2011
- Tue Mar 22 16:03:15 CST 2011
发现自动更新成功,OK,大功告成,收工,哈哈…
[root@rhel5 trunk]# ls /svn_project/sa/trunk/
apache_2.2.16.sh install-pureftp.sh ks.cfg mysql_5.1.36.sh svn_co_ex_rsync.sh
本文转自斩月博客51CTO博客,原文链接http://blog.51cto.com/ylw6006/522712如需转载请自行联系原作者
ylw6006