pipeline { agent none options { disableConcurrentBuilds() skipDefaultCheckout(true) buildDiscarder(logRotator(numToKeepStr: '50', artifactNumToKeepStr: '0')) } parameters { string(name: 'EMAIL_RECIPIENTS_CREDENTIAL_ID', defaultValue: 'genarrative-notification-emails', description: '持久收件人 Secret Text 凭据 ID,凭据内容为逗号分隔邮箱;留空则只使用本次追加收件人') string(name: 'EMAIL_RECIPIENTS', defaultValue: '', description: '本次运行追加邮件通知收件人;会与持久收件人凭据合并发送') string(name: 'SOURCE_JOB_NAME', defaultValue: '', description: '来源流水线名称') string(name: 'SOURCE_BUILD_NUMBER', defaultValue: '', description: '来源构建号') string(name: 'SOURCE_BUILD_URL', defaultValue: '', description: '来源构建 URL') string(name: 'SOURCE_RESULT', defaultValue: 'UNKNOWN', description: '来源流水线结果') string(name: 'SOURCE_BRANCH', defaultValue: '', description: '源码分支') string(name: 'SOURCE_COMMIT', defaultValue: '', description: '源码 commit') string(name: 'BUILD_VERSION', defaultValue: '', description: '发布版本号') string(name: 'DEPLOY_TARGET', defaultValue: '', description: '部署目标') string(name: 'DATABASE', defaultValue: '', description: 'SpacetimeDB database') string(name: 'SUMMARY', defaultValue: '', description: '补充摘要') } stages { stage('Send Email') { steps { script { def sendNotification = { persistedRecipients -> def recipientList = [] [persistedRecipients, params.EMAIL_RECIPIENTS].each { rawRecipients -> rawRecipients?.split(',')?.each { recipient -> def normalized = recipient.trim() if (normalized && !recipientList.contains(normalized)) { recipientList.add(normalized) } } } def recipients = recipientList.join(',') if (!recipients) { echo '[notify-email] 持久收件人凭据与 EMAIL_RECIPIENTS 均未配置,跳过邮件发送。' return } def result = params.SOURCE_RESULT?.trim() ?: 'UNKNOWN' def jobName = params.SOURCE_JOB_NAME?.trim() ?: 'unknown-job' def buildNumber = params.SOURCE_BUILD_NUMBER?.trim() ?: 'unknown-build' def subject = "[Genarrative][${result}] ${jobName} #${buildNumber}" def body = """Genarrative Jenkins 流水线执行结果 结果: ${result} 流水线: ${jobName} 构建号: ${buildNumber} 构建 URL: ${params.SOURCE_BUILD_URL ?: ''} 源码分支: ${params.SOURCE_BRANCH ?: ''} 源码 commit: ${params.SOURCE_COMMIT ?: ''} 发布版本: ${params.BUILD_VERSION ?: ''} 部署目标: ${params.DEPLOY_TARGET ?: ''} 数据库: ${params.DATABASE ?: ''} 摘要: ${params.SUMMARY ?: ''} """ mail to: recipients, subject: subject, body: body echo "[notify-email] 已发送邮件: recipientCount=${recipientList.size()}, source=${jobName} #${buildNumber}, result=${result}" } def credentialId = params.EMAIL_RECIPIENTS_CREDENTIAL_ID?.trim() if (credentialId) { withCredentials([string(credentialsId: credentialId, variable: 'PERSISTED_EMAIL_RECIPIENTS')]) { sendNotification(env.PERSISTED_EMAIL_RECIPIENTS) } } else { sendNotification('') } } } } } }