Jenkins管道异常java.io.NotSerializableException:hudson.model.User

时间:2018-01-10 11:42:05

标签: java jenkins groovy jenkins-pipeline hudson

我正在使用声明性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 携带与之前相同的值?或者你们建议的任何其他方法?

1 个答案:

答案 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()