Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jenkins脚本化管道:如何在这种特定情况下应用@NonCPS注释_Jenkins_Groovy_Jenkins Pipeline_Nio_Pipeline - Fatal编程技术网

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

Jenkins脚本化管道:如何在这种特定情况下应用@NonCPS注释,jenkins,groovy,jenkins-pipeline,nio,pipeline,Jenkins,Groovy,Jenkins Pipeline,Nio,Pipeline,我正在处理一个脚本化的Jenkins管道,该管道需要将具有特定编码的字符串写入文件,如以下示例所示: class Logger implements Closeable { private final PrintWriter writer [...] Logger() { FileWriter fw = new FileWriter(file, true) BufferedWriter bw = new BufferedWriter(

我正在处理一个脚本化的Jenkins管道,该管道需要将具有特定编码的字符串写入文件,如以下示例所示:

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

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


提前谢谢

下面是一种使用
log
函数的方法,该函数在
vars\log.groovy
中的共享库中定义:

导入java.io.FileWriter
导入java.io.BufferedWriter
导入java.io.PrintWriter
//带注释的变量将成为脚本类的私有字段。
@groovy.transform.Field
PrintWriter=null
无效调用(字符串消息){
if(!writer){
def fw=新文件编写器(文件,真)
def bw=新的缓冲写入程序(fw)
writer=新的PrintWriter(bw)
}
试一试{
writer.println(msg)
[...]
}捕获(e){
[...]
}     
}
毕竟,
vars
文件夹中的脚本被实例化为单例类,这非常适合记录器。即使在没有
@NonCPS
注释的情况下也可以使用

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

log 'some message'