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

Jenkins流水线部署+webhook2.0

文章目录

  • 1. 环境
  • 2. 用到的插件
  • 3. 流水线部署脚本
  • 4.遇到的问题
  • 5.实际效果

1. 环境

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

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

2. 用到的插件

  • Generic Webhook Trigger
  • HTTP Request
  • Extra Columns
  • Pipeline: Stage View

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 状态码)}
}

4.遇到的问题

  • 1.环境兼容问题-linux版本/jenkins版本/java版本三者之间的兼容

  • 2.环境变量作用范围的问题-切换java版本配置环境的生效问题
    通过/etc/profile或/etc/environment配置的环境变量仅对当前终端会话有效,而通过/etc/systemd/system设置的环境变量可确保服务启动时自动加载‌

5.实际效果

在这里插入图片描述

在这里插入图片描述

http://www.lryc.cn/news/602830.html

相关文章:

  • 【Kubernetes 指南】基础入门——Kubernetes 101(二)
  • Java 笔记 transient 用法
  • C语言操作符详解:从基础到进阶
  • linux find命令使用教程
  • 【数学建模论文学习笔记】基于历史数据的蔬菜类商品定价与补货决策模型
  • 1688 item_search_shop 接口参数说明与测试指南
  • 源代码管理工具有哪些?有哪些管理场景?
  • MGER综合实验
  • 椭圆曲线加密(ECC)实战:从原理到区块链应用
  • 机器学习(重学版)基础篇(算法与模型一)
  • 热斑漏检率↓78%!陌讯多模态算法在无人机光伏巡检的轻量化实践
  • PBR技术
  • 利用软件定义无线USRP X410、X440 电推进无线原型设计
  • 5.Linux ssh远程登录配置及sftp,scp命令
  • 排序算法 (Sorting Algorithms)-Python示例
  • 一个高效的阿里云漏洞库爬虫工具,用于自动化爬取和处理CVE数据
  • AW2013 LED驱动芯片 工作方式介绍
  • 阿里云Ubuntu 22.04 ssh隔一段时间自动断开的解决方法
  • 解决 nginx 加载css文件时无效问题、解决 nginx 加载css文件识别成 text/plan 的问题
  • github copilot接入openai-compatible模型以及去除安全限制的方法
  • 嵌入式开发学习———Linux环境下数据结构学习(四)
  • UV安装并设置国内源
  • golang--函数栈
  • 学习lxml库:Python XML/HTML处理利器
  • 微型化IMU如何突破无人机与机器人的性能边界?
  • Vue 工程化
  • Facenet(MTCNN+InceptionResnetV1)人脸考勤项目(有缺点,但可用)
  • 前端实现PDF在线预览的8种技术方案对比与实战
  • 【kafka】消息队列
  • 专题:2025医药生物行业趋势与投融资研究报告|附90+份报告PDF、原数据表汇总下载