当前位置: 首页 > Web前端 > JavaScript

介绍钉钉机器人通知GitlabCI-CD构建状态

时间:2023-03-27 11:57:16 JavaScript

这篇文章是2020年的文章,当时是在公司环境下写的。现在大部分公司都有使用docker或者oss部署的DevOps性能平台前言本文是前面写的《利用 Gitlab CI/CD 实现自动构建,自动部署》的续篇。我们知道Gitlab的Pipeline中的Job执行成功或失败后,对应的Job状态会变为passed或failed。当Job状态发生变化时,我们需要在GitlabCI/CD页面查看Job状态,看是否有Packingiscomplete。实践表明,有时候我们的gitlab执行job往往需要等待很长时间,而且不稳定。导致我们反复去CI/CD页面查看Job是否执行。所以我们需要一个更加友好高效的Job执行完成状态的反馈方案。由此,我想到了钉钉通知机器人。引入钉钉机器人其实就是在钉钉群里引入一个webhook机器人,然后给你提供一个token和secret,只需要发起一个指定格式的http请求即可。详情请看:https://ding-doc.dingtalk.com/doc#/serverapi3/iydd5h官方文档分析的很清楚。需要注意的是这一步需要签名:/*使用timestamp+"\n"+key作为签名串,使用HmacSHA256算法计算签名,然后进行Base64编码,\n最后urlEncode得到最终签名的签名参数(需要UTF-8字符集)。-这个是用node的crypto加密模块实现的,大致如下("base64");返回encodeURIComponent(str);};constsign=encryptSign(this.secret,timestamp+"\n"+this.secret);自定义钉钉机器人钉钉支持多种类型的消息,我们需要的是文字和卡片类型的消息,如下图。结合钉钉文档,我们封装了自己的机器人dingtalkBot类,支持快速发送短信和卡片消息。脚本如下:dingtalkBot.js/*eslint-disable@typescript-eslint/no-var-requires*/constcrypto=require("crypto");constaxios=require("axios");constencryptSign=(secret,content)=>{conststr=crypto.createHmac("sha256",secret).update(content).digest().toString("base64");returnencodeURIComponent(str);};/***DingTalkRobotWebHook:用于支持DingtalkBot消息发送**官方文档:https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq*/classDingtalkBot{/***机器人工厂,所有消息推送项目都会调用this.webhook接口发送**@param{String}options.webhook完整接口地址*@param{String}options.baseUrl接口地址*@param{String}options.accessTokenaccessToken*@param{String}选项。secret秘密*/constructor(options){options=options||{};if(!options.webhook&&!(options.accessToken&&options.baseUrl)){thrownewError("缺少参数!");}//先使用options.webhook//然后将options.baseUrl和options.accessToken组合成一个webhook地址this.webhook=options.webhook||`${options.baseUrl}?access_token=${options.accessToken}`;this.secret=options.secret;}/***发送钉钉消息**@param{Object}content发起的消息对象*@return{Promise}*/send(content){letsingStr="";if(this.secret){consttimestamp=Date.now();singStr="×tamp="+timestamp+"&sign="+encryptSign(this.secret,timestamp+"\n"+this.secret);}returnaxios.request(this.webhook+singStr,{method:"POST",headers:{"Content-Type":"application/json",},data:JSON.stringify(content),});}/***发送纯文本消息,支持@groupmembers**@param{String}content消息内容*@param{Object}at@member在群里的电话号码*@return{Promise}*/text(content,在){在=在||{};返回this.send({msgtype:"text",text:{content,},at,});}/***发送actionCard(动作卡片)*ps:支持支持多按钮,支持Markdown**@param{String}card.title标题*@param{String}card.text消息内容*@param{String}card.btnOrientation按钮排列方向(0竖,1横,默认为0)*@param{String}card.btn.title按钮标题*@param{String}card.btn.actionURL按钮链接*@return{Promise}*/actionCard(card){returnthis.发送({msgtype:"actionCard",actionCard:{title:card.title,text:card.text,btnOrientation:card.btnOrientation||0,btns:card.btns||[],},});}}module.exports=钉钉机器人;在消息模板上面自定义消息类型我们知道我们需要一些构建信息(项目、分支、环境等),@指定的提交者已经折腾过了,我们知道gitlabrunner在执行node脚本的时候,process.env变量包含了我们需要的所有变量,如图所示,上面的截图只是一部分,所以我们定义了如下除卡片消息外的markdown格式模板。我们需要@notify指定的提交者。根据钉钉提供的API,我们需要提交者的电话号码信息。然后我们在node执行js的时候暴露作者的电话号码信息。同样的折腾之后,我们就可以为项目设置环境变量了。当gitlabrunner执行Job时,会暴露给执行环境。详见:https://docs.gitlab.com/help/ci/variables/README#variables例如:这里设置了luxuemin的变量名,变量值为我的号码:xxxxx。注意:这里是有映射关系的。变量名是luxuemin,这是我在gitlab平台的用户名,应该也是git的用户名。如图配置好映射关系后,我们就可以@指定提交者了。constgitlabUserName=process.env.GITLAB_USER_NAME;constphoneNumber=process.env[gitlab用户名];//在gitlabCI/CD上配置映射到GITLAB_USER_NAME的电话号码awaitrobot.text("Pleasecheckyourbuildinformation",{atMobiles:[phoneNumber],isAtAll:false,});发送消息脚本文件notify.js上面的脚本文件还添加了一个GithubTodayTrending(今天随机推荐一个github的trending项目)的小彩蛋,以及一张随机的吸睛图片。如图:根据前面脚本模拟jenkins请求的结果,node在执行上面的脚本之前,携带了成功和失败的状态,这里用status表示,JS脚本启动同时用process.exit(status)退出,可以参考如下脚本RES=$(curl-XPOST\--usertao-tao:1169ee9c0493b27d915632c0577fdd66fd\--data'json={"parameter":[{"name":"PJ","value":"crm-finance-static"},{"name":"MYENV","value":"'$env'"},{"name":"TAG","value":"'$branch"}]}'\--compressed\'http://xxxx/job/tao.tao/build?delay=0sec'\)#if["$RES"];然后{echo'失败了!';出口1;}fiif["$RES"];然后节点脚本/notify.js$env$branch--status=1||{echo'失败!';exit1;}elsenodescripts/notify.js$env$branch--status=0&&{echo'成功!';exit0;}fi最终配置了crm-finance来导入这个机器人。以后有需要的小伙伴可以在自己的项目中引入。小伙伴如果想进Gitlab&钉钉通知机器人测试群,可以扫码加入。热烈欢迎!原文地址:https://github.com/jackluson/...