¿Por qué Maven Surefire 3 no puede ejecutar mi prueba de Pepino en Jenkins con Docker?

Tengo un proyecto Java con algunas pruebas de Cucumber y algunas pruebas regulares de JUnit, administradas por Maven.

Quiero ejecutar las pruebas en Jenkins, usando Docker, así que escribí esto 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'
                }
            }
        }
    }
}

Cuando ejecuto la compilación, las pruebas regulares pasan pero las pruebas de Cucumber fallan con:

Mensaje de error

URI tiene un componente de consulta

Stacktrace

java.lang.IllegalArgumentException: URI tiene un componente de consulta

No es hasta que lo desactive trimStackTracepara maven-surefire-pluginque también obtenga los detalles:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <trimStackTrace>false</trimStackTrace>
    </configuration>
</plugin>
java.lang.IllegalArgumentException: URI has a query component
    at java.base/java.io.File.<init>(File.java:427)
    at cucumber.runtime.io.ZipResourceIterator.<init>(ZipResourceIterator.java:22)
    at cucumber.runtime.io.ZipResourceIteratorFactory.createIterator(ZipResourceIteratorFactory.java:24)
    at cucumber.runtime.io.ZipThenFileResourceIteratorFactory.createIterator(ZipThenFileResourceIteratorFactory.java:22)
    at cucumber.runtime.io.DelegatingResourceIteratorFactory.createIterator(DelegatingResourceIteratorFactory.java:49)
    at cucumber.runtime.io.ClasspathResourceIterable.iterator(ClasspathResourceIterable.java:35)
    at cucumber.runtime.io.ResourceLoaderClassFinder.getDescendants(ResourceLoaderClassFinder.java:25)
    at cucumber.runtime.Reflections.instantiateSubclasses(Reflections.java:34)
    at cucumber.runtime.BackendModuleBackendSupplier.loadBackends(BackendModuleBackendSupplier.java:52)
    at cucumber.runtime.BackendModuleBackendSupplier.get(BackendModuleBackendSupplier.java:39)
    at cucumber.runner.ThreadLocalRunnerSupplier.createRunner(ThreadLocalRunnerSupplier.java:42)
    at cucumber.runner.ThreadLocalRunnerSupplier.access$000(ThreadLocalRunnerSupplier.java:13)
    at cucumber.runner.ThreadLocalRunnerSupplier$1.initialValue(ThreadLocalRunnerSupplier.java:22)
    at cucumber.runner.ThreadLocalRunnerSupplier$1.initialValue(ThreadLocalRunnerSupplier.java:19)
    at java.base/java.lang.ThreadLocal.setInitialValue(ThreadLocal.java:195)
    at java.base/java.lang.ThreadLocal.get(ThreadLocal.java:172)
    at cucumber.runner.ThreadLocalRunnerSupplier.get(ThreadLocalRunnerSupplier.java:38)
    at cucumber.api.junit.Cucumber$RunCucumber.evaluate(Cucumber.java:146)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:365)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:273)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:238)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:159)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:384)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:345)
    at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:126)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:418)

Esto es bastante desconcertante porque:

  • cuando se ejecuta mvn verifylocalmente, funciona
  • cuando se usa agent anyenDockerfile , en lugar de la imagen de Docker maven, funciona
  • cuando usa la maven-surefire-pluginversión en 2.22.2lugar de 3.0.0-M3, funciona

Me conecté como Jenkins y busqué en el espacio de trabajo:

$ sudo su - jenkins

$ ls /var/lib/jenkins/workspace/question-mark-dir_master
'?'   Jenkinsfile   LICENSE   pom.xml   README.md   src   target

Hay un ?directorio de signo de interrogación ( ) allí, y contiene el .m2directorio, con todos los artefactos necesarios para el proyecto. Sospecho que esta podría ser la causa de la excepción, porque hay signos de interrogación en el classpath, y los signos de interrogación son los que introducen el componente de consulta de los URI.

Por el momento, puedo cambiar a la maven-surefire-pluginversión anterior 2.22.2como una solución alternativa. Pero, ¿cuál es el problema real aquí?

  • ¿Podría ser un error en el nuevo maven-surefire-plugin? A juzgar por el seguimiento de la pila, no apostaría por eso.
  • ¿Es un problema en Jenkins o en la imagen del acoplador Maven (¿cuál?), Que hace que un directorio tenga un nombre tan desafortunado?
  • ¿Estoy haciendo algo mal?

Si quieres probar esto, tengo un MVCE . En mi instalación local de Jenkins, creé un nuevo proyecto del tipo "Multibranch Pipeline" y en "Branch Sources" agregué como repositorio del proyecto git mi proyecto git local. No hay otros cambios.

captura de pantalla

Respuesta 1

He estado escribiendo un videojuego basado en texto en Java (soy nuevo en Java, por cierto), y no tiene el rendimiento que esperaba, específicamente el habla. Quiero que el texto aparezca como si la persona ...

No se puede establecer la matriz dentro de JSONObject de acuerdo con la respuesta. A continuación se muestra mi código en el que no puedo configurar la matriz en jsonobject. Cómo enviar un valor clave para la matriz dentro de mi jsonobject para el que compartió ...

Tengo un panel 9x9, que es panel1 [] [] cada panel tiene un JLabel, así que label1 [] [] y agrego cada etiqueta al panel en el bucle for: for (int y = 0; y <9; y ++) {para (int x = 0; x <9; x ++) {...

Estoy enfrentando un problema con el controlador jdbc de SAS que no había visto antes, y me preguntaba cuál sería el comportamiento correcto de JDBC. Supongamos que tengo algunos ResultSetMetaData: metadata.getColumnName (index) -> ...