我是新手。使用了几个星期。我写了一个在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上运行时,它如何工作?
答案 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'
}
它将src
和vars
用作源文件目录,并将test
用作单元测试目录。我的共享库目录结构通常如下所示:
├── build.gradle
├── Jenkinsfile
├── src
│ └── com
│ └── foo
├── test
│ ├── com
│ │ └── foo
│ └── vars
│ └── myVarSpec.groovy
└── vars
└── myVar.groovy
在此示例中,我们使用2个编译时依赖项-groovy-cps
和groovy-all
,以及用于单元测试的Spock Framework。因此,您可以使用gradle test
命令在IDE以及CI服务器上运行单元测试。
如果运行简单的单元测试还不够,请考虑使用JenkinsPipelineUnit库,该库允许您测试Jenkinsfiles(包括共享库)。这是一个很棒的库,可以加速开发,您可以在几毫秒内测试管道行为。该库可与JUnit一起使用,但是有一些第三方包装将该库引入Spock(尽管我尚未对其进行测试)。