Jenkins管道捕获jenkins步骤的输出

时间:2018-04-19 15:21:41

标签: jenkins jenkins-pipeline

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

背景:

我使用jenkins管道来构建一大堆微服务。

我想将jenkins控制台中的所有相关信息提取到归档文件中,这样开发人员就不必查看混淆了它们的控制台。这适用于sh步骤我可以重定向stdout和stderr但是我怎样才能为jenkins管道步骤做类似的事情呢?

2 个答案:

答案 0 :(得分:1)

作为一种解决方法,我们使用以下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()

请注意,可能会发生 - 很可能是由于缓存问题 - 日志的最后一行有时会丢失。也许睡觉会有所帮助。但到目前为止,这里并不需要这样做。

答案 1 :(得分:-1)

这就是我用来捕获已构建的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