一、前言

1、思考:如何取得平衡?

代码写的太简单,可复用性较低,易读易懂;

代码写的太抽象,有一定的复用性,维护成本较高,需要专人维护,否则可能引起牵一发而动全身的问题。

如何避免过度抽象,过度简单,具备一定抽象性,但是人人都能维护,分离逻辑和配置。

2、软件设计

什么时候选择自顶向下?什么时候选择自底向上?不知道怎么做,先小思做起来,后再思;知道怎么做,先大思开始做,后再思。

3、分析现状

目前代码业务性太强,如果新建业务线,需要读一遍代码,结合具体项目改数据改配置。且一部分push监控在mainApp进行,一部分push监控在find-error-info项目监控。

4、本次开发与之前代码的不同之处

分离逻辑和数据配置,配置层,获取数据,处理数据,选择通知工具,数据推送。添加评论通知功能。

5、旨在解决什么问题

以后如果新起业务线,做类似功能,不用考虑逻辑如何,改改配置文件即可。

二、学习与再设计

1、参考文档

https://gitlab.pahf.com/help/user/project/integrations/webhooks

https://ding-doc.dingtalk.com/doc#/serverapi2/hoy7iv

https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq

2、参考代码

https://gitlab.pahf.com/f2e/find-error-file

3、重新设计的代码

https://gitlab.pahf.com/fe-experienment/monitor-app-server-test

三、问题记录

1、【gitlab】Hook execution failed: Net::ReadTimeout

在gitlab配置钩子,点击test的时候,出现报错。在接口里面添加如下代码即可。

return res.json({

code: 1,

})

再次点击test,出现Hook executed successfully: HTTP 200,说明配置成功。

2、【linux】E45: 'readonly' option is set (add ! to override)

:wq!,强制保存退出。

3、【钉钉】不能收到消息

{"errcode":300001,"errmsg":"robot type do not match with the message"}

因为webhook地址用成了gitlab机器人的,换成自定义机器人就好了。

4、【钉钉】sign not match

需要在钉钉通知的消息代码里面添加在钉钉群配置的自定义关键词。

5、【钉钉】token is not exist

代码里面的token和钉钉里面的token不一致。

6、每次都要重启nginx和服务端吗?

一般修改了nginx配置,才需要去重启nginx, nginx -s reload。如果修改了服务端文件,需要重启服务端,到服务端项目的根目录执行make stop/make start。

虽然这个问题是常识,但是难免会忘记,如果修改了代码,没起效,看看是否需要重启?不同的服务端项目,重启服务端的命令可能不同,需要看开发者的设计。

四、一些配置

1、配置gitlab的webhook

在mainApp主项目,进入settings/integrations,在url填入你写的服务,勾选相应的钩子。比如http://10.3.7.76:8182/webhook/comment,就勾选Comments的trigger。

2、配置钉钉

在实验阶段,先拉3个人建立一个群,再把人移出去,智能群助手,添加机器人,应该选择自定义(通过webhook接入自定义服务)机器人,不要选择gitlab机器人。

然后设置自定义机器人,机器人名字,添加到群组,安全设置。

记住webhook和安全设置,到时候会在服务端代码用到。

3、nginx配置

# monitorApp,服务端

server {

listen 80;

server_name monitortest.pahfqc.com;

location / {

proxy_pass http://127.0.0.1:8182;

}

}

# mainApp,浏览器端

server {

listen 80;

server_name mainapptest.pahf.la 10.3.7.76;

root /frontend/mainApp/dist;

location / {

index index.html;

try_files $uri /index.html;

}

}

五、编码阶段

1、主项目(客户端)mainApp

省略。。。。。

2、监控项目(服务端)monitorApp

processCommentMsg方法包装从gitlab获取的数据,然后通过工具(比如钉钉)进行消息推送,最终以希望的格式显示到群里。

// processCommentMsg.js 评论,codereview

const https = require("https");

processCommentMsg = (json) => {

console.log(json);

const dingdingReq = https.request(

`https://oapi.dingtalk.com/robot/send?access_token=70fd6914fb1177ecc11ec97308b0205167126759db242311c37f149d7dff94ef`,

{

method: "post",

headers: {

"Content-Type": "application/json;charset=utf-8"

}

},

(res) => {

console.log("获取响应:" + res.statusCode);

res.on('data', function (d) {

console.log("状态码:" + d);

}).on('end', function () {

console.log('请求结束:', res.headers)

});

}

);

const zdyContent = '监控报警:' + '这是一条消息';

const atMobilesArr = [

{

names: ['小芳', 'xiaofang'],

phone: '18816968510',

}]

// 读取config配置,可以传文本格式及是否AT所有人。

const textInfo = {

msgtype: "text",

text: {

content: zdyContent

},

at: {

atMobiles: atMobilesArr,

isAtAll: false

}

};

dingdingReq.write(JSON.stringify(textInfo));

dingdingReq.end();

}

// push.js, 提交代码,一则推送消息,二则更新服务器代码,并重新构建。

processPushMsg = () => {

const { exec } = require('child_process')

const command = [

"cd /frontend/mainApp",

"git fetch --all",

"git reset --hard origin/master",

"git pull --rebase",

"yarn",

"yarn build"

].join(' && ');

exec(command);

}

// app.js

const express = require('express');

const app = express();

app.all('/webhook/comment', async (req, res) => {

let json = getJSON(req.body);

processCommentMsg(json);

return res.json({

code: 1,

})

});

app.all('/webhook/push', async (req, res) => {

let json = getJSON(req.body);

processPushMsg(json);

return res.json({

code: 1,

})

});

app.listen('8182', () => {

console.log('监听端口');

});

# makefile

start:

yarn

pm2 start src/app.js --name monitorApp

stop:

pm2 stop monitorApp

reload:

git checkout .

git pull --rebase

yarn

pm2 reload monitorApp

在服务器上,make start,启动monitorApp,监听接口,守护进程。

六、测试

在gitlab上,打开主项目mainApp,找到webhook,点击test,选择评论钩子,查看钉钉群是否能收到消息。选择某一个merge request,对曾经修改的某个文件进行评论,codereview。鼠标放到代码行左侧,会看到气泡图标。

七、流程图

【温馨提示】该文档将长期更新,新加内容,或另起文章连载同一个话题。

标签:const,部署,res,代码,gitlab,json,自动化,推送,服务端

来源: https://www.cnblogs.com/camille666/p/gitlab_automatic_deploy_message_send.html

配置消息推送服务器,自动化部署和消息推送相关推荐

  1. Java Web项目在Linux服务器自动化部署续-整合Bamboo

    前言 Java Web项目在Linux服务器自动化部署 在这一篇中, 完成的是一个自动化部署的脚本. Atlassian Bamboo 是一款持续集成构建服务器软件(Build Server) 软件地 ...

  2. 苹果的消息是从服务器接收数据,iOS 消息推送原理及简单实现

    从图中可以很清楚的看出来推送的原理主要分为以下几步: 1.由App向iOS设备发送一个注册通知,用户需要同意系统发送推送. 2.iOS向APNs远程推送服务器发送App的Bundle Id和设备的UD ...

  3. 微软软件推送服务器,向 UWP 应用添加推送通知 - Azure Mobile Apps | Microsoft Docs

    向 Windows 应用添加推送通知 06/25/2019 本文内容 概述 本教程介绍如何向 Windows 快速入门项目添加推送通知,以便每次插入一条记录时,向设备发送一条推送通知. 如果不使用下载 ...

  4. 苹果微信推送服务器错误,接入WxPusher微信推送服务出现错误:Content type application/x...

    背景 使用WxPusher微信推送服务 ,可以及时的将服务的一些运行异常信息,发送到自己的微信上,方便了解服务的运行状态(PS:这个服务是免费的). 你可以在这里看到WxPusher微信推送服务的接入 ...

  5. 消息推送服务器令牌,小程序-消息推送配置Token令牌错误校验失败如何解决

    网上借个图 按微信要求:确认此次GET请求来自微信服务器,则原样返回echostr参数内容 都按要求来了,但怎么都不行,总是提示:Token校验失败,请检查确认 /** * 检验签名 */ publi ...

  6. 基于mqtt协议的消息推送服务器,基于 MQTT 协议的推送服务

    一.简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级& ...

  7. 友盟消息推送服务器demo,友盟消息推送总结

    分享的文章连接 1  http://blog.csdn.net/shenjie12345678/article/details/41120637 2:http://dev.umeng.com/push ...

  8. 苹果服务器消息转发,iphone-与APNS服务器进行交互以将推送通知发...

    最好的方法是使用API??,例如以下服务提出的建议: >选择一个Saas API,将其连接到PHP / MySQL应用程序 >城市飞艇 > Pushwoosh > Wonder ...

  9. Java Web项目在Linux服务器自动化部署

    项目介绍 使用Spring+Hibernate开发的Java Web 项目, 在Perforce上做的代码控管, 部署到Linux(Redhat)下的Tomcat服务器上. 手动部署繁琐,如果涉及文件 ...

最新文章

  1. 关于深度学习的小知识点
  2. 部署了OpenStack就拥有了云平台?还差很远呢
  3. IDEA打开html文件时显示错误browser error提示找不到chrome或者别的浏览器
  4. c++17(22)-reinterpret_cast和new动态空间内存申请
  5. 【面试招聘】非科班小白上岸的学习路线
  6. uTools:一个方法“改变”uTools的插件安装/数据目录
  7. 从产品角度谈如何搞定主动用户与被动用户
  8. 事件图谱的构建、推理与应用
  9. 使用Eclipse编译运行MapReduce程序_Hadoop2.6.0_Ubuntu/CentOS
  10. 让你的Win10桌面比macOS还简洁漂亮高大上
  11. Learning records1:nltk安装的一些注意点(学习自用)
  12. Jmeter在win10上字体界面小永久调大方法
  13. 《国产操作系统之银河麒麟》安装VNCserver插件
  14. 会汇编语言学c语言好学吗,只有C语言功底的我学习汇编语言可以吗?
  15. c语言编译器a安卓,c语言编译器手机版下载-c语言编译器appv7.1 安卓版 - 极光下载站...
  16. JavaScript实现树结构(一)
  17. 解决0x00000001电脑蓝屏问题
  18. wu-database-lazy-starter(懒人数据库操作-核心增量式更新)
  19. 吉林大学软件学院编译原理与实现习题(二) 期末复习用
  20. MyBatis学习记录

热门文章

  1. jqGrid基本使用
  2. 孙陶然:成功者风光的背后是和你一样的坎坷
  3. 电脑显示无网络,刷新DNS解析缓存
  4. Ubuntu通过samba winbind集成AD账号
  5. win10无限蓝屏_快速解决Win10无限重启的方法
  6. 文档中的文字太紧凑,word行间距怎么调整?
  7. EasyExcel:读取Excel数据到List集合中
  8. 关键点检测项目代码开源了!
  9. Word文字怎么复制粘贴
  10. Hbuildx 使用vue打包的App实现微信分享功能