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)
有人遇到过同样的问题吗?
当您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请阅读以下流水线代码最佳实践文章。
| 归档时间: |
|
| 查看次数: |
3934 次 |
| 最近记录: |