如何添加NonCPS批注以测试Jenkins中使用的常规类

时间:2018-08-15 10:41:14

标签: jenkins groovy

我是新手。使用了几个星期。我写了一个在Jenkins中用作共享库的类。简单的方法和结构可以正常工作。

但是我打算做的更大一些,所以我想添加单元测试。现在,我只想在脚本中导入该类,并运行一些断言。但是我收到以下错误:

unable to resolve class NonCPS ,  unable to find class for annotation
@ line 51, column 2.
    @NonCPS

Jenkins需要注释。

该库(再次起作用)类似于:

class MyTestClass implements Serializable {
  MyTestClass() { }
  @NonCPS
  def testMethod() { }

在我调用的脚本中

import com.blabla.MyTestClass
...
test = new MyTestClass()

如果我只是评论注释以进行测试。 我一直在搜索,似乎有一些很酷的项目来测试Jenkins管道,包括它们的共享库,但是现在我有些困惑,我想只在使用更复杂的东西之前进行此测试。

从groovy文档中,我了解到注释应该放在类定义中,而不是方法中(这是正确的吗?),但是在Jenkins上运行时,它如何工作?

1 个答案:

答案 0 :(得分:3)

如果要在Jenkins运行时环境之外编译共享库,则必须将groovy-cps依赖项添加到类路径并添加导入:

import com.cloudbees.groovy.cps.NonCPS

到使用@NonCPS注释的类。它不会破坏任何内容-Jenkins在为Jenkinsfile执行准备运行时环境时会添加相同的导入,并且在存在此导入时不会造成任何冲突。

我还建议使用Gradle定义依赖项并在CI服务器上构建共享库。最小的build.gradle文件可能看起来像这样:

apply plugin: 'groovy'
apply plugin: 'idea'

repositories {
  mavenCentral()
}

sourceSets {
  main {
    groovy {
      srcDirs = ['src', 'vars']
    }
  }
  test {
    groovy {
      srcDirs = ['test']
    }
  }
}

dependencies {
  compile 'com.cloudbees:groovy-cps:1.22'
  compile 'org.codehaus.groovy:groovy-all:2.4.12'

  testCompile 'org.spockframework:spock-core:1.1-groovy-2.4'
}

它将srcvars用作源文件目录,并将test用作单元测试目录。我的共享库目录结构通常如下所示:

├── build.gradle
├── Jenkinsfile
├── src
│   └── com
│       └── foo
├── test
│   ├── com
│   │   └── foo
│   └── vars
│       └── myVarSpec.groovy
└── vars
    └── myVar.groovy

在此示例中,我们使用2个编译时依赖项-groovy-cpsgroovy-all,以及用于单元测试的Spock Framework。因此,您可以使用gradle test命令在IDE以及CI服务器上运行单元测试。

Jenkins管道单元测试库

如果运行简单的单元测试还不够,请考虑使用JenkinsPipelineUnit库,该库允许您测试Jenkinsfiles(包括共享库)。这是一个很棒的库,可以加速开发,您可以在几毫秒内测试管道行为。该库可与JUnit一起使用,但是有一些第三方包装将该库引入Spock(尽管我尚未对其进行测试)。