Jenkins流水线部署+webhook2.0

文章目录

  • 1. 环境
  • 2. 用到的插件
  • 3. 流水线部署脚本

1. 环境

  • Centos7
  • Jenkins2.5.0
  • JDKopen17
  • 阿里云仓库

注意:这个版本兼容需要特别注意,要不然会很麻烦

2. 用到的插件

  • Generic Webhook Trigger

3. 流水线部署脚本

  • 兼容钩子部署(webhook)和手动参数化部署
  • 优先取钩子的推送参数,没有的话取手动参数
  • 根据推送的分支进行不同的部署操作
  • 推送结果到钉钉通知
pipeline {agent any// 定义参数化构建parameters {string(name: 'MANUAL_BRANCH', defaultValue: '', description: '手动指定要部署的分支(如 master, dev, test)')}triggers {GenericTrigger(genericVariables: [[key: 'ref', value: '$.ref'], // 获取分支信息[key: 'repository_name', value: '$.repository.name'] // 获取仓库名称],causeString: 'Triggered by push event on branch $ref',token: 'AZWSDD2555SSWS', // 自定义的TokenprintContributedVariables: true, // 打印传递的变量silentResponse: false,regexpFilterText: '$ref', // 匹配分支名regexpFilterExpression: '^refs/heads/(dev|test)$' // 只处理特定分支)}stages {stage('Determine Branch') {steps {script {// 优先使用Webhook传递的分支信息if (env.ref) {env.BRANCH_NAME = env.ref.tokenize('/')[-1]echo "Using webhook-triggered branch: ${env.BRANCH_NAME}"} // 如果没有Webhook信息,检查是否有手动输入的分支else if (params.MANUAL_BRANCH?.trim()) {env.BRANCH_NAME = params.MANUAL_BRANCH.trim()echo "Using manually specified branch: ${env.BRANCH_NAME}"} // 如果两者都没有,抛出错误else {error "No branch specified! Please provide a branch via manual input or webhook."}}}}stage('Checkout Code') {steps {git branch: env.BRANCH_NAME,url: 'git@codeup.aliyun.com:test.git',credentialsId: 'jenkins密钥ID'}}stage('Build and Deploy') {steps {echo "Performing actions for branch: ${env.BRANCH_NAME}"script {if (env.BRANCH_NAME == 'master') {sh '''ssh 1.11.11.11 "cd /home/test && git pull"'''} else if (env.BRANCH_NAME == 'dev') {sh '''cd /home/dev && git pull'''} else if (env.BRANCH_NAME == 'test') {sh '''cd /home/test && git pull'''} else {error "Unsupported branch: ${env.BRANCH_NAME}. No deployment logic defined."}}}}}post {success {notifyDingTalk("SUCCESS") // 构建成功时通知}failure {notifyDingTalk("FAILURE") // 构建失败时通知}}
}// 定义通用的钉钉通知方法
def notifyDingTalk(String buildStatus) {script {// 获取构建信息def branchName = env.BRANCH_NAMEdef duration = currentBuild.durationStringdef executor = currentBuild.getBuildCauses('hudson.model.Cause$UserIdCause')?.userId ?: 'webhook'def commitHash = sh(script: 'git rev-parse HEAD', returnStdout: true).trim()def committer = sh(script: 'git log -1 --pretty=format:"%an"', returnStdout: true).trim()def commitMessage = sh(script: 'git log -1 --pretty=format:"%s"', returnStdout: true).trim()def rawCommitTime = sh(script: 'git log -1 --pretty=format:"%cd" --date=iso', returnStdout: true).trim()def formattedCommitTime = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z").parse(rawCommitTime))// 获取变更内容(修改的文件列表)def changedFiles = sh(script: 'git diff --name-only HEAD~1 HEAD', returnStdout: true).trim()// 动态生成标题和状态颜色def (statusTitle, statusColor) = buildStatus == "SUCCESS" ? ["构建成功", "#00FF00"] : ["构建失败", "#FF0000"]// 获取项目名(从环境变量或静态配置中)def projectName = env.JOB_NAME ?: "未知项目"// 构造钉钉消息内容def message = """## Jenkins <font color="${statusColor}">${statusTitle}</font>通知
- **项目**: ${projectName}
- **分支**: ${branchName}
- **状态**: <font color="${statusColor}">${buildStatus}</font>
- **持续时间**: ${duration}
- **执行人**: ${executor}
- **代码推送人**: ${committer}
- **提交哈希**: ${commitHash}
- **提交时间**: ${formattedCommitTime}
- **提交信息**: ${commitMessage}
- **变更内容**: ${changedFiles ?: "无变更内容"}
""".stripIndent()// 钉钉机器人配置def dingtalkWebhookUrl = 'https://oapi.dingtalk.com/robot/send?access_token=your_token'// 使用 JsonOutput 生成 JSON 数据def payload = groovy.json.JsonOutput.toJson([msgtype: "markdown",markdown: [title: "[${projectName}] Jenkins ${statusTitle}通知",text: message],at: [isAtAll: true]])httpRequest(url: dingtalkWebhookUrl,httpMode: 'POST',contentType: 'APPLICATION_JSON_UTF8',  // 确保 UTF-8 编码requestBody: payload,validResponseCodes: '200:299'  // 接受 200-299 状态码)}
}

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

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

相关文章

IDM下载失败排查

网络连接问题排查检查网络连接是否稳定&#xff0c;确保能够正常访问互联网 测试其他下载工具或浏览器是否能够正常下载 尝试关闭防火墙或杀毒软件&#xff0c;排除安全软件拦截的可能性代理和VPN设置检查确认IDM的代理设置是否正确&#xff0c;是否与系统代理一致 检查是否使用…

Anaconda安装时的几个操作

一、安装Anaconda 其实Anaconda的安装比较简单&#xff0c;点击next就好了。在安装中需要注意以下两点&#xff1a; 1、选择安装路径 在安装时&#xff0c;路径最好选择非C盘&#xff0c;且路径中不要出现中文&#xff0c;以免后期运行代码时出现不必要的错误。 我安装时&…

网易易盾、腾讯ACE等主流10款游戏反外挂系统对比

本文将深入对比10款游戏反外挂系统&#xff1a;1.网易易盾&#xff1b;2.Ricochet Anti‑Cheat&#xff1b;3.BattlEye&#xff1b;4.几维安全手游智能反外挂系统&#xff1b;5.伏魔AI反外挂&#xff1b;6.Riot Vanguard&#xff1b;7.Xigncode3&#xff1b;8.盛大GPK&#xff…

wpa_supplicant-2.10交叉编译

参考文章:https://blog.csdn.net/weixin_45783574/article/details/145810790 1、Openssl交叉编译 1.1 下载openssl-1.1.1t.tar.gz 下载网址: https://openssl-library.org/source/old/1.1.1/index.html1.2 编译 sudo tar xvf openssl-1.1.1t.tar.gz cd openssl-1.1

源码解读SpringCloudAlibaba Nacos2.x

Nacos 服务注册 Nacos 服务注册时&#xff0c;客户端会将自己的信息注册到Nicosserver上&#xff0c;形成key-value组合&#xff0c;其中key通常是服务名称&#xff0c;value是实例地址信息。在二点X版本中&#xff0c;客户端通过Spring Boot的扩展机制(例如web_initialized事件…

Windows 11 下 Anaconda 命令修复指南及常见问题解决

Windows 11 下 Anaconda 命令修复指南及常见问题解决 在使用 Anaconda 过程中&#xff0c;可能会遇到环境损坏、更新失败、包依赖冲突等问题。本文整理了一套通过命令行修复 Anaconda 的完整方案&#xff0c;适用于 Windows 11 系统&#xff0c;同时补充了权威参考链接供深入学…

安宝特案例丨全球连线!安宝特Vuzix与RodsCones共筑实时手术教育平台

安宝特Vuzix与合作伙伴Rods&Cones协作&#xff0c;为Rocamed在布拉格UROSANIT诊所举办的创新型实时手术直播研讨会提供技术赋能。 本次直播通过合作伙伴Rods&Cones软件平台搭载安宝特Vuzix智能眼镜&#xff0c;成功连接来自9国、3大洲、6个时区的27位医生&#xff0c;…

【Spring Boot 快速开发】一、入门

目录Spring Boot 简介Web 入门Spring Boot 快速入门HTTP 协议概述请求协议响应协议解析协议TomcatSpring Boot 简介 Spring Boot 是由 Pivotal 团队&#xff08;后被 VMware 收购&#xff09;开发的基于 Spring 框架的开源项目&#xff0c;于 2014 年首次发布。其核心目标是简…

laravel chunkById导出数据乱序问题

2025年7月28日17:47:29 这几天在做数据导出优化&#xff0c;使用xlswriter作为导出组件&#xff0c;但是发现在 使用 $base->chunkById(2000, function ($list) use ($writer, $sheet1) { 发现导出的数据是乱的&#xff0c;偶尔有些重复&#xff0c;偶尔有些少了&#xff0c…

Spring IOC与DI

spring的两大思想:IOC与AOP一、ioc的概念什么叫控制翻转?之前:对象的使用方,创建对象,对象的控制权,在对象的使用方手中.spring:对象的控制权交给了spring.举个例子:智能驾驶,之前车的使用权在人手中,而现在在ai手中,这就是控制反转.什么叫ioc:之前车企生产车需要做整个车,费事…

【图像处理基石】Segment Anything Model (SAM) 调研

Segment Anything Model (SAM) 是由 Meta AI 开发的革命性图像分割模型,它能够对图像中的任何物体进行分割,无需针对特定类别进行训练。SAM 具有以下特点: 通用性:可以分割任何视觉对象,无论是否见过该类别 灵活性:支持多种输入提示(点、框、掩码或文本) 实时性:在普通…

unisS5800XP-G交换机配置命令之端口篇

一、批量配置端口(1) 进入系统视图。system-view(2) 指定接口范围&#xff0c;并进入接口批量配置视图。¡ 指定一个不带别名的接口列表。interface range { interface-type interface-number [ to interface-type interface-number ] } &<1-24>¡…

MySQL中的 redolog

什么是redo log如果我们只在内存的 Bufer Pool中修改了页面&#xff0c;假设在事务提交后突然发生了某个故障导致内存中的数据都失效了&#xff0c;那么这个已经提交的事务在数据库中所做的更改也就跟着丢失了&#xff0c;这是我们所不能忍受的。那么&#xff0c;如何保证这个持…

数据结构之 【排序】(非递归实现快速排序)

目录 1.引入 2.非递归实现快排的思想 3.非递归实现快排图解 4.完整代码 1.引入 递归不可避免的话题就是防止栈溢出 所以程序员需要具备递归改非递归的能力 &#xff0c;一般来说&#xff0c;抓住递归中变化的量是关键 void QuickSort(int* a, int left, int right){if (left…

CLAP文本-音频基础模型: LEARNING AUDIO CONCEPTS FROM NATURAL LANGUAGE SUPERVISION

一、TL&#xff1b;DR 现在的做法有什么问题&#xff1f;主流范式是 “一个类别标签对应多个录音”&#xff0c;需要提前标注预测预先定义的类别&#xff0c;只能做闭集理解&#xff0c;失去灵活性 我们怎么做&#xff1f;通过两个编码器和对比学习机制建立语言与音频的关联&a…

Flink2.0学习笔记:Stream API 常用转换算子

EC0720/FLINKTASK-TEST-STREAM/demo at master stevensu1/EC0720 先看测试效果&#xff1a;控制台 测试效果&#xff1a;监控服务端 主要的转换算子包括&#xff1a; 转换算子 filter:过滤包含“Flink”的输入 转换算子 map: 将每行数据前添加“Processed: ”并转为大写 转…

一、Python环境、Jupyter与Pycharm

安装Python由于RAG项目中所需要的Python版本必须高于3.8&#xff0c;经过筛选&#xff0c;最终选择了3.10.11这个版本py --version Python 3.10.11安装过程略过&#xff0c;但对于几个基础的命令作个笔记记录where python找到python启动器的位置D:\>where python C:\Users\x…

Flink CEP 动态模板与规则动态修改实践完全手册

1. Flink CEP:从静态规则到动态江湖 Flink 的复杂事件处理(CEP)库就像一个武功高强的侠客,能从数据流中精准捕获特定模式,堪称流处理界的“降龙十八掌”。但问题来了:传统 CEP 规则通常是写死在代码里的,就像刻在石碑上的武功秘籍,改起来费劲不说,还得重启应用,简直…

vue3.2 + echarts5.6 + ant-design-vue 3.x 实现自定义 echarts 图例

文章目录概要技术细节效果概要 需求需要实现图例移入显示描述说明 故实现自定义图例 技术细节 <template><div class"custom-legend"><divv-for"item in legends":key"item.name"class"legend-item":class"{ i…

【2025年7月25日】TrollStore巨魔商店恢复在线安装

就在今日7月25日&#xff0c;TrollStore的在线安装功能再次变得可用&#xff0c;这对于许多iPhone用户来说无疑是个喜讯。在经历了近三个月的中断后&#xff0c;巨魔商店的企业证书意外的到来了&#xff0c;使得用户能够重新采用在线安装的方式&#xff01; 在线安装地址在文…