文章目錄
- 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 狀態碼)}
}