jenkins使用企业微信进行审批

news2024/11/26 9:37:59

该篇文章实现了基于企业微信进行审批的功能(也支持其他的webhook)
前提是进行sharelibrary的配置
在这里插入图片描述

一、首先我们使用jenkins的sharelibrary进行审批人全局参数的设置(该步骤是为了当审批人变动时不需要该每个pipeline只改动全局变量即可)
在这里插入图片描述
二、我们将发送通知的函数也进行sharelibrary的全局函数设定
在这里插入图片描述


package org.devops
def HttpReq() { 
    sh returnStdout: true, script: """
    set +x  //该命令是sh的隐式输出,不会再jenkins中的控制台输出具体命令执行过程,防止用户在控制台看到token
    python3.6 /opt/test.py ${adminUser} ${JOB_NAME} ${approveInfo} ${BUILD_ID} ${env.randomToken} ${BUILD_URL} > /dev/null
    """
}

test.py是发送通知的python脚本

import sys
import json
import requests

def send_json_to_webhook(json_data):
    webhook_url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=2f1ba5cd-8e7f-4897-ae05-518b83c7xxxxx' #替换成自己的
    headers = {'Content-Type': 'application/json'}
    
    try:
        response = requests.post(webhook_url, data=json.dumps(json_data), headers=headers)
        response.raise_for_status()
        print('JSON data sent successfully')
    except requests.exceptions.HTTPError as errh:
        print('HTTP Error:', errh)
    except requests.exceptions.ConnectionError as errc:
        print('Error Connecting:', errc)
    except requests.exceptions.Timeout as errt:
        print('Timeout Error:', errt)
    except requests.exceptions.RequestException as err:
        print('Error:', err)

# 从命令行参数获取审批信息(可自行添加)
approval_message = {
    "adminUser": sys.argv[1],
    "application_name": sys.argv[2],
    "build_info": sys.argv[3],
    "build_number": sys.argv[4],
    "verification_code": sys.argv[5],
    "approval_link": sys.argv[6]
}

# 生成消息内容(内容可自定更改)
message_text = f"生产发布申请,请【{approval_message['adminUser']}】审批: {approval_message['adminUser']}\n- 应用名称:{approval_message['application_name']}\n- 
构建信息:{approval_message['build_info']}\n- 构建序号:{approval_message['build_number']}\n- 随机验证码:{approval_message['verification_code']}\n- 审批链接: {ap
proval_message['approval_link']}"

# 创建对应的JSON数据
json_data = {
    "msgtype": "text",
    "text": {
        "content": message_text
    }
}

send_json_to_webhook(json_data)

三、进行流水线参数的配置
定义一个是否需要审批的选项
在这里插入图片描述
定义需要谁来审批
在这里插入图片描述
对该次审批的一个描述
在这里插入图片描述
四、具体的pipeline

#!groovy

@Library('jenkinslibrary@master') _ //引用配置的sharelibrary

def approval = new org.devops.HttpReq()  //引用函数
//调用方法库文件
def adminUserlist
def skipRemainingStages = false   //当前节点是否跳过
def input_message   //提示语
def randomToken    //发布秘钥
def skipadminUser = false


pipeline {
    agent {
		label "java_agent"
	}
    options {
        timeout(time:1, unit:'HOURS') // 流水线超时设置为1H
    }
    environment {
        randomToken = sh (script: "/bin/bash -c 'echo \$RANDOM'" , returnStdout: true).trim()
        approve = "${approve}"  //jenkins参数化构建定义审批人员名单
    }
    stages{
        stage("发送审批通知"){
            when {
                expression { env.approve != 'NO' }
            }

            steps{
                wrap([$class: 'BuildUser']) {
                script {
                    //获取当前登录用户账户、姓名
                    Applier_id = "${env.BUILD_USER_ID}"
                    Applier_name = "${env.BUILD_USER}"
                    }
                }
                script{
                    //判断审批人(sharelibrary中的全局参数)
                    adminUserlist = userlist()
                    if ("$adminUser" != ""){
                        adminUser = "$adminUser"
                        //如果审批人为自己,则退出任务
                        if ("$Applier_id" == "$adminUser"){
                            echo '审批人不能为本人,任务已终止'
							error '审批人不能为本人,任务已终止'
                        } 
                    } else{
                        echo '审批人不能为空,任务已终止'
						error '审批人不能为空,任务已终止'
                    }
                    if ("${adminUserlist}".contains("$adminUser")) {
                        env.approvalDD = "$adminUser"
                        input_message = "$Applier_name 申请发布生产"
						echo "$input_message"
                        approval.HttpReq()
  
                    }  else {
                        echo '审批人信息获取失败,任务已终止'
						error '审批人信息获取失败,任务已终止'
                    }
                }
            }
        }
   
        stage("等待审批"){
            when {
                expression { env.approve != 'NO' }
            }
            steps{
                script{
                    def isAbort  = false   //取消按钮
                    timeout(time:1, unit:'HOURS'){  //等待审批人审批,并通过timeout设置任务过期时间,防止任务永远挂起
                        try {
                           def token = input(
                               id: 'inputap', message: "$input_message", ok:"同意", submitter:"$adminUser", parameters: [
                               [$class: 'StringParameterDefinition',defaultValue: "", name: 'token',description: '请输入发布的秘钥' ]
                               ])
                            if ( "${token}" == env.randomToken) {
                                echo '你的审批已通过,继续执行!'
                            } else {
                               echo '秘钥错误,任务已终止'
                               error '秘钥错误,任务已终止'
                            }
                        }catch(e) { // input false
                           throw e
                       }
                   }
                }
            }
        }
          
        stage('版本发布') {
            steps{
                script {
                    echo "版本发布"
                }
            }
        }
    }
    post {
        success {
            script {
                echo "success"
            }
        }
        always {
            script {
                qyWechatNotification mentionedId: '', mentionedMobile: '', moreInfo: '', webhookUrl: 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=2f1ba5cd-8e7f-4897-ae05-518b83c727ea' //通过企业微信插件进行通知
            }
        }
        aborted {           
            script {
                echo "aborted"
            }
        }
    }
}

五、具体效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

❤️创意网页:抖音汉字鬼抓人小游戏复刻——附带外挂(“鬼鬼定身术”和“鬼鬼消失术”)坚持60秒轻轻松松(●‘◡‘●)

✨博主:命运之光 🌸专栏:Python星辰秘典 🐳专栏:web开发(简单好用又好看) ❤️专栏:Java经典程序设计 ☀️博主的其他文章:点击进入博主的主页 前言:欢迎踏入…

《零基础入门学习Python》第053讲:论一只爬虫的自我修养

0. 请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式! 马上我们的教学就要进入最后一个章节,Pygame 嗨爆引爆全场,但由于发生了一个小插曲,所以这里决定追加一个章节,因为…

下载|GitLab 2023 年 DevSecOps 全球调研报告:安全左移深入人心、AI/ML 蔚然成风

目录 谁应该对应用程序安全负主要责任? 安全实践的最大挑战 AI 驱动研发,提升研发效率 各个角色使用的工具数量是多少? 一体化 DevSecOps 平台有哪些优势? 56%、74%、71%、65%、57% 这些数字和 DevSecOps 结合在一起&#xf…

Java -- 元注解

元注解 就是 Java标准库中 原生的注解,有点类似于 Java类 中的 Object,由于添加在其他注解上 Java总共有四个元注解,他们的功能如下: Target(ElementType.ANNOTATION_TYPE):指定该注解可以用于注解类、接口或枚举类型…

element 表格里,每一行都循环使用el-popover组件,关闭按钮失效问题如何解决?

具体代码 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><title></title><link rel"stylesheet" href"https://unpkg.com/element-ui/lib/theme-chalk/index.css"><styl…

Linux Misc 驱动-编写驱动例程基于iTOP-STM32P157开发板

首先我们回想一下注册杂项设备的三大流程&#xff0c;我们在 Windows 上面新建 misc.c 文件&#xff0c;并用 sourceinsight 打开。我们可以将上次编写的 helloworld.c 里面的代码拷贝到 misc.c 文件&#xff0c;并修改为如下图所示 添加头文件 /*注册杂项设备头文件*/ #inc…

辅助驾驶功能开发-功能规范篇(23)-2-Mobileye NOP功能规范

5.2 状态机要求 5.2.1 NOP/HWP 状态机 NOP/HWP状态机如下所示&#xff1a; 下表总结了这些状态&#xff1a; 状态描述Passive不满足功能条件&#xff0c;功能无法控制车辆执行器。Standby满足功能条件。该功能不是由驾驶员激活的。功能不控制车辆执行器。Active - Main功能由…

海盗王基于golang重制版的商城服务端

海盗王原始的商城服务端&#xff0c;附带有很多其他功能&#xff08;如GM留言管理&#xff0c;商品管理接口&#xff09;&#xff0c;配置起来非常麻烦&#xff0c;而且运行时问题也很多&#xff0c;经常会出现弹出停止响应&#xff0c;无法正常提供服务。 在很早的时候&#x…

NTFS SSD USB 硬盘盒写入未结束拔出后Linux可识别,Windows不识别,报错无法访问

windows平台修复过程&#xff1a; 故障 管理员权限打开cmd&#xff0c;执行指令 chkdsk.exe /F /R f: C:\Windows\system32>chkdsk.exe /F /R f: 文件系统的类型是 NTFS。 卷标是 YeQiang-Data。 阶段 1: 检查基本文件系统结构... 已处理 2520 个文件记录。 文件验证完…

zabbix安装Grafana

一、web访问 https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.6.1-1.x86_64.rpm [rootserver ~] yum localinstall -y grafana-4.6.1-1.x86_64.rpm //yum方式安装本地rpm并自动解决依赖关系 [rootserver ~] grafana-cli plugins install alexanderzob…

探秘Spring中Bean的注解宝典:解读存取Bean的相关注解及用法

目录 存储Bean对象Controller(控制器存储)Service(服务存储)Repository(仓库存储)Component(组件存储)Configuration(配置存储)Bean重命名Bean 获取Bean对象属性注入构造方法注入Setter注入Resource(注入关键字) 存储Bean对象 将对象存储在 Spring 中&#xff0c;有两种注解类…

00_ubuntu_开发环境的搭建

ubuntu 的版本22.04 2023-07-21 1.卸载firefox dpkg --get-selections |grep firefox // 查看安装包的信息 sudo apt-get purge firefox firefox-locale-en firefox-locale-zh-hans // 卸载相应的包 2.下载google安装包并安装 wget https://dl.google.com/linux/direct/goo…

【Window系统】安装FFmpeg教程

目录 1、下载FFmpeg 2、配置环境变量 3、检验和测试 1、下载FFmpeg 两个下载路径&#xff1a; Github直链下载&#xff1a;Releases BtbN/FFmpeg-Builds (github.com)蓝奏云下载&#xff1a;ffmpeg-n5.0-latest-win64-lgpl-shared-5.0.zip - 蓝奏云 2、配置环境变量 将…

15matlab数据分析多项式的相乘和相除(matlab程序)

1.简述 xlsread和xlswrit函数 在MATLAB中经常会用到数据的读取&#xff0c;首先是从Excel中读取数据到MATLAB中去。下面给出原始Excel数据内容&#xff1a; 在MATLAB读取结果如下&#xff1a; mxlsread(fanjufei.xls,1,A1:C3)m 1 2 3 4 5 6 …

yum镜像源更新很慢,不管是阿里源还是清华源

今天想要再Centos7上安装docker测试&#xff0c;但是发现不管是阿里源还是清华源 yum makecache都更新的特别慢。有大佬知道啥原因不&#xff1f; 坐标成都&#xff0c;联通宽带300M

W801 ADC功能,基于CDK Demo以及Arduino平台测试

W801 ADC功能&#xff0c;基于CDK Demo以及Arduino平台测试 &#x1f33c;W801开发板&#xff08;HLK-W801 详细资料见&#xff1a;https://h.hlktech.com/Mobile/download/fdetail/170.html&#xff09; &#x1f4d3;W801 ADC简介 &#x1f4d1;集成 4 路 12 比特 ADC&…

华为eNSP:ospf的配置

一、拓扑图 二、路由器的配置 1、路由器依据规划配置接口IP AR1: <Huawei>system-view [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 10.10.10.1 24 [Huawei-GigabitEthernet0/0/0]qu AR2: <Huawei>system-view [Huawei]int g0/0/0 [Huawei-Gi…

sql:是否在时间段内

判断给定时间是否在区间内&#xff0c;由于结束时间可能为空&#xff0c;若为空表示长期&#xff1b;希望在 end_date 可以延长180天作为最终的 end_date -- okAND ((ic.price_end_date is null and ic.price_start_date < 2022-01-22) or (ic.price_end_date is not null …

C++ GDAL找出多时相遥感影像缺失的日期并自动生成新的全零图像作为替补

本文介绍基于C 语言的GDAL库&#xff0c;基于一个存储大量遥感影像的文件夹&#xff0c;依据每一景遥感影像的文件名中表示日期的那个字段&#xff0c;找出这些遥感影像中缺失的成像日期&#xff0c;并新生成多个像元值全部为0的栅格文件&#xff0c;作为这些缺失日期当日的遥感…

PHP8知识详解:PHP语言优势

PHP起源于自由软件&#xff0c;并且得到了不断的迭代更新&#xff0c;在web开发领域独领风骚&#xff0c;得到了广大使用者的喜爱&#xff0c;PHP作为一款优秀的脚本语言&#xff0c;具有以下优势&#xff1a; 1、源码开源&#xff1a;所有的PHP源代码&#xff0c;你都能从PHP官…