Jenkins管道-读取上一阶段日志

Jenkins管道-读取上一阶段日志,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,考虑具有两个阶段的Jenkins管道,阶段a然后阶段B 在阶段B中,是否可以解析阶段A的日志中的某些特定文本?正如建议的那样,我最后做的是使用tee写入文件(和标准输出) sh "command | tee <filename>" sh“命令| tee” 然后根据需要解析该文件,使用readFile从工作区读取该文件。自7月28日以来一直有更新 如中所述,从版本2.4起,您可以使用: def out=sh脚本:“命令”,返回stdout:true 至少它比输出到文件然后读取文件

考虑具有两个阶段的Jenkins管道,阶段a然后阶段B


在阶段B中,是否可以解析阶段A的日志中的某些特定文本?

正如建议的那样,我最后做的是使用tee写入文件(和标准输出)

sh "command | tee <filename>"
sh“命令| tee”

然后根据需要解析该文件,使用
readFile
从工作区读取该文件。

自7月28日以来一直有更新

如中所述,从版本2.4起,您可以使用:

def out=sh脚本:“命令”,返回stdout:true

至少它比输出到文件然后读取文件要简单和干净得多。

如果要搜索模式的第一次出现,还可以使用
manager.logContains(regexp)
manager.getLogMatcher(regexp)
。有关更多详细信息,请参见我的另一个答案:

使用
tee
将输出拆分为标准输出和文件。接下来,为文本解析文件

STAGE_A_LOG_FILE = 'stage_a.log'

pipeline {
    agent any
    stages {
        stage('Stage A') {
            steps {
                script {
                    // tee log into file
                    tee(STAGE_A_LOG_FILE) {
                        echo 'print some Stage_A log content ...'
                    }
                }
            }
        }
        stage('Stage B') {
            steps {
                script {
                    // search log file for 'Stage_A'
                    regex = java.util.regex.Pattern.compile('some (Stage_A) log')
                    matcher = regex.matcher(readFile(STAGE_A_LOG_FILE))
                    if (matcher.find()) {
                        echo "found: ${matcher.group(1)}"
                    }
                }
            }
        }
    }
}
管道输出:

print some Stage_A log content ...
found: Stage_A
Finished: SUCCESS

我看你需要什么样的日志。例如,如果你想解析gradle输出,你可能可以将标准输出重定向到文件,然后读取下一个文件并解析它。嗨,也许你可以帮助我解析上一个“步骤”,因为我使用了copyArtifact插件,它需要一个“步骤”(所以在我的情况下,它不是命令,所以我不能使用“sh脚本”),我为它创建了一个问题:尽管要小心。如果您依赖于返回代码-此行将开始始终返回0。不幸的是
tee
has。