我有 Java 项目,我用 GraalVM native-image 编译为可执行二进制文件。我想用 Travis CI 为项目配置持续集成过程,这对我来说很有趣 - Travis CI 允许这样做吗?如何配置 .travis.yml 文件以使用 GraalVM 原生映像进行构建?
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:直接在 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,我们使用gu
util 安装命令和 SDKMAN 再次安装 Maven。现在,您可以在本地和 CloudCI 系统(如 TravisCI)上编译 GraalVM 原生映像。
请注意一个提示:本机映像编译非常消耗内存。如果您需要使用该选项,您应该使用 Travis 构建的 RAM参数来--no-server
限制内存使用,否则您的构建可能会因错误或类似错误而失败。-J-Xmx4G
4GB
Error: Image build request failed with exit status 137
下一个合乎逻辑的步骤是将生成的 Docker 映像推送到某种 Docker 注册表,并可能在某些 Cloud PaaS 中运行容器。如果您需要更多信息,请在此处查看此完全易懂的指南。Dockerfile
在这个示例项目中还有一个完全工作的 Docker 多阶段构建的示例: https ://github.com/jonashackt/spring-boot-graalvm/blob/master/Dockerfile