@NonCPS在第一个构建步骤后停止

时间:2017-10-12 09:25:33

标签: jenkins groovy jenkins-pipeline

@NonCPS带注释的函数中,只执行第一个jenkins构建步骤的代码。有没有人有同样的问题?我错过了什么吗?我正在使用Jenkins LTS ...只是说'(2.73.2)。

这是我的代码:

@NonCPS
def hello() {
    println 'Output "hello":'
    sh 'echo Hello'
    println 'Output "World":'
    sh 'echo World'
}

node {
    stage('Test') {
        hello()
    }
}

我希望这段代码能正常运行,但输出结果如下:

[Pipeline] node
Running on Jenkins in /var/lib/jenkins/workspace/Sandbox/pipeline-test
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] echo
Output "hello":
[Pipeline] sh
[pipeline-test] Running shell script
+ echo Hello
Hello
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

1 个答案:

答案 0 :(得分:5)

您无法在@NonCPS方法中运行构建步骤。管道脚本被认为是#serial; serializable",允许它们在系统故障等方面保持持久。管道脚本使用的groovy功能的一部分是可序列化的 - 对于任何非流水线脚本,您使用{{1}执行它。

基本上,您的@NonCPS方法需要执行其业务并将数据返回到" safe",序列化执行堆栈。

在您的特定示例代码中,我认为没有理由@NonCPS必须hello() - 我只能假设您的实际功能正在做更复杂的事情。

(编辑) 刚看了你的问题历史和原始剧本;我不知道最新版本是否仍然如此,但是当我编写脚本时〜6个月前,@NonCPS迭代不可序列化。