基于Gitlab 的 CI/CD 流程搞好后,需要将CI Job或流水线的执行状态通知到给相关QA或者开发人员,整个大前端组,项目系统工程数量>15个,所以有必要聚合CI/CD相关自动化流水线信息,将相关需要关注的信息通过机器人自动推送到群里。
工作上常用群的话选择有微信群,钉钉,QQ群等。微信现在限制了2018年之后注册的新用户无法通过脚本走API登录,很难搞到2016年注册的小号,因此只能选择钉钉群和QQ群了,因为我司不用钉钉,有自己的OA系统,所以就尝试了酷Q的机器人推送方案。下面将详细介绍实现过程。
钉钉机器人消息推送到群
DingTalk (钉钉) 提供了群机器人,提供 WebHook 来实现,特别的方便,消息发送还支持各种格式的模板,比如text、link、markdown等,增强了使用情景和体验。关于钉钉自定义机器人,官方文档也很详细,这里不多介绍实现过程。详细见:自定义机器人
通过 shell script实现模板信息发送
以下主要是消息通知到群的 shell script.
# 前一个命令执行状态判断是成功信息还是失败信息
if [ "$?" -eq "0" ];then
log "[OK]"
DEPLOY_SYSTEM="${!YZT_ENV_SERVER_IP2}:${!YZT_ENV_SERVER_PORT2}"
sendDingTalkSuccessNotifications
else
logStep ">> $?"
DEPLOY_SYSTEM="${!YZT_ENV_SERVER_IP2}:${!YZT_ENV_SERVER_PORT2}"
sendDingTalkErrorNotifications
fi
# 相关脚本
function sendDingTalkErrorNotifications() {
DEPLOY_STATUS='部署失败!'
sendDingTalkNotifications
}
function sendDingTalkSuccessNotifications() {
DEPLOY_STATUS='部署成功!'
sendDingTalkNotifications
}
# 推送模板发送(模板拼接)
function sendDingTalkNotifications() {
logStep " STEP 5 - Send Notifications to DingTalk"
local title="「前端CI/CD」 ${PROJECT_NAME}"
local text="### ${title} \n #### 构建分支:${CI_COMMIT_REF_NAME} \n #### 构建状态:${DEPLOY_STATUS}\n #### 部署主机:${DEPLOY_SYSTEM} \n #### 提交者:${GITLAB_USER_EMAIL} \n\n\n ##### [流水线 Pipeline #${CI_PIPELINE_ID}](${CI_PROJECT_URL}/pipelines/${CI_PIPELINE_ID}) \n"
curl POST "$CI_DINGTALK_WEBHOOK_URL" -H 'Content-Type: application/json' -d "{\"msgtype\": \"markdown\",\"markdown\": {\"title\":\"$title\",\"text\": \"$text\"}}"
# curl POST "$CI_DINGTALK_WEBHOOK_URL" -H 'Content-Type: application/json' -d '{ "msgtype": "markdown", "markdown": {"title":"CI/CD cmp-web","text": "##### 构建分支:test \n Pipelines状态:成功\n ######## [流水线Pipeline #3181](http://git.1ziton.com/front-end/cmp-web/pipelines/3181) \n"}}'
}
function log() {
echo "$(date):$@"
}
function logStep() {
echo "$(date):====================================================================================="
echo "$(date):$@"
echo "$(date):====================================================================================="
echo ""
}
效果
基于酷Q搭建 QQ机器人消息推送到群
搭建服务之前,需要了解CoolQ是如何工作的,以及如何通过 CoolQ HTTP API 来推送信息,官方文档:https://cqhttp.cc/docs/
本人在windows 非 Docker 的方式搭建过了一次,然后再在 Linux 系统上搭建过一次,总体觉得,还是Docker 比较方便。安装官方提供的 Docker 服务,部署测试通过后,写对应的脚本来实现消息推送到QQ群。
Docker 服务安装
官方文档:Docker,以下是个人操作步骤记录。
(1)拉取 cqhttp 镜像
docker pull richardchien/cqhttp:latest
(2)新建一个文件夹,用于存储 酷Q 的程序文件
mkdir coolq
(3)后台运行 docker 服务
docker run -d --rm --name cqhttp-devops -v $(pwd)/coolq:/home/user/coolq -p 9000:9000 -p 18936:5700 -e COOLQ_ACCOUNT=你要登录的QQ号码 -e CQHTTP_POST_URL=http://你的服务器ip:8080 -e CQHTTP_SERVE_DATA_FILES=yes richardchien/cqhttp:latest
介绍一下简单的docker操作命令给新人,查看 cqhttp-devops 的 docker日记可以用 docker logs -f cqhttp-devops
, 删除命令:docker rm -f cqhttp-devops
(4)访问 http://服务器ip:9090
访问正常后,表示服务正常,点击连接
,输入默认密码 MAX8char
,即可进入虚拟机,登录机器人用的QQ账号即可,安全问题,酷Q限制必须是开启了 登录保护
的QQ,才可以登录。
登录成功后,运行CoolQ Air , 会如下图所示,可以查看HTTP API的应用目录
(5)修改 AccessToken
这两个东西是要在接口请求的时候做认证的,保证安全性,避免被别人直接走接口发送信息。
进入第四步骤中 http api 对应的目录下,找到自己登录的 qq 号对应的json文件修改即可。比如 123456.json,如果没有,就是 .ini
后缀,详细见官方文档说明 Configuration
我的配置是如下,操作时改为自己的即可。
[general]
host = 0.0.0.0
post_url = http://192.168.100.100:8080
[3616909583]
access_token = Mgep4rV49rM8Jf
port = 5700
测试消息推送
创建一个群,或者拉你所用的QQ机器人到一个群里,使用curl 方式或者 postman 测试都可以,也可以使用 node.js 脚本测试
测试方式1:postman get请求测试
测试方式2:nodejs代码测试:
const request = require('request');
const COOLQ_HTTP_URL = '192.168.100.100:18936'; // 你的ip:端口(docker部署运行时设置好的)
const ACCESS_TOKEN = 'Bearer 你的accessToken';
const configOptions = {
url: `http://${COOLQ_HTTP_URL}/send_group_msg`,
method: 'get',
headers: {
// 'Content-Type': 'application/json',
authorization: ACCESS_TOKEN
},
qs: {
message: 'test23232322',
group_id: '807533895'
}
};
function getOption(params) {
const message =
`「${params.title}」\n` +
`内容:${params.content}\n` +
'----------------------------------\n' +
`原链接:${params.url}\n`;
configOptions.qs = {
message,
group_id: params.group_id
};
return configOptions;
}
function sendGroupMsg(body) {
let opt = getOption(body);
request(opt, function(error, response, body) {
if (!error && response.statusCode == 200) {
console.log('success');
console.log(body);
}
});
}
sendGroupMsg({
text: 'text',
title: 'CoolQ/DingTalk 实现CI/CD消息推送到群',
content: '内容',
url: 'https://github.com/giscafer/front-end-manual/issues/31',
group_id: '807533895'
});
效果:
结合 Gitlab CI 流水线最终效果:
到此,就完成了测试了,整个过程已经联调通,最后至于使用shell来直接请求推送消息,还是通过node.js、python等脚本来推送消息,都可以,看个人喜好了。
搭建过程,试了远程执行shell script和node.js 脚本,不亦乐乎(注意脚本安全性)。
自动消息回复
成员加群,自动发送欢迎消息,自动回复信息等,可以通过CQHttp提供的 事件上报 来实现。
demo代码:https://github.com/1ziton/cqrobot
Author: @giscafer,原文地址:front-end-manual/CoolQ/DingTalk 实现CI/CD消息推送到群 , 欢迎讨论