1

我有 Java 项目,我用 GraalVM native-image 编译为可执行二进制文件。我想用 Travis CI 为项目配置持续集成过程,这对我来说很有趣 - Travis CI 允许这样做吗?如何配置 .travis.yml 文件以使用 GraalVM 原生映像进行构建?

4

2 回答 2

2

我能够使用来自Bach.java - Java Shell Builder的install-jdk.sh在 Travis CI 构建中配置本机映像 GraalVM 编译。这是.travis-ci.yml

sudo: false
language: java

cache:
  directories:
    - $HOME/.m2

before_install:
- wget https://github.com/sormuras/bach/raw/master/install-jdk.sh

matrix:
  include:
  # GraalVM
    - env: JDK='GraalVM 19'
      install: . ./install-jdk.sh --url "https://github.com/oracle/graal/releases/download/vm-19.2.0/graalvm-ce-linux-amd64-19.2.0.tar.gz"

script:
  - mvn package -Pnative -Dnative-image.docker-build=true
于 2019-10-21T15:23:30.323 回答
1

选项 1:直接在 Travis CI 主机上进行原生镜像编译的 GraalVM

在 TravisCI 上安装 GraalVM(包括 Native Image)的第一个选项:只需使用SDKMAN.travis.yml看起来像这样:

language: minimal

install:
  # Install GraalVM with SDKMAN
  - curl -s "https://get.sdkman.io" | bash
  - source "$HOME/.sdkman/bin/sdkman-init.sh"
  - sdk install java 20.0.0.r11-grl

  # Check if GraalVM was installed successfully
  - java -version

  # Install Maven, that uses GraalVM for later builds
  - sdk install maven

  # Show Maven using GraalVM JDK
  - mvn --version

  # Install GraalVM Native Image
  - gu install native-image

  # Check if Native Image was installed properly
  - native-image --version

script:
  # Run GraalVM Native Image compilation
  - native-image \
    --no-server \
    --no-fallback \
    -H:+TraceClassInitialization \
    -H:Name=yourArtifactNameHere \
    -H:+ReportExceptionStackTraces \
    -DremoveUnusedAutoconfig=true \
    -DremoveYamlSupport=true \
    -cp yourClassPathHere yourMainClassHere;

这里有一个要注意的关键点:不要单独使用 alanguage: java或默认的 linux 发行版dist: bionic,因为它们附带预安装的 Maven 版本 - 配置为使用预安装的 OpenJDK。但是大多数人会需要 Maven 来使用我们 SDKMAN 安装的 GraalVM 来正确编译我们的 Java 项目。因此,我们只需使用language: minimal,这是一种基于基本 Travis 构建环境而无需预安装 JDK 或 Maven 的 Travis 构建的简单方法。为了验证这一点,我们运行一个mvn --version,它应该在我们的 Travis 构建中显示如下内容:

$ mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /home/travis/.sdkman/candidates/maven/current
Java version: 11.0.6, vendor: Oracle Corporation, runtime: /home/travis/.sdkman/candidates/java/20.0.0.r11-grl
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.15.0-1028-gcp", arch: "amd64", family: "unix"

该部分中的native-image命令在此处仅用作占位符,因为根据您的用例,您可能具有完全不同的参数。script

就我而言,我想编译一个 Spring Boot 应用程序,所以我还创建了一个 100% 可理解的示例项目spring-boot-graalvm,您还可以在其中查看 TravisCI 构建,它安装 GraalVM 并进行本机映像编译:https ://travis-ci.org/jonashackt/spring-boot-graalvm

============================================

选项 2:使用 TravisCI docker 服务在 Docker 中进行原生镜像编译的 GraalVM

也许您已经习惯于在 Docker 容器中构建 Java 应用程序——那么 GraalVM 原生镜像编译也不例外。使用TravisCI docker 服务.travis.yml变得相当简单:

dist: bionic
language: minimal

services:
  - docker

script:
  - docker build . --tag=spring-boot-graal

关键部分是你的Dockerfile现在(参见这个完整的例子,利用 Docker 多阶段构建) - 以及优于选项 1 的优势:你可以在你的机器上本地测试它。这是一个例子Dockerfile

FROM oracle/graalvm-ce:20.1.0-java11

MAINTAINER Jonas Hecht

ADD . /build
WORKDIR /build

# For SDKMAN to work we need unzip & zip
RUN yum install -y unzip zip

RUN \
    # Install SDKMAN
    curl -s "https://get.sdkman.io" | bash; \
    source "$HOME/.sdkman/bin/sdkman-init.sh"; \
    sdk install maven; \
    # Install GraalVM Native Image
    gu install native-image;

RUN source "$HOME/.sdkman/bin/sdkman-init.sh" && mvn --version

RUN native-image --version

RUN source "$HOME/.sdkman/bin/sdkman-init.sh" && native-image \
    --no-server -J-Xmx4G \
    --no-fallback \
    -H:+TraceClassInitialization \
    -H:Name=yourArtifactNameHere \
    -H:+ReportExceptionStackTraces \
    -DremoveUnusedAutoconfig=true \
    -DremoveYamlSupport=true \
    -cp yourClassPathHere yourMainClassHere;

我们在这里使用oracle/graalvm-ce:20.1.0-java11来自 DockerHub的官方 Oracle GraalVM 映像,网址为https://hub.docker.com/r/oracle/graalvm-ce/。由于缺少native-image命令和 Maven,我们使用guutil 安装命令和 SDKMAN 再次安装 Maven。现在,您可以在本地和 CloudCI 系统(如 TravisCI)上编译 GraalVM 原生映像。

请注意一个提示:本机映像编译非常消耗内存。如果您需要使用该选项,您应该使用 Travis 构建的 RAM参数来--no-server限制内存使用,否则您的构建可能会因错误或类似错误而失败。-J-Xmx4G4GBError: Image build request failed with exit status 137

下一个合乎逻辑的步骤是将生成的 Docker 映像推送到某种 Docker 注册表,并可能在某些 Cloud PaaS 中运行容器。如果您需要更多信息,请在此处查看此完全易懂的指南Dockerfile在这个示例项目中还有一个完全工作的 Docker 多阶段构建的示例: https ://github.com/jonashackt/spring-boot-graalvm/blob/master/Dockerfile

于 2020-04-16T16:13:22.570 回答