Jenkins管道捕获Jenkins步骤的输出

Jenkins管道捕获Jenkins步骤的输出,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,如何将jenkins管道步骤(如docker.build(someTag))的控制台输出存档(作为文件) 背景: 我使用jenkins管道构建了一整套微服务 我想将jenkins控制台中的所有相关信息提取到归档文件中,这样开发人员就不必查看会混淆它们的控制台。这对于sh步骤很好,因为我可以重定向stdout和stderr,但如何对jenkins管道步骤执行类似操作?作为解决方法,我们使用以下LogRecorder类: class LogRecorder implements Serializab

如何将jenkins管道步骤(如
docker.build(someTag)
)的控制台输出存档(作为文件)

背景:

我使用jenkins管道构建了一整套微服务


我想将jenkins控制台中的所有相关信息提取到归档文件中,这样开发人员就不必查看会混淆它们的控制台。这对于
sh
步骤很好,因为我可以重定向stdout和stderr,但如何对jenkins管道步骤执行类似操作?

作为解决方法,我们使用以下
LogRecorder
类:

class LogRecorder implements Serializable {
    def logStart
    def logEnd
    def currentBuild
    def steps

    LogRecorder(currentBuild) {
        this.currentBuild = currentBuild
    }

    void start() {
        logStart = currentBuild.getRawBuild().getLog(2000)
    }

    String stop() {
        logEnd = currentBuild.getRawBuild().getLog(2000)
        getLog()
    }

    String getLog() {
        def logDiff = logEnd - logStart
        return logDiff.join('\n')
    }
}
根据需要,您可能需要调整对
getLog()
的调用中的日志行数

可能的用途:

LogRecorder logRecorder = new LogRecorder(currentBuild)
logRecorder.start()

docker.build(someTag)

testResult.stdOut = logRecorder.stop()

请注意,日志的最后一行有时会丢失,这可能是由于缓存问题造成的。也许睡一觉会有帮助。但到目前为止,这里还没有要求这样做。

下面是我用来捕获构建的docker映像的sha256的内容

docker.build(someTag)
def dockerSha256 = sh(returnStdout: true, script: "docker image inspect $someTag | jq .[0].Id").trim()
我使用“jq”来解析json响应

或者是传统的方式

    def json = sh(returnStdout: true, script: "docker image inspect $someTag").trim()
    def obj = new JsonSlurper().parseText(json)

    println "raw json: " + obj
    println "groovy docker sha256: " + obj[0].Id