def buildCommitDiffMarkdown() { def changeSets = currentBuild.changeSets if (!changeSets || changeSets.isEmpty()) { return '_本次构建无代码变更_' } def commits = [] changeSets.each { cs -> cs.items.each { item -> def author = item.author?.fullName ?: 'unknown' def msg = item.msg?.trim()?.replaceAll('[\\r\\n]+', ' ') commits << "- **${msg}**(${author})" } } if (commits.isEmpty()) { return '_本次构建无代码变更_' } // 防止消息过长(飞书卡片有长度限制) def maxCommits = 5 if (commits.size() > maxCommits) { commits = commits.take(maxCommits) commits << "_……以及更多提交_" } return commits.join('\n') } def call(Map args = [:]) { // ===== 参数 ===== def publishEnvs = args.publishEnvs ?: 'production' def branchName = args.branchName ?: (env.BRANCH_NAME ?: 'unknown') def webhookUrl = args.webhookUrl ?: env.XSH_FEISHU_WEBHOOK // ===== Jenkins 内建上下文 ===== def buildStatus = currentBuild.currentResult ?: 'UNKNOWN' def buildNumber = env.BUILD_NUMBER def buildUrl = env.BUILD_URL def jobName = env.JOB_NAME echo "${env.EXECUTOR_NAME}" echo "${env.EXECUTOR_OPENID}" echo "${env.BUILD_USER}" def triggerBy if (env.EXECUTOR_OPENID) { triggerBy = "" } else if (env.BUILD_USER) { triggerBy = env.BUILD_USER } else { triggerBy = 'unknown' } // ===== 状态标签 ===== def statusTag = [ SUCCESS : "通过", FAILURE : "失败", UNSTABLE: "不稳定", ABORTED : "已中止" ][buildStatus] ?: "未知状态" // def commitDiff = "[查看变更记录](${buildUrl}changes)" def commitDiff = buildCommitDiffMarkdown() // ===== 凭证 ===== withCredentials([ string(credentialsId: 'FEISHU_WEBHOOK', variable: 'FEISHU_WEBHOOK') ]) { def payload = [ msg_type: 'interactive', card: [ type: 'template', data: [ template_id: 'AAq2iv39m3lv5', template_version_name: '1.0.6', template_variable: [ build_title : jobName, status_tag : statusTag, build_number: buildNumber, publish_envs: publishEnvs, commit_diff : commitDiff, build_branch: branchName, trigger_by : triggerBy, build_url : [ url: buildUrl ] ] ] ] ] httpRequest( httpMode: 'POST', contentType: 'APPLICATION_JSON', url: webhookUrl, requestBody: groovy.json.JsonOutput.toJson(payload), validResponseCodes: '200:299' ) } }