Navigation Menu

Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CoolQ/DingTalk 实现CI/CD消息推送到群 #31

Open
giscafer opened this issue Jun 19, 2019 · 0 comments
Open

CoolQ/DingTalk 实现CI/CD消息推送到群 #31

giscafer opened this issue Jun 19, 2019 · 0 comments

Comments

@giscafer
Copy link
Owner

giscafer commented Jun 19, 2019

基于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 ""
}

效果

dingtalk

基于酷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的应用目录

coolq

(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请求测试

TIM截图20190619104434

测试方式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'
});

效果:

qq

结合 Gitlab CI 流水线最终效果:

devops qq

到此,就完成了测试了,整个过程已经联调通,最后至于使用shell来直接请求推送消息,还是通过node.js、python等脚本来推送消息,都可以,看个人喜好了。

搭建过程,试了远程执行shell script和node.js 脚本,不亦乐乎(注意脚本安全性)。

curl nodejs

自动消息回复

成员加群,自动发送欢迎消息,自动回复信息等,可以通过CQHttp提供的 事件上报 来实现。

demo代码:https://github.com/1ziton/cqrobot

autoreply


Author: @giscafer,原文地址:front-end-manual/CoolQ/DingTalk 实现CI/CD消息推送到群
欢迎讨论

@giscafer giscafer changed the title CoolQ/DingTalk 实现CI/CD消息推送到QQ群 CoolQ/DingTalk 实现CI/CD消息推送到群 Jun 19, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant