基於Gitlab 的 CI/CD 流程搞好後,須要將CI Job或流水線的執行狀態通知到給相關QA或者開發人員,整個大前端組,項目系統工程數量>15個,因此有必要聚合CI/CD相關自動化流水線信息,將相關須要關注的信息經過機器人自動推送到羣裏。前端
工做上經常使用羣的話選擇有微信羣,釘釘,QQ羣等。微信如今限制了2018年以後註冊的新用戶沒法經過腳本走API登陸,很難搞到2016年註冊的小號,所以只能選擇釘釘羣和QQ羣了,由於我司不用釘釘,有本身的OA系統,因此就嘗試了酷Q的機器人推送方案。下面將詳細介紹實現過程。node
DingTalk (釘釘) 提升了羣機器人,提升webhook來實現,特別的方便,消息發送還支持各類格式的模板,好比text、link、markdown等,加強了使用情景和體驗。關於釘釘自定義機器人,官方文檔也很詳細,這裏很少介紹實現過程。詳細見:自定義機器人python
如下主要是消息通知到羣的 shell script.git
# 前一個命令執行狀態判斷是成功信息仍是失敗信息
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 ""
}
複製代碼
搭建服務以前,須要瞭解CoolQ是如何工做的,以及若是經過 CoolQ HTTP API 來推送信息,官方文檔:cqhttp.cc/docs/github
本人在windows 非docker的方式搭建過了一次,而後再在Linux 系統上搭建過一次,整體以爲,仍是docker比較方便,經過官方提供的Docker服務,部署測試經過後,寫對應的腳原本實現消息推送到QQ羣。web
官方文檔:Docker,如下是我的操做步驟記錄。docker
(1)拉取 cqhttp 鏡像shell
docker pull richardchien/cqhttp:latest
複製代碼
(2)用於存儲 酷Q 的程序文件json
mkdir coolq
複製代碼
(3)後臺運行 docker 服務windows
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 和 Secret
這兩個東西是要在接口請求的時候作認證的,保證安全性,避免被別人直接走接口發送信息。
進入第四步驟中 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 你的';
const configOptions = {
url: `http://${COOLQ_HTTP_URL}/send_group_msg`,
method: 'get',
headers: {
// 'Content-Type': 'application/json',
authorization: GITLAB_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'
});
複製代碼
效果:
到此,就完成了測試了,整個過程已經聯調通,最後至於使用shell來直接請求推送消息,仍是經過node.js、python等腳原本推送消息,均可以,看我的喜愛了。
搭建過程,試了遠程執行shell script和node.js 腳本,不亦樂乎(注意腳本安全性)。
Author: @giscafer,原文地址:front-end-manual/CoolQ/DingTalk 實現CI/CD消息推送到羣 , 歡迎討論