为什么我的Arquillian无人机functiontesting不适用于GitLab CI?

在本地运行良好的testing在gitlab.com的GitLab CI共享运行程序上失败(MCVE在https://gitlab.com/krichter/gitlab-ci-file-creation ,日志在https://gitlab.com/krichter / gitlab-ci-file-creation / – / jobs / 40064276 ),因为在Arquillian webdriver的提取过程中,一个目录不能被创build,或者被Java认为是不存在的(见下面的细节):

Nov 13, 2017 7:31:32 AM org.glassfish.deployment.admin.DeployCommand execute INFO: 664320b4-384a-414a-b0b4-546937428842 was successfully deployed in 7,496 milliseconds. Nov 13, 2017 7:31:33 AM org.arquillian.spacelift.Spacelift$SpaceliftInstance <init> INFO: Initialized Spacelift from defaults, workspace: /builds/krichter/gitlab-ci-file-creation, cache: /root/.spacelift/cache Drone: downloading phantomjs-2.1.1-linux-x86_64.tar.bz2 from https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2 to /root/.arquillian/drone/phantomjs/2.1.1/phantomjs-2.1.1-linux-x86_64.tar.bz2 ................ Nov 13, 2017 7:31:34 AM org.jboss.arquillian.core.impl.ObserverImpl resolveArguments WARNING: Argument 1 for UpdateTestResultBeforeAfter.update is null. It won't be invoked. Nov 13, 2017 7:31:34 AM org.jboss.arquillian.core.impl.ObserverImpl resolveArguments WARNING: Argument 1 for UpdateTestResultBeforeAfter.update is null. It won't be invoked. Nov 13, 2017 7:31:34 AM org.jboss.arquillian.core.impl.ObserverImpl resolveArguments WARNING: Argument 1 for ReusableRemoteWebDriverExtension.destroyLastRemoteWebDriver is null. It won't be invoked. Nov 13, 2017 7:31:35 AM com.sun.enterprise.admin.cli.embeddable.DeployerImpl undeploy INFO: 664320b4-384a-414a-b0b4-546937428842 was successfully undeployed Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 19.022 sec <<< FAILURE! - in richtercloud.gitlab.ci.file.creation.GitLabCIIT testSomething(richtercloud.gitlab.ci.file.creation.GitLabCIIT) Time elapsed: 2.195 sec <<< ERROR! java.lang.IllegalStateException: Something bad happened when Drone was trying to download and prepare a binary. For more information see the cause. at org.jboss.arquillian.drone.webdriver.binary.handler.AbstractBinaryHandler.checkAndSetBinary(AbstractBinaryHandler.java:62) at org.jboss.arquillian.drone.webdriver.factory.PhantomJSDriverFactory.getCapabilities(PhantomJSDriverFactory.java:99) at org.jboss.arquillian.drone.webdriver.factory.PhantomJSDriverFactory.createInstance(PhantomJSDriverFactory.java:72) at org.jboss.arquillian.drone.webdriver.factory.PhantomJSDriverFactory.createInstance(PhantomJSDriverFactory.java:37) at org.jboss.arquillian.drone.webdriver.factory.WebDriverFactory.createInstance(WebDriverFactory.java:127) at org.jboss.arquillian.drone.webdriver.factory.WebDriverFactory.createInstance(WebDriverFactory.java:38) at org.jboss.arquillian.drone.impl.DroneConfigurator$1.createInstance(DroneConfigurator.java:112) at org.jboss.arquillian.drone.impl.CachingCallableImpl.call(CachingCallableImpl.java:44) at org.jboss.arquillian.core.impl.threading.ThreadedExecutorService$ContextualCallable.call(ThreadedExecutorService.java:89) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.IllegalStateException: The phantomJS binary is not present on the expected path target/drone/1c947d57fce2f21ce0b43fe2ed7cd361/phantomjs-2.1.1-linux-x86_64/bin/phantomjs at org.jboss.arquillian.drone.webdriver.binary.handler.PhantomJSDriverBinaryHandler.prepare(PhantomJSDriverBinaryHandler.java:56) at org.jboss.arquillian.drone.webdriver.binary.handler.AbstractBinaryHandler.downloadAndPrepare(AbstractBinaryHandler.java:226) at org.jboss.arquillian.drone.webdriver.binary.handler.AbstractBinaryHandler.downloadAndPrepare(AbstractBinaryHandler.java:208) at org.jboss.arquillian.drone.webdriver.binary.handler.AbstractBinaryHandler.downloadAndPrepare(AbstractBinaryHandler.java:175) at org.jboss.arquillian.drone.webdriver.binary.handler.AbstractBinaryHandler.checkAndSetBinary(AbstractBinaryHandler.java:60) ... 12 more Nov 13, 2017 7:31:36 AM org.jboss.arquillian.core.impl.ObserverImpl resolveArguments WARNING: Argument 1 for SeleniumServerExecutor.stopSeleniumServer is null. It won't be invoked. Nov 13, 2017 7:31:36 AM org.glassfish.admin.mbeanserver.JMXStartupService shutdown INFO: JMXStartupService and JMXConnectors have been shut down. JdbcRuntimeExtension, getAllSystemRAResourcesAndPools = [GlassFishConfigBean.org.glassfish.jdbc.config.JdbcResource, GlassFishConfigBean.org.glassfish.jdbc.config.JdbcResource, GlassFishConfigBean.org.glassfish.jdbc.config.JdbcConnectionPool, GlassFishConfigBean.org.glassfish.jdbc.config.JdbcConnectionPool, GlassFishConfigBean.org.glassfish.jdbc.config.JdbcConnectionPool, GlassFishConfigBean.org.glassfish.jdbc.config.JdbcResource] Nov 13, 2017 7:31:36 AM com.sun.enterprise.v3.server.AppServerStartup stop INFO: Shutdown procedure finished 

我在用着

 <dependencies> [...] <dependency> <groupId>org.jboss.shrinkwrap.descriptors</groupId> <artifactId>shrinkwrap-descriptors-api-javaee</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.jboss.arquillian.junit</groupId> <artifactId>arquillian-junit-container</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.jboss.shrinkwrap.resolver</groupId> <artifactId>shrinkwrap-resolver-depchain</artifactId> <type>pom</type> <scope>test</scope> </dependency> <dependency> <groupId>org.jboss.arquillian.graphene</groupId> <artifactId>graphene-webdriver</artifactId> <version>2.2.0</version> <type>pom</type> <scope>test</scope> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>htmlunit-driver</artifactId> </dependency> <dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>htmlunit</artifactId> <version>2.24</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-firefox-driver</artifactId> </dependency> <!-- <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>20.0</version> </dependency>--> <dependency> <groupId>ru.yandex.qatools.ashot</groupId> <artifactId>ashot</artifactId> <version>1.5.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.2</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.jboss.arquillian</groupId> <artifactId>arquillian-bom</artifactId> <version>1.1.13.Final</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.jboss.arquillian.selenium</groupId> <artifactId>selenium-bom</artifactId> <version>3.7.0</version> <!-- - 3.3.1, 3.2.0 and 3.1.0 cause required: java.util.function.Function<? super org.openqa.selenium.WebDriver,V> found: org.openqa.selenium.support.ui.ExpectedCondition<org.openqa.selenium.WebElement> reason: cannot infer type-variable(s) V (argument mismatch; org.openqa.selenium.support.ui.ExpectedCondition<org.openqa.selenium.WebElement> cannot be converted to java.util.function.Function<? super org.openqa.selenium.WebDriver,V>) - 3.0.1 causes java.lang.IllegalAccessError: tried to access class org.openqa.selenium.os.ExecutableFinder from class org.openqa.selenium.phantomjs.PhantomJSDriverService when using phantomjs driver - 3.6.0 causes `Unrecognized platform: linux-unknown-64bit` which one is supposed to work around using 3.5.3 <ref>https://github.com/SeleniumHQ/selenium/issues/4781</ref>--> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.jboss.arquillian.extension</groupId> <artifactId>arquillian-drone-bom</artifactId> <version>2.1.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <profiles> <profile> <id>arquillian-glassfish-embedded</id> <activation> <activeByDefault>true</activeByDefault> </activation> <dependencies> <dependency> <groupId>org.jboss.arquillian.container</groupId> <artifactId>arquillian-glassfish-embedded-3.1</artifactId> <version>1.0.1</version> </dependency> <dependency> <groupId>fish.payara.extras</groupId> <artifactId>payara-embedded-all</artifactId> <version>4.1.2.174-SNAPSHOT</version> <!-- - 4.1.2.173 causes `java.lang.NoClassDefFoundError: fish/payara/nucleus/healthcheck/stuck/StuckThreadsStore` - 4.1.2.172 causes `Caused by: java.lang.ClassNotFoundException: fish.payara.notification.eventbus.EventbusMessage` --> <scope>test</scope> </dependency> </dependencies> <build> <testResources> <testResource> <directory>src/test/resources</directory> </testResource> <testResource> <directory>src/test/resources-glassfish-embedded</directory> </testResource> </testResources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.12</version> <configuration> </configuration> </plugin> </plugins> </build> </profile> </profiles> 

并激活了configuration文件。

我从http://phantomjs.org/download.html下载,提取并调查了phantomjs-2.1.1-linux-x86_64.tar.bz2 ,并validation了phantomjs-2.1.1-linux-x86_64/examples/colorwheel.js存在在里面。 Arquillian Drone Webdriver使用MD5总和1c947d57fce2f21ce0b43fe2ed7cd361作为与下载的.tar.bz2相匹配的目标目录。

这个错误位于Arquillian Spacelift中,Arquillian Drone使用它来提取phantomjs驱动程序,并且从堆栈跟踪中无法看到,因为Spacelift忽略目录创build失败(请参阅https://github.com/arquillian/arquillian-spacelift / pull / 34的细节和build议的修复,你可以通过指定使用

 - git clone --branch file_utils_mkdir https://github.com/krichter722/arquillian-spacelift.git && cd arquillian-spacelift && mvn --batch-mode install && cd .. 

.gitlab-ci.ymlmain工作中,并将POM中的Spacelift依赖从1.0.2更改为1.0.3-SNAPSHOT。

像上面描述的那样改变Spacelift源代码,添加显式的目录创build和触摸语句,甚至使用Java内部的Python来确保目录是用

 int pythonDebugReturncode = Runtime.getRuntime().exec(new String[] {"python3", "-c", String.format("'import os;os.makedirs(\"%s\");'", file.getParentFile().getAbsoluteFile().getAbsolutePath())}).waitFor(); System.out.println("pythonDebugReturncode: "+pythonDebugReturncode); pythonDebugReturncode = Runtime.getRuntime().exec(new String[] {"python3", "-c", String.format("'from pathlib import Path;Path(\"%s\").touch();'", file.getAbsoluteFile().getAbsolutePath())}).waitFor(); System.out.println("pythonDebugReturncode: "+pythonDebugReturncode); 

导致0被打印为返回码,但目录使用相对path在Java代码中失败。

我尝试了docker图像的ubuntu:xenialubuntu:trustyubuntu:artfuldebian:siddebian:buster 。 Afaik只能将基于Linux的系统用作docker图像。 我没有希望通过testing更多的图像来获得更多的洞察力。

我体验

 java.net.UnknownHostException: runner-3bd5f424-project-4630314-concurrent-0: runner-3bd5f424-project-4630314-concurrent-0: Temporary failure in name resolution at java.net.InetAddress.getLocalHost(InetAddress.java:1505) 

但我认为这是没有关系的问题,因为没有涉及networking文件系统,并且由于构build以root用户身份运行,没有使用权限获取期间的名称parsing。

Arquillian Spacelift或Arquillian Drone Webdriver无法解决在Maven在聚合器项目根目录和Maven基础版本中始终如一地启动Maven的工作目录。 我通过https://issues.jboss.org/browse/ARQ-2154报告了这一点&#x3002;

这意味着必须将正常运行的mvn install拆分为-DskipTests=true -DskipITs=true ,然后将目录更改为子模块目录并运行mvn verify

Interesting Posts