SVN提交更新飞书群通知 (飞书机器人)

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来发送群消息,会存在各种问题。

  1. 消息延迟
    SVN提交完通过访问Jenkins的构建Trigger来发送飞书信息,这样转交一手是没有必要的。而且如果你设置了构建的SVN代码拉取,那还要等代码拉取结束才发消息。

  2. 设置步骤麻烦
    除了在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替换到脚本

复制token

自定义消息格式

推送的消息做了自定义的卡片。格式如下:在这里插入图片描述

需要定制自己的卡片消息或者富文本信息可以登录飞书平台根据提示或者模板修改。

总结

以上就完成了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请求来做。这样做就是需要注意传参的格式,和空格回车等。毕竟一堆的参数,很容易就报参数错误。
希望大家使用开心

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值