Travis CI中具有本机图像编译功能的GraalVM

时间:2019-10-19 16:42:03

标签: java continuous-integration travis-ci graalvm graalvm-native-image

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

选项1:直接在Travis CI主机上具有本地图像编译功能的GraalVM

在TravisCI上安装GraalVM(包括本地映像)的第一个选项:只需使用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;

这里需要注意一个关键点:不要单独使用language: java或像dist: bionic这样的默认Linux发行版!,因为它们是预装的Maven附带的版本-配置为使用预装的OpenJDK。但是大多数人将需要Maven使用我们安装的SDKMAN安装的GraalVM来稍后正确地编译我们的Java项目。因此,我们仅使用a simple way of getting our Travis builds based on a basic Travis build environment without pre-installed JDKs or Maven language: minimal。为了验证这一点,我们运行了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 App,所以我还创建了一个100%可理解的示例项目spring-boot-graalvm,在这里您还可以查看TravisCI构建,该构建安装了GraalVM并执行了本机图像编译:https://travis-ci.org/jonashackt/spring-boot-graalvm

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

选项2:使用TravisCI泊坞服务在Docker中具有本地映像编译功能的GraalVM

也许您已经习惯在Docker容器中构建Java应用程序-那么GraalVM本机映像编译也不例外。使用the TravisCI docker service.travis.yml变得相当简单:

dist: bionic
language: minimal

services:
  - docker

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

关键部分是您现在的Dockerfilesee this full example, leveraging Docker multi-stage builds)-和方法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;

我们在这里https://hub.docker.com/r/oracle/graalvm-ce/使用来自DockerHub的官方Oracle GraalVM映像oracle/graalvm-ce:20.1.0-java11。由于缺少native-image命令和Maven,因此我们使用gu util来安装命令,并再次使用SDKMAN来安装Maven。现在,您可以在本地或在TraCICI之类的CloudCI系统上编译GraalVM本机映像。

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

下一步是将生成的Docker映像推送到某种Docker注册表中,并可能在某些Cloud PaaS中运行该容器。如果您需要更多信息,请have a look at this fully comprehesible guide here。在此示例项目中,还存在一个示例,该示例启用了Dockerfile的完全工作的Docker多阶段构建:https://github.com/jonashackt/spring-boot-graalvm/blob/master/Dockerfile