Jenkins脚本化管道单例Null指针异常

时间:2018-10-02 13:12:25

标签: jenkins groovy jenkins-groovy

我最近开始努力整合为我们的Jenkins脚本化管道设置的一些全局变量。我开始时比较小(用一个布尔值来控制是否将大量“额外”的东西记录到构建日志中),并希望遵循Szymon Stepniak创建的NotificationConfig。但是,我无法克服DebugOptions单例初始化期间引发的“ NullPointerException”。

共享库的源布局

.
├── src
│   └── foo
│       └── utils
│           └── DebugOptions.groovy
└── vars
    ├── debugOptions.groovy
    └── standardPipeline.groovy

src / com / foo / utils / DebugOptions.groovy

#!/usr/bin/env groovy
package com.foo.utils;

@Singleton
class DebugOptions {
    // Simple wrapper around a debugging options to prevent argument 
    // explosion for everything that needs to filter output.
    boolean flag = false
}

vars / debugOptions.groovy

#!groovy
import com.foo.utils.DebugOptions
// This DSL ("Domain Specific Language") helps modify and manage configuration objects
// Implement a closure body to be executed in context of DebugOptions
// Defining in vars makes it globally accessible
// 
// Inspired by code at:
// https://stackoverflow.com/questions/50962643/best-way-to-set-reusable-property-in-jenkinsfile
def call(body) {
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = DebugOptions.instance
    body()
}

/vars/standardPipeline.groovy

#!/usr/bin/env groovy
def call(body) {
boolean PIPELINE_DEBUG = ("${env.PIPELINE_DEBUG}"!="0")
if(PIPELINE_DEBUG){ println "[DEBUG] Pipeline Debug Logging Enabled" }
   try{ 
       debugOptions { flag = PIPELINE_DEBUG }
       println DebugOptions.instance.flag
   } catch (Exception e) {
      println e.message
      error e.message
   }
}
// rest of pipeline implementation

项目Jenkinsfile

#!groovy
library "utils"
standardPipeline()

构建输出

[Pipeline] echo
[DEBUG] Pipeline Debug Logging Enabled
[Pipeline] End of Pipeline 
[Bitbucket] Notifying commit build result
[Bitbucket] Build result notified
java.lang.NullPointerException
Finished: FAILURE

问题

  1. 是否可以获取有关nullpointer异常的更多信息(如堆栈跟踪)?我尝试用throw e.message代替error e.message,但得到相同的输出。
  2. 是否需要一个插件来实现这一目标?我已经知道了所有的Pipeline插件(尤其是Pipeline-Groovy)
  3. src/com/foo/utils/DebugOptions.groovy中,包装行后是否需要分号?
  4. 有人可以指出我的问题所在吗?
  5. 最后,我知道它是主观的,但是我有什么需要改进的代码吗?首先,我不在乎D / debugOptions中仅区分大小写的区别。

谢谢!

0 个答案:

没有答案