У меня есть проект Java, который я компилирую с помощью собственного образа GraalVM в исполняемый двоичный файл. Я хотел бы настроить процесс непрерывной интеграции проекта с Travis CI, и мне это интересно - позволяет ли это Travis CI? Как я могу настроить файл .travis.yml для сборки с использованием собственного образа GraalVM?
GraalVM с компиляцией собственных образов в Travis CI
Ответы (2)
Мне удалось настроить компиляцию GraalVM в собственном образе в сборках Travis CI, используя install-jdk.sh из Bach.java - Java Shell Builder. Вот файл .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
gu install native-image
, есть идеи, почему? См. travis-ci.org/anthonyrichir/jhipster-registry-operator/builds /
- person Anthony Richir; 11.11.2019
Вариант 1. GraalVM с компиляцией собственных образов непосредственно на хосте Travis CI
Первый вариант установки GraalVM (включая собственный образ) на TravisCI: просто используйте 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
или дистрибутивы Linux по умолчанию, такие как dist: bionic
!, потому что они поставляются с предустановленными версиями Maven, которые настроены на использование предустановленных OpenJDK. Но большинству людей понадобится Maven, чтобы использовать наш SDKMAN, установленный GraalVM, для правильной компиляции наших проектов Java позже. Поэтому мы просто используем language: minimal
, который является простым способом получения наших сборок Travis на основе базовой среды сборки Travis без предустановленных JDK или Maven. Чтобы проверить это, мы запускаем 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: GraalVM с компиляцией собственных образов в Docker с помощью службы Docker TravisCI
Возможно, вы уже привыкли создавать свои Java-приложения внутри контейнеров Docker - тогда компиляция собственных образов GraalVM не станет исключением. Используя службу Docker TravisCI, .travis.yml
становится довольно просто:
dist: bionic
language: minimal
services:
- docker
script:
- docker build . --tag=spring-boot-graal
Важнейшей частью является ваш Dockerfile
сейчас (см. Этот полный пример, используя 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;
Мы используем официальный образ Oracle GraalVM oracle/graalvm-ce:20.1.0-java11
из DockerHub по адресу https://hub.docker.com/r/oracle/graalvm-ce/ здесь. Поскольку здесь отсутствует команда native-image
и Maven, мы используем gu
util для установки команды и снова SDKMAN для установки Maven. Теперь вы можете компилировать собственные образы GraalVM как локально, так и в системах CloudCI, таких как TravisCI.
Напоминаем один намек: компиляция изображений в собственном коде требует довольно большого количества памяти. Если вам нужно использовать параметр --no-server
, вы должны ограничить использование памяти параметром -J-Xmx4G
до 4GB
ОЗУ для сборок Travis, так как в противном случае ваши сборки могут завершиться с ошибками Error: Image build request failed with exit status 137
или аналогичными.
Следующим логическим шагом было бы отправить полученный образ Docker в какой-то реестр Docker и, возможно, запустить контейнер в каком-нибудь Cloud PaaS. Если вам нужна дополнительная информация, взгляните на это полностью понятное руководство здесь. В этом примере проекта также есть пример полностью работающей многоступенчатой сборки Docker с включенной Dockerfile
: https://github.com/jonashackt/spring-boot-graalvm/blob/master/Dockerfile