Jenkins发送飞书信息
2022.9.16更新 用python脚本
效果
步骤
1.修改 svn/hooks/post-commit 脚本。
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
REPOS="$1"
REV="$2"
python3 /home/svn/pub.py "$REV" "$REPOS"
2.添加python发送脚本
import sys
import requests
import subprocess
#定义python系统变量
REV = sys.argv[1]
SVNURL = sys.argv[2]
print(SVNURL)
result = subprocess.run(['svnlook','author','-r',REV,SVNURL], stdout=subprocess.PIPE)
author = result.stdout.decode('utf-8')
result = subprocess.run(['svnlook','date','-r',REV,SVNURL], stdout=subprocess.PIPE)
timeStr = result.stdout.decode('utf-8')
timeNow = timeStr.split('+')[0]
result = subprocess.run(['svnlook','log','-r',REV,SVNURL], stdout=subprocess.PIPE)
message = result.stdout.decode('utf-8')
result = subprocess.run(['svnlook','changed','-r',REV,SVNURL], stdout=subprocess.PIPE)
changed = result.stdout.decode('utf-8')
if(len(changed)>1000):
changed = changed[0:1000]
changed += "..."
with open('/home/svn/log.txt', 'a+') as f:
print(message,file=f)
# 飞书机器人的webhook地址
url = ' https://open.feishu.cn/open-apis/bot/v2/hook/****'
method = 'post'
headers = {'Content-Type':'application/json'}
content=["** 提交人:**","** 提交时间:**\n","**️ 版本:**","** 日志:**\n","**修改文件:**\n"]
data = {
"msg_type": "interactive",
"card": {
"config": {
"wide_screen_mode": True,
"enable_forward": True
},
"elements": [
{
"fields": [
{
"is_short": True,
"text": {
"content": content[0]+author+content[2]+REV,
"tag": "lark_md"
}
},
{
"is_short": True,
"text": {
"content": content[1]+timeNow,
"tag": "lark_md"
}
},
{
"is_short": False,
"text": {
"content": "",
"tag": "lark_md"
}
},
{
"is_short": False,
"text": {
"content": content[3]+message,
"tag": "lark_md"
}
},
{
"is_short": False,
"text": {
"content": "",
"tag": "lark_md"
}
},
{
"is_short": False,
"text": {
"content": content[4]+changed,
"tag": "lark_md"
}
}
],
"tag": "div"
},
{
"tag": "hr"
},
{
"elements": [
{
"content": "✅ ManJia Net 技术支持",
"tag": "plain_text"
}
],
"tag": "note"
}
],
"header": {
"template": "ding",
"title": {
"content": "【SVN更新通知】", # 卡片名称
"tag": "plain_text"
}
}
}
}
res= requests.request(method=method,url=url,headers=headers,json=data)
print(res.json())
环境:
1.安装python3
2. 添加脚本运行权限 chmod +x post-commit
3. 如果是用http协议修改用户组为apache chown -R apache:apache /home/svn/pub.sh
=======================================================
以下为旧答案 用shell脚本实现 原理是一样的
目前网上大部分的飞书群通知都是基于Jenkins的构建信息,发送群通知。其实很多时候,我们项目组只需要在有成员提交代码的时候通知大家。
即SVN提交就通过飞书机器人来发群消息。
如果是通过Jenkins来发送群消息,会存在各种问题。
-
消息延迟
SVN提交完通过访问Jenkins的构建Trigger来发送飞书信息,这样转交一手是没有必要的。而且如果你设置了构建的SVN代码拉取,那还要等代码拉取结束才发消息。 -
设置步骤麻烦
除了在svn放置钩子,还要设置Jenkins的Token URL。
当然如果是要做构建之后的消息推送,Jenkins是必要的。
SVN直接发送飞书群消息
Hook脚本
在svn的项目目录hook底下,重写post-commit脚本。此脚本会在svn代码提交之后被触发。hook底下也有样例脚本,即tmpl。脚本中可以取到的参数都做了说明。可以获得两个参数,svn项目路径和提交的版本。
位置:
/home/svn/hooks/post-commit.sh
代码如下:
#!/bin/sh
# POST-COMMIT HOOK
REPOS="$1"
REV="$2"
/home/svn/pub.sh "$REV" "$REPOS"
添加运行权限:
chmode +x post-commit.sh
可以直接在这里写脚本,但是我将逻辑单独抽离出来,这样子其他需要做推送的地方,只要调用一下这个脚本即可,方便后期做统一的维护和更新。代码也显得比较简洁。
推送脚本:
位置
/home/svn/pub.sh
代码如下:
#!/bin/bash
export LANG=en_US.UTF-8
# 仓库的路径
REPOS=$2
# 新提交的版本号
REV=$1
# 钩子脚本的日志
SVNLOOK=/usr/bin/svnlook
##
TIME=$(date "+%Y-%m-%d %H:%M:%S")
# 提交作者
AUTHOR=$($SVNLOOK author -r $REV "$REPOS")
# 修改的目录集合
CHANGEDDIRS=$($SVNLOOK dirs-changed $REPOS)
# 提交时的备注信息,不建议用中文,中文测试也可OK
MESSAGE=$($SVNLOOK log -r $REV "$REPOS")
curl -X POST -H "Content-Type: application/json" \
-d '{"msg_type":"interactive","card": {
"config": {
"wide_screen_mode": true,
"enable_forward": true
},
"i18n_elements": {
"zh_cn": [
{
"fields": [
{
"is_short": true,
"text": {
"content": "'"**👤 提交人:**\n$AUTHOR"'",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "'"**📅 提交时间:**\n$TIME"'",
"tag": "lark_md"
}
},
{
"is_short": false,
"text": {
"content": "",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "'"**🗂️ 版本:**\n$REV"'",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "'"**📚 修改内容:**\n$MESSAGE"'",
"tag": "lark_md"
}
}
],
"tag": "div"
},
{
"tag": "hr"
},
{
"elements": [
{
"content": "✅ ManJia Net 技术支持",
"tag": "plain_text"
}
],
"tag": "note"
}
]
},
"header": {
"template": "ding",
"title": {
"content": "【SVN更新提醒】",
"tag": "plain_text"
}
}
}}' \
https://open.feishu.cn/open-apis/bot/v2/hook/***** #需要替换成自己的机器人hook
添加运行权限:
chmode +x pub.sh
其中脚本中的url需要修改自己的机器人的token。
添加机器人
群添加机器人
添加自定义机器人
获得机器人的hook替换到脚本
自定义消息格式
推送的消息做了自定义的卡片。格式如下:
需要定制自己的卡片消息或者富文本信息可以登录飞书平台根据提示或者模板修改。
总结
以上就完成了svn提交推送到飞书群,其实非常简单,即在svn添加钩子,在钩子里添加一个飞书的post动作即可。但是实际中,我碰到了不少问题,第一个是如何取到svn的作者和日志信息。这部分钩子脚本是没有给的。需要通过svnlook指令去做。原本是写了一个python的脚本来处理,通过如下代码。
result = subprocess.run(['svnlook','log','-r',REV,SVNURL], stdout=subprocess.PIPE)
message = result.stdout.decode('utf-8')
直接运行这个脚本的时候是没有问题,但是实际通过提交svn发现会中文乱码。相当诡异。
错误:
后来,我就使用shell脚本,直接curl post请求来做。这样做就是需要注意传参的格式,和空格回车等。毕竟一堆的参数,很容易就报参数错误。
希望大家使用开心