OpenJDK9 (Docker), gradle 4.2.1, GitLab

Posted

技术标签:

【中文标题】OpenJDK9 (Docker), gradle 4.2.1, GitLab【英文标题】: 【发布时间】:2018-03-26 05:54:57 【问题描述】:

我的项目使用 graddlew 4.2.1 在本地构建。但是当我 git push 到 GitLab 时,我得到了下面的错误。 我必须使用 Docker,所以我不知道我可以使用什么 Docker Image 来实现这一点。这也是 gitlab-ci.yml:

# This file is a template, and might need editing before it works on your project.
# This template uses the java:8 docker image because there isn't any
# official Gradle image at this moment
#
# This is the Gradle build system for JVM applications
# https://gradle.org/
# https://github.com/gradle/gradle
image: openjdk:9-jdk

# Disable the Gradle daemon for Continuous Integration servers as correctness
# is usually a priority over speed in CI environments. Using a fresh
# runtime for each build is more reliable since the runtime is completely
# isolated from any previous builds.
variables:
    GRADLE_OPTS: "-Dorg.gradle.daemon=false"

# Make the gradle wrapper executable. This essentially downloads a copy of
# Gradle to build the project with.
# https://docs.gradle.org/current/userguide/gradle_wrapper.html
# It is expected that any modern gradle project has a wrapper
before_script:
    - chmod +x gradlew

# We redirect the gradle user home using -g so that it caches the
# wrapper and dependencies.
# https://docs.gradle.org/current/userguide/gradle_command_line.html
#
# Unfortunately it also caches the build output so
# cleaning removes reminants of any cached builds.
# The assemble task actually builds the project.
# If it fails here, the tests can't run.
build:
  stage: build
  script:
    - ./gradlew -g /cache/.gradle clean assemble
  allow_failure: false
  artifacts:
    name: "AudioBot"
    paths:
      - build/libs/*.jar

这里的错误:

线程“主”javax.net.ssl.SSLException 中的异常: java.lang.RuntimeException:意外错误: java.security.InvalidAlgorithmParameterException:trustAnchors 参数必须为非空 java.base/sun.security.ssl.Alerts.getSSLException(Alerts.java:214) 在 java.base/sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1969) 在 java.base/sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1921) 在 java.base/sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1904) 在 java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1436) 在 java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413) 在 java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:567) 在 java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) 在 java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1563) 在 java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1491) 在 java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:236) 在 org.gradle.wrapper.Download.downloadInternal(Download.java:66) 在 org.gradle.wrapper.Download.download(Download.java:51) 在 org.gradle.wrapper.Install$1.call(Install.java:62) 在 org.gradle.wrapper.Install$1.call(Install.java:48) 在 org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:69) 在 org.gradle.wrapper.Install.createDist(Install.java:48) 在 org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:107) 在 org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61) 引起:java.lang.RuntimeException:意外错误: java.security.InvalidAlgorithmParameterException:trustAnchors 参数必须为非空 java.base/sun.security.validator.PKIXValidator.(PKIXValidator.java:89) 在 java.base/sun.security.validator.Validator.getInstance(Validator.java:181) 在 java.base/sun.security.ssl.X509TrustManagerImpl.getValidator(X509TrustManagerImpl.java:330) 在 java.base/sun.security.ssl.X509TrustManagerImpl.checkTrustedInit(X509TrustManagerImpl.java:180) 在 java.base/sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:192) 在 java.base/sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:133) 在 java.base/sun.security.ssl.ClientHandshaker.checkServerCerts(ClientHandshaker.java:1825) 在 java.base/sun.security.ssl.ClientHandshaker.certificateStatus(ClientHandshaker.java:1676) 在 java.base/sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:272) 在 java.base/sun.security.ssl.Handshaker.processLoop(Handshaker.java:1086) 在 java.base/sun.security.ssl.Handshaker.processRecord(Handshaker.java:1020) 在 java.base/sun.security.ssl.SSLSocketImpl.processInputRecord(SSLSocketImpl.java:1137) 在 java.base/sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1074) 在 java.base/sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973) 在 java.base/sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1402) 在 java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1429) ... 14 更多原因: java.security.InvalidAlgorithmParameterException:trustAnchors 参数必须为非空 java.base/java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:200) 在 java.base/java.security.cert.PKIXParameters.(PKIXParameters.java:120) 在 java.base/java.security.cert.PKIXBuilderParameters.(PKIXBuilderParameters.java:104) 在 java.base/sun.security.validator.PKIXValidator.(PKIXValidator.java:86) ... 29 更多错误:作业失败:退出代码 1

【问题讨论】:

Error - trustAnchors parameter must be non-empty的可能重复 好的,但是我正在使用 Docker。是不是有 Docker 镜像可以提供 graddlew 和 java9 所需的证书? 构建工具叫gradle,不是graddle 【参考方案1】:

这可能是 Debian 在 Docker 映像中的一个错误。我认为他们正在努力:https://github.com/docker-library/openjdk/issues/145

要立即解决此问题,您可以使用 jdk-9-slim 图像。只需添加 -slim。

【讨论】:

【参考方案2】:

为了测试,你可以在docker-library/openjdk的基础上做一个。

请参阅docker-library/openjdk issue 19ca-certificates-java.postinst configure 应该在 PR 111 之后就存在,但如果“Error - trustAnchors parameter must be non-empty”中提到了另一种方法,您可以在自定义图像中对其进行测试。

请注意,moby/moby issue 18180 曾经影响过ca-certificates-java.postinst configure,但现在应该可以了。

【讨论】:

尝试添加命令来更新证书,但这没有帮助:paste.ubuntu.com/25737403 仍然相同。还有其他想法吗? :) 这里有一个错误报告:github.com/docker-library/openjdk/issues/145 谢谢你的帮助! :)

以上是关于OpenJDK9 (Docker), gradle 4.2.1, GitLab的主要内容,如果未能解决你的问题,请参考以下文章

uninstall OpenJDK9

Build OpenJDK9 on macOS Sierra

Gradle项目构建docker镜像(支持Gradle多模块)

Shell脚本自动编译打包Gradle项目并docker部署

Docker 中缓慢的 gradle 构建。缓存 gradle 构建

用于执行 gradle bootBuildImage 命令的 Docker 映像