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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

特定情况下的时序图

来自分类Dev

在特定情况下替换字符

来自分类Dev

特定情况下的开关盒

来自分类Dev

特定情况下的分段错误

来自分类Dev

如何在Array中定义to_proc方法,以便在特定情况下可以使用它

来自分类Dev

在此特定情况下,p.WaitForExit()和p.WaitForExit(Integer.MaxValue)有什么区别?

来自分类Dev

如何在没有脚本块的情况下引用整个管道对象

来自分类Dev

如何在备用软件包名称下安装Python滚轮?(在我的特定情况下,“ Cryptodome”软件包名称下的PyCryptodome)

来自分类Dev

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

来自分类Dev

在这种特定情况下如何使用break子句

来自分类Dev

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

来自分类Dev

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

来自分类Dev

在这种特定情况下,如何修复损坏的包装?

来自分类Dev

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

来自分类Dev

在这种特定情况下,如何设计类以共享其方法声明?

来自分类Dev

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

来自分类Dev

在特定情况下未调用Firebase onDataChange

来自分类Dev

在特定情况下显示和隐藏弹出窗口

来自分类Dev

在特定情况下未绘制视图

来自分类Dev

在特定情况下的功能依赖性

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

    特定情况下的时序图

  11. 11

    在特定情况下替换字符

  12. 12

    特定情况下的开关盒

  13. 13

    特定情况下的分段错误

  14. 14

    如何在Array中定义to_proc方法,以便在特定情况下可以使用它

  15. 15

    在此特定情况下,p.WaitForExit()和p.WaitForExit(Integer.MaxValue)有什么区别?

  16. 16

    如何在没有脚本块的情况下引用整个管道对象

  17. 17

    如何在备用软件包名称下安装Python滚轮?(在我的特定情况下,“ Cryptodome”软件包名称下的PyCryptodome)

  18. 18

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

  19. 19

    在这种特定情况下如何使用break子句

  20. 20

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

  21. 21

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

  22. 22

    在这种特定情况下,如何修复损坏的包装?

  23. 23

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

  24. 24

    在这种特定情况下,如何设计类以共享其方法声明?

  25. 25

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

  26. 26

    在特定情况下未调用Firebase onDataChange

  27. 27

    在特定情况下显示和隐藏弹出窗口

  28. 28

    在特定情况下未绘制视图

  29. 29

    在特定情况下的功能依赖性

热门标签

归档