如何添加 NonCPS 注释来测试 Jenkins 中使用的 groovy 类

cau*_*chy 9 groovy jenkins

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

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

unable to resolve class NonCPS ,  unable to find class for annotation
@ line 51, column 2.
    @NonCPS
Run Code Online (Sandbox Code Playgroud)

Jenkins 需要注释。

图书馆(再次工作)类似于:

class MyTestClass implements Serializable {
  MyTestClass() { }
  @NonCPS
  def testMethod() { }
Run Code Online (Sandbox Code Playgroud)

在我调用的脚本中

import com.blabla.MyTestClass
...
test = new MyTestClass()
Run Code Online (Sandbox Code Playgroud)

如果我只是评论注释以测试它是否有效。我一直在四处寻找,似乎有一些非常酷的项目来测试 Jenkins 管道,包括他们的共享库,但我现在有点困惑,我想在使用更复杂的东西之前先进行这些测试。

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

Szy*_*iak 23

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

import com.cloudbees.groovy.cps.NonCPS
Run Code Online (Sandbox Code Playgroud)

到使用@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'
}
Run Code Online (Sandbox Code Playgroud)

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

??? build.gradle
??? Jenkinsfile
??? src
?   ??? com
?       ??? foo
??? test
?   ??? com
?   ?   ??? foo
?   ??? vars
?       ??? myVarSpec.groovy
??? vars
    ??? myVar.groovy
Run Code Online (Sandbox Code Playgroud)

在此示例中,我们使用 2 个编译时依赖项 -groovy-cpsgroovy-all和 Spock 框架进行单元测试。多亏了这一点,您可以使用gradle test命令在 IDE 以及 CI 服务器上运行单元测试。

Jenkins 流水线单元测试库

当运行简单的单元测试还不够时,请考虑使用JenkinsPipelineUnit库,它允许您测试 Jenkinsfiles 包括共享库。这是一个很棒的库,可以加快开发速度,您可以在几毫秒内测试您的管道行为。这个库与 JUnit 一起工作,但是有一些 3rd 方包装器将这个库带到了 Spock(不过我还没有测试过)。