钉钉机器人 自动化发版

news/2024/12/20 12:00:24/文章来源:https://www.cnblogs.com/elvi/p/18619018

钉钉机器人 自动化发版

#1 简介

  • 开发机器人接收消息并调用构建接口, 实现自动化发版
  • 发送指令 -> 机器人接收指令 -> 调用jenkins-job远程构建与部署
  • jenkins配置,勾选job配置的触发远程构建并设置身份验证令牌
#测试 触发远程构建
curl -ks -u user:user_token -X POST \jenkins_url/job/job_name/buildWithParameters?token=job_token

#2、创建机器人

#2.1 登录钉钉开放平台
  • 登录用户需要有管理员权限
    https://open-dev.dingtalk.com/fe/app
#2.2 创建机器人
  • 应用开发 -> 机器人 -> 创建应用
    • 继续使用旧版,名称如cici
    • 应用信息,复制AppSecret
  • 开发管理,修改,消息接收地址
    • 填写如 http://api.elvin.vip/dingtalk-cicd

  • 创建test企业群, 添加机器人cici
  • 复制群机器人token到default_token
#2.3 运行机器人服务

配置环境变量文件.env_lark

#vim .env_dingtalk 
# 钉钉机器人密钥 AppSecret
ding_secret=Q-uG5AMlMgC_Tkn6qhz1601xMYfQgxzeQh3xxx
#默认 机器人token
ding_webhook_default_token=bf5ab6a77cbc1b7c21fcxxx
#jenkins
JenkinsBaseUrl=https://user:user_token@jenkins.elvin.vip/job/

使用docker启动机器人服务

docker rm -f robot-dingtalk &>/dev/null
docker run -dit --name robot-dingtalk \--restart=always -h robot-dingtalk --net=host\-v $Dir:/opt --env-file .env_dingtalk \
registry.aliyuncs.com/elvin/python:dingtalk-robot \
python3 /opt/dingtalk-robot.py

dingtalk-robot.py 实例在https://gitee.com/alivv/elvin-demo

nignx配置域名和lark反向代理

#dingtalk-cicd
location ~ ^/dingtalk-cicd {proxy_pass http://127.0.0.1:8091;proxy_set_header Host $host:$server_port;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

#3 发送消息测试


#3 源码

python实例如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# By Elvin , blog.elvin.vipimport os
import time
import hmac
import hashlib
import base64
import json
from datetime import datetime
from flask import Flask, request
import requests# 从环境变量加载配置
ding_secret = os.getenv("ding_secret")
ding_webhook_default_token = os.getenv("ding_webhook_default_token")app = Flask(__name__)#钉钉发送文本消息
def send_txt_msg(message, webhook_url):data = { "msgtype": "text","text": {"content": message}}#requests发送post请求req = requests.post(webhook_url, json=data)print(req)#签名核对
def check_sign(timestamp=int(time.time() * 1000), app_secret=ding_secret):#钉钉消息头部加密app_secret_enc = app_secret.encode('utf-8')string_to_sign = '{}\n{}'.format(timestamp, app_secret)string_to_sign_enc = string_to_sign.encode('utf-8')hmac_code = hmac.new(app_secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()sign = base64.b64encode(hmac_code).decode('utf-8')return sign# Default route, print user's IP
@app.route('/')
def remoteIP():if 'X-Forwarded-For' in request.headers:ip = request.headers['X-Forwarded-For'].split(',')[0]else:ip = request.remote_addrreturn ip + "\n", 200, [("Server", "Go"), ("City", "Shanghai")]# 接收@机器人的消息
@app.route('/dingtalk-cicd', methods=["POST"])
def index():if request.method == "POST":timestamp = request.headers.get('Timestamp')sign = request.headers.get('Sign')if check_sign(timestamp=timestamp) == sign:req_data = json.loads(str(request.data, 'utf-8'))sender = req_data.get('senderNick')text = req_data.get('text').get('content', "").strip()ddgroup = req_data.get('conversationTitle').strip()#msgmsg_cicd(ddgroup,text,sender)return "succeed"else:return "not found"else:return "method not found"#筛选消息,执行指令
def msg_cicd(ddgroup,text,sender):msg = textsender = senderddGroup = ddgroupprint(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), " msg->: ",  msg)#check ddgroupif ddGroup == "test" or ddGroup == "DevOps":webhook = ding_webhook_testappInfoMap = dict(appTest, **appProd)myMenu = {"help", "test", "prod"}if msg in appInfoMap:app_env = appInfoMap[msg][0]app_name = appInfoMap[msg][1]app_url = appInfoMap[msg][2]#app_url = appInfoMap[msg][2] + appInfoMap[msg][1]app_url = app_url + app_env + "&app_list=" + app_nameif app_env != "":#执行通知msg = "By:  %s\nenv:  %s\napp:  %s" % (sender, app_env, app_name)send_txt_msg(msg,webhook)head = { 'User-Agent': "webhook-dingtalk-robot" }#向webhook发起post请求res = requests.post(url=app_url, headers=head)print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "run", app_env, app_name, res.reason)return "succeed"else:print(msg, "nothing")return "succeed"elif msg in myMenu:#打印命令列表print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "print menu ", msg)msgTitle = "#命令  名称\n"if msg == "help":msgTitle2 = "#命令  获取列表\n"msg = msgTitle2 + "test  app-test-list\nprod  app-prod-list"elif msg == "test":msg = msgTitlefor i in appTest:msg = msg + i + "  " + appInfoMap[i][1] + "\n"elif msg == "prod":msg = msgTitlefor i in appProd:msg = msg + i + "  " + appInfoMap[i][1] + "\n"msg = msg.rstrip('\n')send_txt_msg(msg,webhook)return "succeed"else:msg = f"已收到: {msg} \n发送 help@cici 查看支持指令"send_txt_msg(msg,webhook)return "succeed"else:print(datetime.now().strftime('%Y-%m-%d %H:%M:%S')," no ddGroup config for ",ddGroup)webhook = ding_webhook_defaultmsg = f"已收到: {msg} \n未发现组{ddGroup}支持指令"send_txt_msg(msg,webhook)return "succeed"#webhook
ding_webhook_base_url = "https://oapi.dingtalk.com/robot/send?access_token="
ding_webhook_default = ding_webhook_base_url + ding_webhook_default_tokending_webhook_test = ding_webhook_default#webhook url for jenkins 
JenkinsBaseUrl = os.getenv("JenkinsBaseUrl")#job
appDeploy = "test-app-deploy/buildWithParameters?token=cicdTest&app_branch=master&app_build=true&docker_build=true&create_git_tag=false&notice_msg=true&app_deploy=true&image_update=true&input_pass=true&deploy_tag=tag&deploy_env="#ci url
appDeployUrl = JenkinsBaseUrl + appDeploy#hybrid list
appTest = {
"#app-test-k8s-list:": ["","", ""],
"s201": ["test","app-web", appDeployUrl],
"s202": ["test","app-svc", appDeployUrl],
"s203": ["test","app-api", appDeployUrl],
"s204": ["test","app-event", appDeployUrl],
"s205": ["test","app-admin", appDeployUrl],
}appProd = {
"#app-prod-k8s-list:": ["","", ""],
"s101": ["prod","app-web", appDeployUrl],
"s102": ["prod","app-svc", appDeployUrl],
"s103": ["prod","app-api", appDeployUrl],
"s104": ["prod","app-event", appDeployUrl],
"s105": ["prod","app-admin", appDeployUrl],
}if __name__ == '__main__':app.run(host='0.0.0.0', port=8091)

source: https://gitee.com/alivv/elvin-demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/855789.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChCore-Lab4

lab 4: 多核调度与IPC 结合IPADS OS Lab Manual一起阅读,风味更佳!多核启动支持:使ChCore通过树莓派厂商所提供的固件唤醒多核执行 多核调度: 使ChCore实现在多核上进行round-robin调度。 IPC:使ChCore支持进程间通信 IPC调优:为ChCore的IPC针对测试的特点进行调优。踩坑1…

DNS 服务器是什么?有什么作用?

DNS 服务器是什么?有什么作用 一、DNS 服务器的定义 DNS 服务器即域名系统(Domain Name System)服务器。它是一种在互联网基础设施中扮演关键角色的服务器。在互联网的世界里,每台设备(如服务器、计算机等)都有一个唯一的 IP 地址,就像每部电话都有一个电话号码一样。但…

spring-boot-starter-security放行全部请求

Spring Boot项目中加了spring-boot-starter-security默认会把全部请求设置要求登录。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency>系统自动建一个user…

提升分析效率的秘密:电商团队用它打破数据孤岛!

高效团队协作:电商团队如何用在线协同工具重塑商品数据分析流程 在如今竞争激烈的电商行业中,商品数据分析的重要性不言而喻。销售数据、库存情况、用户反馈等信息都可能成为制胜关键。然而,这些数据往往分散在不同系统中,导致团队协作效率低下。尤其是在电商团队中,数据分…

zabbix图形乱码问题

环境: OS:Centos 7 zabbix:4.0.5

OpenCL 编程步骤 3. 获取Context 上下文

转载 https://deepinout.com/opencl/opencl-basic-tutorials/opencl-create-context.html 上下文为关联的设备、内存对象、命令队列、程序对象、内核对象提供一个容器。上下文是OpenCL应用的核心。正是上下文驱动着应用程序与特定设备以及特定设备之间的通信。 对于上下文中关联…

Gitlab runner持续集成CI/CD怎么设置标签指定Runner节点执行

搭建Runner参考: https://www.cnblogs.com/minseo/p/18472436 需求:未打标签的.gitlab-ci使用默认runner 打标签的.gitlab-ci使用指定的runner环境查看 系统环境# cat /etc/redhat-release Rocky Linux release 9.3 (Blue Onyx) # uname -a Linux Rocky9StoneCrm003080 5.14.…

应用内自动续订商品,畅享无缝服务体验

用户购买某种产品时习惯一次性付款,但是对开发者而言,单次购买模式或需要用户频繁续订的服务可能会导致收入不稳定,无法获得持续稳定的收入。对于有视频、音乐等会员需求的用户,一旦体验到服务中断或需要频繁操作,可能会转向其他竞争产品,导致用户流失。 HarmonyOS SDK应…

一文学会powshell使用及功能

声明! 原文来自微信公众号泷羽Sec-track认识powsehll PowerShell(通常称作PowerShell或Windows PowerShell)是由微软开发的一种任务自动化和配置管理框架,与linux命令相似,它结合了命令行外壳和脚本语言功能,使得系统管理员和用户能够更高效地管理系统和自动化任务。 打开…

OpenAi 大模型生态体系介绍

OpenApi大模型家族介绍模型概览 多模态大模型 能够理解和生成自然语言或代码+理解图像+生成图像等 GPT-4是一个大型多模态模型(接受文本或图像输入并输出文本),它可以比我们以前的任何模型都更准确地解决难题这得益于它更广泛的通用知识和更高级的推理能力。GPT-4可在OpenAIAP…

configure: error: curses development files not found

001、报错如下: configure: error: curses development files not found 002、rocky9系统[root@PC1 samtools-1.21]# cat /etc/redhat-release Rocky Linux release 9.4 (Blue Onyx) 003、解决方法[root@PC1 samtools-1.21]# dnf install ncurses-devel.x86_64 -y 004、配置…

动画图解嵌入式常见的通讯协议:SPI、IC、UART、红外

文章下方附学习资源,自助领取。 1 SPI传输 ▲ 图1 SPI 数据传输 ▲ 图1.2 SPI数据传输(2) ▲ 图1.3 SPI时序信号 2 IC传输 ▲ 图1.2.1 I2C总线以及寻址方式3年嵌入式物联网学习资源整理分享:C语言、Linux开发、数据结构;软件开发,STM32单片机、ARM硬件开发、物联网通…