我正在使用声明性Grovvy管道创建Jenkins管道项目。在那里有一个问题,我必须为某些操作设置超时,如果任务没有在定义的持续时间内完成,那么我必须在shell中运行一些清理命令。安装程序就是这样的
#!/usr/bin/groovy
import com.vmware.jenkins.utils.JenkinsGroovyCommon
.
.
def user
wrap([$class: 'BuildUser']) { user = env.BUILD_USER_ID }
print "DEBUG: parameter USERNAME = ${user}" // Output : DEBUG: parameter USERNAME = xyz
stage ('Verify') {
try {
timeout(time: 2, unit: 'MINUTES') {
print "${env.BUILD_USER_ID}" // Output : xyz
print "Do some verification"
.
.
.
}
}
catch(err) {
def inputuser = err.getCauses()[0].getUser()
if('SYSTEM' == inputuser.toString()) {
print "${env.BUILD_USER_ID}" // Output : null
print " ${BUILD_URL} has reached an input timeout, failing build."
message = "${BUILD_URL} has reached an input timeout, failing build."
}
try {
sh '''
echo "Do cleanup!"
'''
} catch (Exception e) {
print "Failed to exeucute cleanup : " + e
}
}
(我为每个打印报表提供了内联输出) 当我执行上面的管道时,控件永远不会出现在下面的shell脚本
中 sh '''
echo "Do cleanup!"
'''
而是抛出异常
Failed to exeucute cleanup : java.io.NotSerializableException: hudson.model.User
从输出中我们可以看到 env.BUILD_USER_ID 设置为 null 看起来像 hudson.model.User 也是空即可。
看起来在超时后,这些变量正在重置。如何避免这些空值并使 hudson.model.User 携带与之前相同的值?或者你们建议的任何其他方法?
答案 0 :(得分:1)
在使用多分支管道时,我也会遇到这样的问题,这是因为jenkins需要重新序列化诸如step或stage之类的过程,以防jenkins重新启动,以便它可以重新处理这些过程。
异常“无法执行清除:java.io.NotSerializableException:hudson.model.User”指示jenkins尝试序列化Object用户,但是无法序列化。代码行:
def inputuser = err.getCauses()[0].getUser()
导致异常。通常,我们可以尝试使用属于字符串或数字的Type变量,这些类型易于序列化。因此,要解决该异常,可以像这样更改代码:
def inputuser = err.getCauses()[0].getUser().toString()