SVN钩子

直接使用方式

  • 在svn仓库的hooks目录下编写pre-commit或者post-commit的可执行文件。从而让svn可以在提交时和提交后执行一些检查脚本或者通知脚本。
  • svnlook命令可以指定读取某一个提交的修改,文件等信息

直接上脚本

  • svn检查日志单子格式+ 检查erlang配置格式是否正确
#! /bin/bash

export LANG=zh_CN.UTF-8
REPOS="$1" # 参数1为仓库名
TXN="$2" # 参数2为本次提交生成的临时标签
SVNLOOK=/usr/bin/svnlook

# 判断提交log与预设的规则是否匹配
LOGMSG=$($SVNLOOK log -t "$TXN" "$REPOS")
LOGFORMAT="【(需求|优化|修复|配置)】.+" # 日志单子必须固定的描述开头
if [[ ${LOGMSG} =~ ${LOGFORMAT} ]]
then
    :
else
    echo "提交日志开头格式应为:【需求】、【优化】、【修复】、【配置】" >&2
    exit 1
fi

# 尝试编译cfg文件
# 通过命令直接获得本次提交:非删除的、非xls的erl配置文件
CHANGE_LIST=$($SVNLOOK changed -t "$TXN" "$REPOS" | grep -v '/$' | grep -v '^D.*' | grep '\.erl$' | grep -v '.*config\/src\/xls.*erl$' | grep 'config.*cfg_.*' | awk '{print$2}')
ESCRIPT=/usr/local/bin/escript
CHECK_SCRIPT=/data/test_hook/trunk/script/tool/check_config_syntax.es # 编译检查的es脚本
ERROR_OUTPUT="$REPOS/hooks/check_cfg_output"
touch $ERROR_OUTPUT
echo "" > $ERROR_OUTPUT #重置一个错误输出文件

for FILE in $CHANGE_LIST # 遍历所有文件尝试编译
do
    FILENAME=$(basename $FILE)
    $SVNLOOK cat -t $TXN $REPOS $FILE > "$REPOS/hooks/$FILENAME" # 先写入到一个缓冲文件,不然传入的参数有点乱
    $ESCRIPT $CHECK_SCRIPT $ERROR_OUTPUT "$REPOS/hooks/$FILENAME" # 编译缓冲文件,如果有错误会先输出到错误收集文件
done

ALL_ERROR=$(cat $ERROR_OUTPUT)
if [[ $ALL_ERROR != "" ]] # 读取所有的错误收集,如果有内容,那么直接拒绝提交,把错误输出会svn的dialog
then
    mv -f "$REPOS/hooks/*.beam" /tmp 2>/dev/null
    mv -f "$REPOS/hooks/*.erl" /tmp 2> /dev/null
    cat $ERROR_OUTPUT >&2
    exit 1
else
    mv -f "$REPOS/hooks/*.beam" /tmp 2>/dev/null
    mv -f "$REPOS/hooks/*.erl" /tmp 2>/dev/null
fi


exit 0
  • 提交后自动迁出(因为svn的内容是保存在数据库的,所以加上自动迁出会比较直观)
#!/bin/sh

REPOS="$1"
REV="$2"

User='qiushiyu'
Password='123456'
export LANG='zh_CN.UTF-8'
cd $DeployPath
# svn cleanup
svn update /data/test_hook --username $User --password $Password

可能会遇到的问题

  • 返回svn dialog的中文乱码:

    往脚本里面添加一个这个export LANG=zh_CN.UTF-8

根据你的实际状况,LANG的值能够尝试改成en_US.UTF-8/zh_CN.GBK

  • svnlook cat命令传入其他语言中内容换行可能有错误:

    先写入一个缓冲文件后续再操作,增加一点点io但无伤大雅

  • svn积极拒绝:

    svn服务没开啊兄弟,检查一下svnserve.service或者svnserve命令的进程吧,看看端口号,仓库目录什么的有没有错。

  • 提交时感觉脚本没有执行:

    那一定是脚本写错了,自己调一下

svn钩子介绍

SVN服务端hooks主要有以下9种:

pre-lock:文件加锁前执行,不常用

post-lock:文件加锁后执行,通常用来发送锁定事件通知,需要传递两个参数给hooks脚本,按照顺序依次为:1.版本库路径,2.锁定路径的认证用户名

per-unlock:文件解锁前执行,不常用

post-unlock:文件解锁后执行,通常用来发送解锁事件通知,需要传递两个参数给hooks脚本,按照顺序依次为:1.版本库路径,2.解锁路径的认证用户名

start-commit:开始提交时执行,在pre-commit之前,通常用来确定用户是否有提交权限

pre-commit:提交之前执行,在start-commit之后,通常用来对提交内容的检查,例如我们后边要介绍的利用pre-commit做提交log的合规性检查,需要传递两个参数给hooks脚本,按照顺序依次为:1.版本库路径,2.提交事务的名称

post-commit:提交完成后执行,这应该是使用最广的hooks之一,通常用来在提交之后发送提交通知,甚至是利用它来做自动化的CI/CD等操作,需要传递两个参数给hooks脚本,按照顺序依次为:1.版本库路径,2.提交创建的修订版本号

pre-revprop-change:在修改revision属性之前执行,不常用

post-revprop-change:在修改revision属性之后执行,不常用


SVN钩子
https://qiil.github.io/2021/06/29/SVN钩子/
作者
QSY
发布于
2021年6月29日
许可协议