Jenkins 管道脚本中的 withContext() 隐藏控制台输出

2024-01-08

我有这个詹金斯管道脚本(您应该能够将其直接粘贴到空白管道构建中)

import hudson.console.LineTransformationOutputStream
import hudson.console.ConsoleLogFilter
import java.nio.charset.Charset
import java.nio.charset.StandardCharsets

class MyConsoleLogFilter extends ConsoleLogFilter {

    OutputStream decorateLogger(AbstractBuild build, OutputStream logger)
            throws IOException, InterruptedException {
        return new MyOutputStream(logger, StandardCharsets.UTF_8)
    }
}

class MyOutputStream extends LineTransformationOutputStream {
    def logger
    def charset

    MyOutputStream(OutputStream logger, Charset charset) {
        this.logger = logger
        this.charset = charset
    }

    void close() throws IOException {
        super.close();
        logger.close();
    }

    void eol(byte[] bytes, int len) throws IOException {
        String line = charset.decode(ByteBuffer.wrap(bytes, 0, len)).toString();
        logger.write("xxx ".getBytes(charset))
        logger.write(line.getBytes(charset));
    }
}

node {
    withContext(new MyConsoleLogFilter()) {
        echo 'Hello World'
    }
    echo 'Hello World'
}

我期待看到第一个Hello World前缀为xxx,因为包裹MyConsoleLogFilter.

但我看到的只是灰色的控制台输出,如下所示:

Started by user Admin
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/mike-learning
[Pipeline] {
[Pipeline] withContext
[Pipeline] {
[Pipeline] echo
[Pipeline] }
[Pipeline] // withContext
[Pipeline] echo
Hello World
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

为什么控制台输出是从withContext()块被隐藏?


一位同事(Hibri Marzook)为我解决了这个问题。他把我指向https://issues.jenkins-ci.org/browse/JENKINS-53151 https://issues.jenkins-ci.org/browse/JENKINS-53151,这促使我这样做:

import hudson.console.LineTransformationOutputStream
import hudson.console.ConsoleLogFilter
import java.nio.charset.Charset
import java.nio.charset.StandardCharsets

class MyConsoleLogFilter extends ConsoleLogFilter {
    @NonCPS
    OutputStream decorateLogger(AbstractBuild build, OutputStream logger)
            throws IOException, InterruptedException {
        return new MyOutputStream(logger, StandardCharsets.UTF_8)
    }
}

class MyOutputStream extends LineTransformationOutputStream {
    def logger
    def charset

    MyOutputStream(OutputStream logger, Charset charset) {
        this.logger = logger
        this.charset = charset
    }

    @NonCPS
    void close() throws IOException {
        super.close();
        logger.close();
    }

    @NonCPS
    void eol(byte[] bytes, int len) throws IOException {
        def line = charset.decode(java.nio.ByteBuffer.wrap(bytes, 0, len)).toString();
        logger.write("xxx ".getBytes(charset))
        logger.write(line.getBytes(charset));
    }
}

node {
    withContext(new MyConsoleLogFilter()) {
        echo 'Hello World'
    }
    echo 'Hello World'
}

现在可以了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jenkins 管道脚本中的 withContext() 隐藏控制台输出 的相关文章

随机推荐