问题:如何添加NonCPS注解来测试Jenkins中使用的一个groovy类

我是 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 上运行时它是如何工作的?

解答

如果要在 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 框架。多亏了这一点,您可以使用gradle test命令在 IDE 和 CI 服务器上运行单元测试。

Jenkins流水线单元测试库

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

Logo

CI/CD社区为您提供最前沿的新闻资讯和知识内容

更多推荐