我正在编写一个脚本化的 Jenkins-Pipeline,它需要将具有特定编码的字符串写入文件,如下例所示:

class Logger implements Closeable {

    private final PrintWriter writer

    [...]

    Logger() {
        FileWriter fw = new FileWriter(file, true)
        BufferedWriter bw = new BufferedWriter(fw)
        this.writer = new PrintWriter(bw)
    }

    def log(String msg) {
        try {
            writer.println(msg)
            [...]
        } catch (e) {
            [...]
        }
    }
}

上面的代码不起作用,因为PrintWriter不可序列化,所以我知道我必须防止某些代码被 CPS 转换。 不过,我不知道该怎么做,因为据我所知, @NonCPS注释只能应用于方法。 我知道一种解决方案是将所有与输出相关的代码移动到log(msg)并注释该方法,但这样每次调用该方法时我都必须创建一个新的编写器。

有人知道我该如何修复我的代码吗?

提前致谢!

#1楼 票数:1 已采纳

下面是一种使用在vars\\log.groovy中的共享库中定义的log函数来完成这项工作的方法:

import java.io.FileWriter
import java.io.BufferedWriter
import java.io.PrintWriter

// The annotated variable will become a private field of the script class. 
@groovy.transform.Field 
PrintWriter writer = null

void call( String msg ) {
    if( ! writer ) {
        def fw = new FileWriter(file, true)
        def bw = new BufferedWriter(fw)
        writer = new PrintWriter(bw)
    }

    try {
        writer.println(msg)
        [...]
    } catch (e) {
        [...]
    }     
}

毕竟, vars文件夹中的脚本被实例化为单例类,这非常适合记录器。 即使没有@NonCPS注释,这也能工作。

在管道中的使用非常简单:

log 'some message'

  ask by Hauke Sommerfeld translate from so

未解决问题?本站智能推荐:

1回复

如何在Jenkins管道中通过bat设置环境变量

我想根据bat的执行结果设置env变量。 当compile.bat返回1 ,如何设置env.BuildResult为FAILURE ?
1回复

如何在 Jenkins 管道中创建动态复选框参数?

我从这个SO 答案中发现了如何动态创建输入参数 这让我们只能选择一个,因为它是一个choice参数,如何使用相同的列表来创建复选框参数,以便用户可以根据需要选择多个? 例如:如果用户选择first和third ,那么最后一个 echo 应该打印Release scope selected: fi
1回复

Jenkins 管道中的方法调用

在我的 Jenkins 管道中,我需要根据我在运行时获得的参数调用几个方法。 例如,如果我将参数指定为“Development”,则其他参数也应类似地调用“Developmentadaptation”方法。 下面是我尝试的代码,其中 INSTANCE 是构建的参数,如果我将参数作为 qa 给出,那么
1回复

如何在 Jenkins 管道中获取变量值?

我正在使用持续交付管道构建微服务。 stage('package')使serviceImage变量,但我如何在stage('deploy')获取和使用它? main.groovy 包.groovy 部署.groovy
1回复

Jenkins声明式管道

我在詹金斯(Jenkins)中使用声明性管道(Declarative Pipeline),我有200多个测试。 我想将它们拆分为许多机器。 我有一段代码我必须修复,但我不知道如何。 该文档不是很好。 有人可以解释一下这些代码行中发生了什么吗? splitTests是一种语言功
1回复

groovy.lang.MissingMethodException:没有方法签名:为什么 Jenkins 共享管道库会出现此错误?

我有一个共享管道库 代码。 该库在我的 Jenkins 中隐式加载,我在我的 Jenkinsfile 中使用以下代码调用其中一种方法: 我也试过使用CheckOut.call() & CheckOut.call([:],{})但无济于事。 不断收到以下错误: PS - 该错误并非特
1回复

在 Jenkinsfile 中访问 Jenkins 管道定义

对于一个项目,我想知道哪个分支用于检查所使用的管道脚本。 在这种情况下,我会得到分支是 */develop 工作定义示例 用这个解决了:
1回复

调用 Jenkins 作业

我是 Jenkins 管道的完全菜鸟。 我需要设计以下工作流程: 存储具有特定优先级的任务列表。 安排它们每隔几个小时运行一次,使用配置了重试次数的 cron-job。 标记反复失败的任务,也许是为了报告。 设计上述内容的最佳方法是什么,我需要编写管道代码还是 Jenkins 提供