当前位置: 首页 > news >正文

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.dtcms.com/a/302625.html

相关文章:

  • Rust/Tauri 优秀开源项目推荐
  • Flutter渲染引擎:Impeller和Skia
  • RPC 详解
  • 鱼皮项目简易版 RPC 框架开发(二)
  • 基于Spring Boot和Vue电脑维修平台整合系统的设计与实现
  • 计算机网络(基础篇)
  • linux内核中kfifo实现队列
  • 并发安全之锁机制一
  • Day22-二叉树的迭代遍历
  • kruscal重构树
  • 【Spring Boot 快速开发】一、入门
  • React 服务器端渲染原理
  • 基于AFLFast的fuzz自动化漏洞挖掘(2)
  • 结合项目阐述 设计模式:单例、工厂、观察者、代理
  • 面向对象设计原则和设计模式分类
  • RTC时钟详解
  • 【智慧物联网平台】安装部署教程——仙盟创梦IDE
  • GitLab 公共仓库:coding 用到的 git 命令
  • PhpStorm + PHP8.1 + XDebug3 实现断点调试(亲测可用)
  • gitlab 在线合并分支a-分支b,解决冲突后,反向合并分支b-分支a
  • Vue 3 拖拽排序功能优化实现:从原理到实战应用
  • 8.1 ESP32CAM 服务器 网络摄像头
  • 本地大语言模型部署指南
  • TRIZ(5)——发明原理(3)
  • NVDB-CAVD 杯汽车信息安全系列赛事
  • 青少年编程中阶课
  • 【昆泰Chrontel CH7517A:DP转VGA】
  • Datawhale AI夏令营——列车信息智能问答——科大讯飞AI大赛(基于结构化数据的用户意图理解和知识问答挑战赛)
  • 在App Store Connect上编辑多个用户的访问权限
  • 医疗人工智能高质量数据集和语料库建设路径探析