【发布时间】:2016-07-06 08:00:29
【问题描述】:
考虑一个具有两个阶段的 Jenkins 流水线,Stage A 然后 Stage B。
在Stage B中,是否可以针对某些特定文本解析Stage A的日志?
【问题讨论】:
-
我看你需要什么样的日志。例如。如果你想解析 gradle 输出,你可以将标准输出重定向到文件和下一个读取文件并解析它。
考虑一个具有两个阶段的 Jenkins 流水线,Stage A 然后 Stage B。
在Stage B中,是否可以针对某些特定文本解析Stage A的日志?
【问题讨论】:
自 7 月 28 日以来有更新!
正如this answer 中提到的,从 Pipeline: Nodes and Processes 的 2.4 版开始,您可以使用:
def out = sh script: 'command', returnStdout: true
至少它比输出到文件然后再读取文件要简单和干净。
【讨论】:
使用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
【讨论】:
tee 有some issues。
按照建议,我最终做的是使用 tee 写入文件(和标准输出)。
sh "command | tee <filename>"
然后根据需要解析文件,使用readFile <filename>从工作区读取文件。
【讨论】:
如果要搜索模式的第一次出现,也可以使用manager.logContains(regexp) 或manager.getLogMatcher(regexp)。更多详情请参阅我的其他答案:https://stackoverflow.com/a/39873765/4527766
【讨论】: