为什么 Maven Surefire 3 无法使用 Docker 在 Jenkins 中运行我的

我有一个由 Maven 管理的带有一些 Cucumber 测试和一些常规 JUnit 测试的 Java 项目。


我想使用 Docker 在 Jenkins 中运行测试,所以我写了这个Jenkinsfile:


pipeline {

    agent {

        docker {

            image 'maven:3.6.1'

        }

    }

    stages {

        stage('build') {

            steps {

                sh 'mvn clean verify -Dmaven.test.failure.ignore=true'

            }

            post {

                success {

                    junit 'target/surefire-reports/**/*.xml'

                }

            }

        }

    }

}

当我运行构建时,常规测试通过但 Cucumber 测试失败:


错误信息


URI 有一个查询组件


堆栈跟踪


java.lang.IllegalArgumentException:URI 有一个查询组件


直到我禁用它trimStackTrace,maven-surefire-plugin我才得到详细信息:

<plugin>

    <groupId>org.apache.maven.plugins</groupId>

    <artifactId>maven-surefire-plugin</artifactId>

    <configuration>

        <trimStackTrace>false</trimStackTrace>

    </configuration>

</plugin>

这很令人费解,因为:


mvn verify在本地运行时,它可以工作

在 中使用agent any时Dockerfile,而不是 maven Docker 映像,它可以工作

当使用maven-surefire-pluginversion2.22.2而不是 时3.0.0-M3,它可以工作

我以 Jenkins 身份登录并查看了工作区:


$ sudo su - jenkins


$ ls /var/lib/jenkins/workspace/question-mark-dir_master

'?'   Jenkinsfile   LICENSE   pom.xml   README.md   src   target

那里有一个问号 ( ?) 目录,它包含该.m2目录以及项目所需的所有工件。我怀疑这可能是异常的原因,因为类路径中有问号,而问号是引入 URI 查询组件的。


目前我可以降级到maven-surefire-plugin版本2.22.2作为一种解决方法。但这里的实际问题是什么?


会不会是新的bug maven-surefire-plugin?从堆栈跟踪来看,我不会打赌。

是 Jenkins 还是 Maven docker 映像(哪个?)中的问题,导致目录具有如此不幸的名称?

难道我做错了什么?

如果你想试试这个,我有一个 MVCE。在我的本地 Jenkins 安装中,我创建了一个类型为“Multibranch Pipeline”的新项目,并在“Branch Sources”中添加了我的本地 git 项目作为 git 项目存储库。没有其他变化。


MM们
浏览 98回答 1
1回答

白猪掌柜的

通过将 TYY对问题的评论和maven docker image 的文档结合起来,我能够以Jenkinsfile一种避免创建问号目录的方式进行配置。我们需要通知 Maven 用户的主目录,并将其映射到容器外的目录。pipeline {&nbsp; &nbsp; agent {&nbsp; &nbsp; &nbsp; &nbsp; docker {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; image 'maven:3.6.1'&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; args '-v /var/lib/jenkins:/usr/src/mymaven -w /usr/src/mymaven'&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; stages {&nbsp; &nbsp; &nbsp; &nbsp; stage('build') {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; steps {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sh 'MAVEN_OPTS="-Duser.home=/usr/src/mymaven" mvn clean verify -Dmaven.test.failure.ignore=true'&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // ...&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}-v /var/lib/jenkins:/usr/src/mymaven/var/lib/jenkins将主机上的目录映射到/usr/src/mymaven容器内的目录-w /usr/src/mymaven设置容器内的工作目录MAVEN_OPTS="-Duser.home=/usr/src/mymaven"为 Maven设置user.homeJava 属性在 MCVE的一个分支上证明它有效。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java