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

标签 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

最佳答案

您不能在 @NonCPS 方法中运行构建步骤。管道脚本被认为是“可序列化的”,允许它们在系统故障等情况下持久存在。只有管道脚本使用的 groovy 功能​​的一个子集是可序列化的 - 对于任何不可序列化的,您使用 @NonCPS执行它。

本质上,您的@NonCPS 方法需要执行其业务并将数据返回到“安全”的序列化执行堆栈。

在您的特定示例代码中,我完全看不出为什么 hello() 必须是 @NonCPS - 我只能假设您的实际功能正在做一些更复杂的事情.

(编辑) 刚刚查看了您的问题历史记录和原始脚本;我不知道最新版本是否仍然如此,但是当我大约 6 个月前编写我们的脚本时,each { thing -> 迭代不可序列化。

关于jenkins - @NonCPS 在第一个构建步骤后停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46705985/

相关文章:

jenkins - 'build now' 和 'build with parameters' 是否可以在 Jenkins 管道中共存?

java - eclipse egit 工作目录 vs jenkins 和 git 方式

ant - Jenkins:具有多个颠覆模块的单一作业

Javascript,常规调用方法?

grails - 在 Grails 中使用 Groovy Trait 测试失败

file - 从 Groovy 中的资源获取 File 对象的最短方法

Jenkins 环境变量给出空值作为输出

Jenkins email-ext 插件不发送邮件

docker - 从Jenkins Docker容器中旋转Docker/ECS容器

jenkins - 快速周转的 Jenkins Pipeline 脚本开发