Jenkins脚本化管道:如何在此特定情况下应用@NonCPS注释

豪克·索默费尔德

我正在编写脚本化的Jenkins-Pipeline,该脚本需要将具有特定编码的String写入文件,如以下示例所示:

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)该方法并对其进行注释,但是这样,每次调用该方法时,我都必须创建一个新的编写器

有人对我如何解决我的代码有想法吗?

提前致谢!

zett42

这是使用log在共享库中定义函数来实现此目的的方法vars\log.groovy

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'

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Jenkins Groovy如何在不结束管道的情况下从@NonCPS方法调用方法

如何在特定情况下捕获OnTouchEvent?

如何在特定情况下使用JavaScript加载特定的CSS文件?

Jenkins 管道中的 sh 命令在有和没有 @NonCps 的情况下都会失败

在特定情况下如何在python中舍入任何数字

如何在特定情况下的Django注册自定义字段中使required = false

在我的特定情况下,如何在C#中选择正确的循环语句?

如何在整个游戏的特定情况下使用玩家的输入

如何在特定情况下将while循环转换为递归方法

如何在我的特定情况下形成嵌套数组的数组?

在特定情况下如何抑制声纳法则?

在特定情况下如何使用高阶结构

在特定情况下如何合并数据框?

在特定情况下,如何使JRadioButton透明?

特定情况下的时序图

特定情况下的开关盒

在特定情况下替换字符

特定情况下的分段错误

Jenkins管道-如何在不首先调用node()的情况下加载Jenkinsfile?

Firebase动态链接在特定情况下无法启动我的应用程序

GSON-特定情况下的自定义序列化程序

如何在没有特定类型的情况下更新Angular管道

在这种特定情况下,如何使用 javascript 删除 HTML 元素

在特定情况下,实体框架4.0死锁而不是块。如何解决这个问题?

后缀运算符在这种特定情况下(JAVA)如何工作?

在这种特定情况下,如何使用流获取列表列表?

jQuery:在这种特定情况下,如何恢复点击事件的初始状态?

Three.js:在特定情况下如何添加autoRotate?

在这种特定情况下,如何阻止Eclipse缩进多余的空格?