在 @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
最佳答案
您不能在 @NonCPS
方法中运行构建步骤。管道脚本被认为是“可序列化的”,允许它们在系统故障等情况下持久存在。只有管道脚本使用的 groovy 功能的一个子集是可序列化的 - 对于任何不可序列化的,您使用 @NonCPS
执行它。
本质上,您的@NonCPS
方法需要执行其业务并将数据返回到“安全”的序列化执行堆栈。
在您的特定示例代码中,我完全看不出为什么 hello()
必须是 @NonCPS
- 我只能假设您的实际功能正在做一些更复杂的事情.
(编辑)
刚刚查看了您的问题历史记录和原始脚本;我不知道最新版本是否仍然如此,但是当我大约 6 个月前编写我们的脚本时,each { thing ->
迭代不可序列化。
关于jenkins - @NonCPS 在第一个构建步骤后停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46705985/