Jenkins Groovy中NonCPS方法内调用CPS函数的问题
Jenkins流水线Groovy问题解答
1. 无需@NonCPS的eachLine替代方案
有替代方法。你可以用split('\n')将文本按换行符分割为字符串列表,再通过普通的each循环遍历,这样整个函数不需要添加@NonCPS注解,就能正常调用sh命令。
修改后的示例代码:
def SplitGitBlame(String gitBlameOutputAsText) { def gerritUrls = [] // 改用列表收集结果,避免循环中变量被覆盖 gitBlameOutputAsText.split('\n').each{ line -> // 使用双引号让Groovy解析变量${line} def urlOutput = sh(returnStdout:true, script: "gerrit query commit: ${line} --format=text | grep 'url:'").trim() gerritUrls.add(urlOutput) } return gerritUrls }
2. @NonCPS方法内能否执行sh命令?
不能。@NonCPS注解的方法会脱离Jenkins流水线的CPS(Continuation Passing Style)变换上下文,而sh是Jenkins提供的流水线步骤,必须依赖CPS上下文才能运行,强行在@NonCPS方法内调用会直接报错。
如果确实需要在@NonCPS方法中处理纯Groovy逻辑,可将执行sh的逻辑抽成单独的无@NonCPS注解方法,在@NonCPS方法内调用这个方法。不过更推荐第一种方案,直接规避@NonCPS的使用,代码更简洁易维护。
内容的提问来源于stack exchange,提问作者Saar Gamzo
相关产品推荐
相关产品推荐

