如何添加NonCPS注解来测试Jenkins中使用的一个groovy类
问题:如何添加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'
}
它使用src
和vars
作为源文件目录,使用test
作为单元测试目录。我的共享库目录结构通常如下所示:
├── build.gradle
├── Jenkinsfile
├── src
│ └── com
│ └── foo
├── test
│ ├── com
│ │ └── foo
│ └── vars
│ └── myVarSpec.groovy
└── vars
└── myVar.groovy
在这个示例中,我们使用 2 个编译时依赖项 -groovy-cps
和groovy-all
,以及用于单元测试的 Spock 框架。多亏了这一点,您可以使用gradle test
命令在 IDE 和 CI 服务器上运行单元测试。
Jenkins流水线单元测试库
当运行一个简单的单元测试还不够时,考虑使用JenkinsPipelineUnit库,它允许您测试您的 Jenkinsfiles,包括共享库。这是一个很棒的库,可以加快开发速度,您可以在几毫秒内测试您的管道行为。这个库与 JUnit 一起使用,但是有一些 3rd 方包装器将这个库带到了 Spock(虽然我还没有测试它)。
更多推荐
所有评论(0)