Jenkins脚本化管道:如何在这种特定情况下应用@NonCPS注释
我正在处理一个脚本化的Jenkins管道,该管道需要将具有特定编码的字符串写入文件,如以下示例所示: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(
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'