在 lein deps 期间,使用 OpenJDK 9 在 Travis CI 上的 Clojure 构建失败

Clojure build failed on Travis CI with OpenJDK 9 during lein deps

背景

我有一个简单的 Clojure 1.9 project

配置了最小的 .travis.yml

language: clojure
lein: 2.8.1

jdk:
- openjdk8
- openjdk9
- oraclejdk8
- oraclejdk9

特拉维斯CI

OpenJDK 8、OracleJDK 8 和 OracleJDK 9 的构建成功。但是,OpenJDK 9 在 lein deps 阶段失败了。

无法从 Clojars 中检索到五个工件。它们是 clojure-completeclj-httppedestal.servicepedestal.jettypedestal.service-tools

好像是证书相关的一些问题。我在下面包含了一些日志。

Could not find artifact clojure-complete:clojure-complete:jar:0.2.4 in central (https://repo1.maven.org/maven2/)
Could not transfer artifact clojure-complete:clojure-complete:jar:0.2.4 from/to clojars (https://repo.clojars.org/): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
...
Could not transfer artifact clojure-complete:clojure-complete:pom:0.2.4 from/to clojars (https://repo.clojars.org/): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
...
This could be due to a typo in :dependencies, file system permissions, or network issues.
If you are behind a proxy, try setting the 'http_proxy' environment variable.

问题

  1. 为什么它只发生在 OpenJDK9 构建中?
  2. 这是 Travis CI 还是我的配置的错误?
  3. 我该如何解决?

谢谢!

抱歉,这没有回答您的具体问题,只是想提一下,看起来您并不是唯一遇到此问题的人:https://github.com/travis-ci/travis-ci/issues/9368#issuecomment-395218865

Travis CI 问题跟踪器[1] 和 clojurians Slack 中进行了讨论。

原因是 OpenJDK 9 没有附带签署 Clojars 证书的证书。

Christian Stein 提到 Travis CI 将始终提供未打补丁的 JDK 安装。如有必要,用户将需要符号链接系统 CA 证书 (Original words)。

解决方案

这是更新后的最小 Travis CI 配置。

它涉及在 before_install 阶段手动符号链接系统 CA 证书。

language: clojure
lein: 2.8.1

jdk:
  - openjdk8
  - oraclejdk8
  - oraclejdk9

matrix:
  include:
    - jdk: openjdk9
      before_install:
        - rm "${JAVA_HOME}/lib/security/cacerts"
        - ln -s /etc/ssl/certs/java/cacerts "${JAVA_HOME}/lib/security/cacerts"

其他解决方案

或者,您也可以使用自定义矩阵进行 JDK 安装。

开放更新JDK 10 和 11

所有 OpenJDK 版本随 Travis jdk_install.sh 安装 修补证书。因此,对于 OpenJDK 10 和 11,您也会遇到同样的问题。

您可以减少那些具有巧妙放置的 YAML 锚点的 SDK 版本的样板,如下例所示。

matrix:
  include:
- jdk: openjdk9
  before_install: &fix_certs
    - rm "${JAVA_HOME}/lib/security/cacerts"
    - ln -s /etc/ssl/certs/java/cacerts "${JAVA_HOME}/lib/security/cacerts"
- jdk: openjdk10
  before_install: *fix_certs
- jdk: openjdk11
  before_install: *fix_certs