首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jenkins:方法存根根据平台失败

Jenkins:方法存根根据平台失败
EN

Stack Overflow用户
提问于 2021-06-17 14:30:26
回答 1查看 368关注 0票数 0

下面是我编写的一段(简化的)代码和相关的单元测试,直到最近我都很高兴。

文件vars/删除File.groovy

代码语言:javascript
复制
@NonCPS
def call(String path) {
    new File(path).delete() //Must be declared as authorized class & method in Jenkins
}

文件vars/to.groovy:

代码语言:javascript
复制
def call(Map params = [:] ) {
...
    deleteFile(params.get('envFile'))
...
}

文件测试/vars/TotoSpec.groovy:

代码语言:javascript
复制
class TotoSpec extends JenkinsPipelineSpecification {

    def toto = null

    def setup() {
        toto = loadPipelineScriptForTest('vars/toto.groovy')
        ...
    }

    def '[toto] test env file'() {
        when:
        toto envFile: 'env.list'

        then:
        ...
        1 * getPipelineMock('deleteFile.call').call('env.list')
    }

}

这个测试过去在我的本地机器和CI从机上都能通过。但是,我不知道为什么,这开始在我的本地机器(但不是在奴隶上)上失败:

代码语言:javascript
复制
java.lang.IllegalStateException: 
There is no pipeline step mock for [deleteFile.call].
        1. Is the name correct?
        2. Does the pipeline step have a descriptor with that name?
        3. Does that step come from a plugin? If so, is that plugin listed as a dependency in your pom.xml?
        4. If not, you may need to call explicitlyMockPipelineStep('deleteFile.call') in your test's setup: block.
        at TotoSpec.[toto] test env file(TotoSpec.groovy:90)

因此,我在我的单元测试上执行了下面的更新,但是我不确定deleteFile是否真的是一个管道步骤,因为它没有body/闭包。

文件测试/vars/TotoSpec.groovy:

代码语言:javascript
复制
class TotoSpec extends JenkinsPipelineSpecification {

    def setup() {
        toto = loadPipelineScriptForTest('vars/toto.groovy')
        explicitlyMockPipelineStep('deleteFile')
        ...
    }

    def '[toto] test env file'() {
        when:
        toto envFile: 'env.list'

        then:
        ...
        1 * getPipelineMock('deleteFile').call('env.list')
    }

}

现在,单元测试在我的本地机器上是正常的,但是在CI从服务器上失败:

代码语言:javascript
复制
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'Mock Generator for [deleteFile]' with class 'com.homeaway.devtools.jenkins.testing.PipelineVariableImpersonator' to class 'groovy.lang.Closure'
    at TotoSpec.setup(TotoSpec.groovy:32)

我错过了什么?

本地配置:

代码语言:javascript
复制
$ java --version
openjdk 14.0.2 2020-07-14
OpenJDK Runtime Environment (build 14.0.2+12-Ubuntu-120.04)
OpenJDK 64-Bit Server VM (build 14.0.2+12-Ubuntu-120.04, mixed mode, sharing)

mvn --version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 14.0.2, vendor: Private Build, runtime: /usr/lib/jvm/java-14-openjdk-amd64
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "4.19.128-microsoft-standard", arch: "amd64", family: "unix"

CI从配置:

代码语言:javascript
复制
$ java --version
openjdk 11.0.6 2020-01-14
OpenJDK Runtime Environment (build 11.0.6+10-post-Debian-1bpo91)
OpenJDK 64-Bit Server VM (build 11.0.6+10-post-Debian-1bpo91, mixed mode)
$ /home/jenkins/tools/hudson.tasks.Maven_MavenInstallation/Maven_3.6.3/apache-maven-3.6.3/bin/mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /home/jenkins/tools/hudson.tasks.Maven_MavenInstallation/Maven_3.6.3/apache-maven-3.6.3
Java version: 11.0.6, vendor: Debian, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: fr_FR, platform encoding: UTF-8
OS name: "linux", version: "4.9.0-14-amd64", arch: "amd64", family: "unix"

pom.xml中的依赖项

代码语言:javascript
复制
 <properties>
        <groovy.core.version>2.4.17</groovy.core.version>
        <groovy.gmaven.pluginVersion>1.6.1</groovy.gmaven.pluginVersion>
        <google.guava.version>20.0</google.guava.version>

        <jenkins-spock.version>2.0.0</jenkins-spock.version>
        <jenkins.version>2.102</jenkins.version>
        <jenkins.servlet.version>3.1.0</jenkins.servlet.version>
        <jenkins.workflow.cps.version>2.36</jenkins.workflow.cps.version>
        <jenkins.workflow.basic.steps.version>2.6</jenkins.workflow.basic.steps.version>
        <jenkins.workflow.durable.task.step.version>2.21</jenkins.workflow.durable.task.step.version>
        <jenkins.workflow.stage.step.version>2.3</jenkins.workflow.stage.step.version>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>

        <junit.version>4.12</junit.version>
        <junit.plugin.version>1.24</junit.plugin.version>
        <surefire.pluginVersion>2.22.0</surefire.pluginVersion>

        <logback.configration>logback-test.xml</logback.configration>
        <logdir>${project.build.directory}/log</logdir>
        <test.loglevel>ERROR</test.loglevel>
        <log.logback.version>1.2.3</log.logback.version>
        <log.slf4j.version>1.7.25</log.slf4j.version>
    </properties>
...
<dependencies>
        <dependency>
            <groupId>com.homeaway.devtools.jenkins</groupId>
            <artifactId>jenkins-spock</artifactId>
            <version>${jenkins-spock.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>${log.logback.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${log.logback.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jenkins-ci.main</groupId>
            <artifactId>jenkins-core</artifactId>
            <version>${jenkins.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jenkins-ci.plugins.workflow</groupId>
            <artifactId>workflow-basic-steps</artifactId>
            <version>${jenkins.workflow.basic.steps.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jenkins-ci.plugins.workflow</groupId>
            <artifactId>workflow-cps</artifactId>
            <version>${jenkins.workflow.cps.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <!-- provides sh() step -->
            <groupId>org.jenkins-ci.plugins.workflow</groupId>
            <artifactId>workflow-durable-task-step</artifactId>
            <version>${jenkins.workflow.durable.task.step.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <!-- provides stage() step -->
            <groupId>org.jenkins-ci.plugins</groupId>
            <artifactId>pipeline-stage-step</artifactId>
            <version>${jenkins.workflow.stage.step.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${jenkins.servlet.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jenkins-ci.plugins</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.plugin.version}</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>${groovy.core.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${log.slf4j.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>log4j-over-slf4j</artifactId>
            <version>${log.slf4j.version}</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
EN

回答 1

Stack Overflow用户

发布于 2021-06-18 07:01:10

再次仔细阅读文档之后,由于deleteFile是自己在vars目录中声明的,因此它被视为管道共享库全局变量。

因此,现在切换到以下单元测试在任何地方都是正确的:

代码语言:javascript
复制
class TotoSpec extends JenkinsPipelineSpecification {

    def setup() {
        toto = loadPipelineScriptForTest('vars/toto.groovy')
        explicitlyMockPipelineVariable('deleteFile')
        ...
    }

    def '[toto] test env file'() {
        when:
        toto envFile: 'env.list'

        then:
        ...
        1 * getPipelineMock('deleteFile.call').call('env.list')
    }
}

但是,目前还不清楚为什么我突然需要在我的机器上使用explicitlyMockPipelineVariable('deleteFile')

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68021405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档