如何获取Jenkins流水线指定阶段中某步骤的控制台输出?
Jenkins流水线获取指定阶段特定步骤控制台输出实现方案
方案1:实时捕获当前步骤输出(推荐)
如果是需要捕获正在执行的步骤输出,直接在对应步骤中使用returnStdout参数即可,适用于sh、bat、powershell等原生执行步骤:
pipeline { agent any stages { stage('代码构建') { steps { script { // 捕获shell步骤输出,trim()移除末尾多余换行 def buildLog = sh( script: 'mvn clean package -DskipTests', returnStdout: true ).trim() // 存入环境变量,供后续阶段调用 env.BUILD_LOG_PART = buildLog } } } stage('发送通知') { steps { script { // 按需处理日志,比如提取构建耗时、错误信息等核心内容 def sendContent = env.BUILD_LOG_PART.findAll(/Build Success.*Time: [0-9]+s/).join('\n') // 发送邮件 emailext( to: 'your@mail.com', subject: '构建结果通知', body: "构建核心输出:\n${sendContent}" ) } } } } }
方案2:获取已完成阶段的步骤输出
如果需要捕获已经执行完成的其他阶段的步骤输出,可以通过构建日志过滤的方式实现:
- 先在目标步骤的首尾加上唯一标识,方便后续过滤:
stage('自动化测试') { steps { echo '=== TEST_STEP_START_MARK ===' sh 'pytest -v test/*.py' echo '=== TEST_STEP_END_MARK ===' } }
- 在需要获取输出的阶段调用API拉取全量日志,过滤得到目标内容:
// 拉取当前构建最新的1000行日志,可按需调整行数 def fullLog = currentBuild.rawBuild.getLog(1000).join('\n') // 正则匹配两个标识之间的内容 def testLog = (fullLog =~ /=== TEST_STEP_START_MARK ===([\s\S]*?)=== TEST_STEP_END_MARK ===/)[0][1].trim()
注意:调用
currentBuild.rawBuild相关方法需要先在Jenkins的「Manage Jenkins -> In-process Script Approval」中批准对应方法的调用权限。如果日志包含ANSI颜色码,可以用fullLog.replaceAll(/\u001B\[[0-9;]*m/, '')清理后再处理。
注意事项
- 第三方插件提供的自定义步骤如果没有
returnStdout参数,优先使用方案2实现。 - 不要直接将全量日志作为邮件正文发送,避免因内容过大触发邮件服务器限制,提前过滤只保留需要的核心内容。
- 如果流水线存在重启、断点续跑的情况,需要适当调整
getLog()方法的拉取行数,避免遗漏目标阶段的日志。
内容的提问来源于stack exchange,提问作者Bhaskar Phukan
相关产品推荐
相关产品推荐

