首先对windows命令集不熟悉,命令中一些不必要的空格造成不小麻烦;其次由于需要获取SVN提交内容,而
looksvn info
命令中获取到的结果是带有换行的结果,在windows bat 中不容易获取,且curl命令调试困难,所以改用触发Python来达到目的。
首先在
仓库\hook\post-commit.cmd
钩子中编辑:
set REPOS=%1
set TXN=%2
set SVNLOOK="%VISUALSVN_SERVER%\bin\svnlook.exe"
YouPythonPath\python.exe %1\hooks\svn-hook.py %SVNLOOK% %2 %1复制代码
使用python获取到需要参数 SVNLOOK位置 版本号 仓库
注意此时提交操作并不能触发到Python脚本
由于svn server没有足够权限
提示 failed exit code 1 with no output
使用 WIN + R 打开 services.msc
右键属性变更为:
下面可以正常使用属性的Python编写触发代码了
#获取参数
args = sys.argv
svnlook = args[1]
ver = args[2]
rep = args[3]
#获取执行结果
commond = svnlook + ' info -r ' + ver +' ' + rep
result = os.popen(commond).read()
#结构化结果
result_datas = result.split('\n')
user = result_datas[0]
#仓库名称
res = rep.split('\\')[-1]
ver = ver
#提交的commit message
logs = result_datas[3]
#提交时间
time = result_datas[1]
#仓库链接
paths = rep.split('\\')[1:]
url = 'ip/' + '/'.join(paths)
#看看提交的内容中有没有@人
pattern = re.compile(r'(?<=@)[^\s]+\s?')
re_result = pattern.findall(logs)
#为了省事直接使用本地json映射了svn username 和 钉钉联系电话
contact = []
with open(rep+'/hooks/contact.json', encoding='utf-8') as f:
data = json.load(f)
print(type(data))
for name in re_result:
del_space_name = name.strip()
print(del_space_name in data)
if (del_space_name in data):
contact.append(data[del_space_name])
生成markdown内容
content = f'#### {user}\n\n'
content += f'> 更新仓库:{res}\n\n'
content += f'> 版本:{ver}\n\n'
content += f'> 更新内容:{logs}\n\n'
content += f'###### {time}发布 \n\n'
content += f'###### [详情]({url})'
def send_request(text,contact):
# Request
# POST https://oapi.dingtalk.com/robot/send
response = requests.post(
url="https://oapi.dingtalk.com/robot/send",
params={
"access_token": "you token",
headers={
"Content-Type": "application/json",
data=json.dumps({
"msgtype": "markdown",
"markdown": {
"title": user + "更新通知",
"text": 'text
"at":{
"atMobiles":contact,
"isAtAll":0
print('Response HTTP Status Code: {status_code}'.format(
status_code=response.status_code))
print('Response HTTP Response Body: {content}'.format(
content=response.content))
except requests.exceptions.RequestException:
print('HTTP Request failed')
send_request(content,contact)复制代码
这时只要仓库有更新动作就可以通知到钉钉群中的人啦(减少产品经理更改文档没有及时通知UI或开发造成的撕逼