Jenkins多分支流水线如何发送带S3制品链接的构建成功邮件
Jenkins流水线S3制品邮件通知实现方案
原代码报错核心原因
- 权限问题:
currentBuild.rawBuild是Jenkins内部受限API,默认流水线沙箱模式下无访问权限,是触发post阶段执行报错的主要原因 - 逻辑缺陷:直接拼接过滤后的原始日志行,会把日志前缀、
s3://协议头一起拼到链接里,最终生成的是无效地址;且没有做匹配结果为空的兜底,容易触发空指针异常 - 性能问题:直接读取全量构建日志,大日志场景下会占用过多内存拖慢执行速度
原逻辑快速修复代码
直接替换你原来的post段即可,不需要额外权限审批,沙箱环境可直接运行:
post { success { script { // 仅读取最近1000行日志,避免全量加载占用过多内存 def logLines = currentBuild.getLog(1000) // 正则匹配S3上传日志,直接提取S3对象路径key,过滤多余日志前缀 def s3Artifacts = (logLines.join('\n') =~ /Uploaded to repo\.XXX: s3:\/\/XXX-artifacts\/([^\s]+)/).findAll() // 拼接成可直接访问的S3 HTTP链接 def s3DownloadLinks = s3Artifacts.collect { match -> "https://XXX-artifacts.s3.us-west-2.amazonaws.com/${match[1]}" }.join('\n') emailext ( subject: "${JOB_NAME} 构建成功 #${BUILD_ID}", body: """任务名称: ${JOB_NAME} 构建编号: ${BUILD_ID} 构建详情地址: ${BUILD_URL} S3制品下载链接: ${s3DownloadLinks ?: '未提取到有效S3制品地址,请核查构建日志'} """, to: env.EmailList ) } } }
更稳妥的推荐实现方案
扫描日志提取链接的方案容错性差,一旦S3插件升级修改日志输出格式就会失效。更可靠的方式是在S3上传阶段直接保存返回的制品URL,既可以天然校验上传是否成功(上传失败流水线会直接中断,不会走到成功通知逻辑),也不需要做日志匹配:
// 流水线最顶部提前定义全局变量存储制品链接 def s3ArtifactLinks = [] pipeline { agent any // 其他阶段省略(拉取代码、Maven构建等) stage('上传制品到S3') { steps { script { // 以常用的Pipeline: AWS Steps插件的s3Upload步骤为例 def uploadRet = s3Upload( bucket: 'XXX-artifacts', region: 'us-west-2', file: 'target/你的制品包名称.jar', // Maven构建生成的本地制品路径 path: "project/${JOB_NAME}/${BUILD_NUMBER}/你的制品包名称.jar" // S3存储路径 ) // 直接从上传返回结果里拿可访问的URL存入全局变量 s3ArtifactLinks.add(uploadRet.effectiveUri.toString()) } } } post { success { emailext ( subject: "${JOB_NAME} 构建成功 #${BUILD_ID}", body: """任务名称: ${JOB_NAME} 构建编号: ${BUILD_ID} 构建详情地址: ${BUILD_URL} S3制品下载链接: ${s3ArtifactLinks.join('\n')} """, to: env.EmailList ) } } }
如果你用的是其他S3上传插件,只要是官方维护的插件,上传步骤都会返回上传后的对象地址,直接取值存储即可,比扫日志的方案稳定性高很多。
内容的提问来源于stack exchange,提问作者tsteinbaugh-beckman
相关产品推荐
相关产品推荐

