我是 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)
它使用src和vars作为源文件目录和test单元测试目录。我的共享库目录结构通常如下所示:
??? build.gradle
??? Jenkinsfile
??? src
? ??? com
? ??? foo
??? test
? ??? com
? ? ??? foo
? ??? vars
? ??? myVarSpec.groovy
??? vars
??? myVar.groovy
Run Code Online (Sandbox Code Playgroud)
在此示例中,我们使用 2 个编译时依赖项 -groovy-cps和groovy-all和 Spock 框架进行单元测试。多亏了这一点,您可以使用gradle test命令在 IDE 以及 CI 服务器上运行单元测试。
当运行简单的单元测试还不够时,请考虑使用JenkinsPipelineUnit库,它允许您测试 Jenkinsfiles 包括共享库。这是一个很棒的库,可以加快开发速度,您可以在几毫秒内测试您的管道行为。这个库与 JUnit 一起工作,但是有一些 3rd 方包装器将这个库带到了 Spock(不过我还没有测试过)。
| 归档时间: |
|
| 查看次数: |
6421 次 |
| 最近记录: |