GraalVM с компиляцией собственных образов в Travis CI

У меня есть проект Java, который я компилирую с помощью собственного образа GraalVM в исполняемый двоичный файл. Я хотел бы настроить процесс непрерывной интеграции проекта с Travis CI, и мне это интересно - позволяет ли это Travis CI? Как я могу настроить файл .travis.yml для сборки с использованием собственного образа GraalVM?


person Gleb    schedule 19.10.2019    source источник


Ответы (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
person Gleb    schedule 21.10.2019
comment
Я пробовал ваш сценарий запустить нативную сборку проекта Quarkus на Travis, но сборка завершилась неудачно, запрос на выполнение, gu install native-image, есть идеи, почему? См. travis-ci.org/anthonyrichir/jhipster-registry-operator/builds / - person Anthony Richir; 11.11.2019
comment
@AnthonyRichir, возможно, это может быть связано с переменной env GRAALVM и каталогами linux, в которых Travis выполняет шаги из конфигурации .travis-ci.yml. Я сравниваю ваши и мои файлы конфигурации travis, и они немного отличаются - вы выполняете 'gu install native-image' на шаге 'install', когда я вызываю 'mvn package -Pnative -Dnative-image.docker-build = true' в шаг сценария. Все остальное выглядит примерно так (pom.xml и т. Д.). - person Gleb; 12.11.2019
comment
На самом деле, я переместил его в часть «сценарий», и, похоже, сейчас он создается, я новичок в Travis CI. Спасибо ! - person Anthony Richir; 13.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

person jonashackt    schedule 16.04.2020