You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 15:27:22