Jenkins Pipeline sleep(10)阻止功能完成

Sei*_*tan 5 groovy jenkins jenkins-pipeline

我在Jenkinsfile中发现了Groovy代码的奇怪问题:

@NonCPS
def test() {
  println "Start"
  sleep(10)
  println "Stop"
}
Run Code Online (Sandbox Code Playgroud)

事实是,睡眠10秒钟之后,代码就再也无法进入了println "Stop"
看来,睡眠会在10秒后返回并运行下一个管道步骤。

输出只是:

[Pipieline] echo
Start
[Pipeline] sleep
Sleeping for 10 sec
[Pipeline] }
 ... next pipeline steps
Run Code Online (Sandbox Code Playgroud)

有人遇到过同样的问题吗?

Szy*_*iak 5

当您sleep(10)在 Groovy 脚本内部调用时,工作流 CPS 插件将执行SleepStep而不是DefaultGroovyStaticMethods.sleep(Object self, long time). 你的问题是由@NonCPS函数引起的(感谢mkobit的建议!)。考虑以下示例:

node {
    stage("Test") {
        test()
    }
}

@NonCPS
def test() {
    echo "Start"
    sleep(5)
    echo "Stop"
}
Run Code Online (Sandbox Code Playgroud)

输出:

[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/test-pipeline
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] echo
Start
[Pipeline] sleep
Sleeping for 5 sec
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
Run Code Online (Sandbox Code Playgroud)

Stop管道运行没有回显。现在,如果我们只@NonCPS从管道中调用的函数中删除注释:

node {
    stage("Test") {
        test()
    }
}

def test() {
    echo "Start"
    sleep(5)
    echo "Stop"
}
Run Code Online (Sandbox Code Playgroud)

事情发生变化并按Stop预期得到回应:

Started by user admin
[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/test-pipeline
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] echo
Start
[Pipeline] sleep
Sleeping for 5 sec
[Pipeline] echo
Stop
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
Run Code Online (Sandbox Code Playgroud)

有关使用的更多信息,@NonCPS请阅读以下流水线代码最佳实践文章。