DevOpsビルド・パイプラインでのOracle GraalVMの使用

DevOpsビルド・パイプラインを使用すると、Oracle GraalVMを使用して高パフォーマンスのJavaアプリケーションをビルドできます。

「管理対象ビルド」ステージでは、ビルド仕様ファイルに単純なYUMパッケージ・マネージャ・コマンドを追加することで、ネイティブ・イメージやJava Development Kit (JDK)などのOracle GraalVMコンポーネントをインストールして使用できます。

ノート

Oracle GraalVMは、追加コストなしでOracle Cloud Infrastructure (OCI)で使用できます。

ビルド仕様ファイルの更新

DevOpsビルド・パイプラインでOracle GraalVMをインストールして使用するには、次のようにビルド仕様ファイルを更新します:

  1. 必要なOracle GraalVMコンポーネントを1つ以上インストールするには、次のコマンドを追加します。たとえば、このコマンドは、JDKおよびその他の必要な依存関係とともにネイティブ・イメージをインストールします。
    steps:
      - type: Command
        name: "Install the latest Oracle GraalVM for JDK 20 - JDK and Native Image"
        command: |
          yum -y install graalvm-20-native-image
  2. JAVA_HOME環境変数を設定します。
    env:
      variables:
        "JAVA_HOME" : "/usr/lib64/graalvm/graalvm-java20"
  3. PATH環境変数を設定します。
    env:
      variables:
        # PATH is a reserved variable and cannot be defined as a variable.
        # PATH can be changed in a build step and the change is visible in subsequent steps.
     
    steps:
      - type: Command
        name: "Set the PATH here"
        command: |
          export PATH=$JAVA_HOME/bin:$PATH

例1:

MavenおよびOracle GraalVM for JDK 17 - Native Imageを使用してJavaアプリケーションからネイティブ実行可能ファイルをビルドするためのサンプル・ビルド仕様ファイル。

version: 0.1
component: build
timeoutInSeconds: 600
runAs: root
shell: bash
env:
  variables:
    "JAVA_HOME" : "/usr/lib64/graalvm/graalvm-java17"
    # PATH is a reserved variable and cannot be defined as a variable.
    # However, PATH can be changed in a build step and the change is visible in subsequent steps.
steps:
  - type: Command
    name: "Install the latest Oracle GraalVM for JDK 17 - JDK and Native Image"
    command: |
      yum -y install graalvm-17-native-image
  - type: Command
    name: "Set the PATH here. JAVA_HOME already set in env > variables above."
    command: |
      export PATH=$JAVA_HOME/bin:$PATH
  - type: Command
    name: "Build a native executable with Oracle GraalVM for JDK 17 - Native Image"
    command: |
      mvn --no-transfer-progress -Pnative -DskipTests package
outputArtifacts:
  - name: app_native_executable
    type: BINARY
    location: target/my-app

例2:

MavenおよびOracle GraalVM for JDK 17 - Native Imageを使用してMicronautアプリケーションからネイティブ実行可能ファイルをビルドするためのサンプル・ビルド仕様ファイル。

version: 0.1
component: build
timeoutInSeconds: 900
runAs: root
shell: bash
env:
  variables:
    "JAVA_HOME" : "/usr/lib64/graalvm/graalvm-java17"
    TAG: "mn-hello-ni:0.0.1"
    APP_FILE: "MnHelloRest"
  exportedVariables:
    - BUILDRUN_HASH
steps:
  - type: Command
    name: "Define unique image tag"
    timeoutInSeconds: 140
    command: |
      echo "OCI_BUILD_RUN_ID: ${OCI_BUILD_RUN_ID}"
      export BUILDRUN_HASH=`echo ${OCI_BUILD_RUN_ID} | rev | cut -c 1-7`
      echo "BUILDRUN_HASH: " $BUILDRUN_HASH
  - type: Command
    name: "Install the latest Oracle GraalVM for JDK 17 - JDK and Native Image"
    command: |
      yum -y install graalvm-17-native-image
  - type: Command
    name: "Set the PATH here. JAVA_HOME already set in env > variables above."
    command: |
      export PATH=$JAVA_HOME/bin:$PATH
  - type: Command
    name: "Build a native executable with Oracle GraalVM for JDK 17 - Native Image"
    command: |
      ./mvnw --no-transfer-progress package -Dpackaging=native-image
  - type: Command
    name: "Package the native executable in a runtime container image"
    command: |
      docker build -f ./Dockerfile \
                  --build-arg APP_FILE=${APP_FILE} \
                  -t ${TAG} .
outputArtifacts:
  - name: app_native_executable
    type: BINARY
    location: target/MnHelloRest
  - name: runtime_image
    type: DOCKER_IMAGE
    location: ${TAG}

例3:

MavenおよびGraalVM Enterprise 22.x for Java 17 - Native Imageを使用してJavaアプリケーションからネイティブ実行可能ファイルをビルドするためのサンプル・ビルド仕様ファイル。

version: 0.1
component: build
timeoutInSeconds: 600
runAs: root
shell: bash
env:
  variables:
    "JAVA_HOME" : "/usr/lib64/graalvm/graalvm22-ee-java17"
    # PATH is a reserved variable and cannot be defined as a variable.
    # However, PATH can be changed in a build step and the change is visible in subsequent steps.
steps:
  - type: Command
    name: "Install the latest GraalVM Enterprise 22.x for Java 17 - JDK and Native Image"
    command: |
      yum -y install graalvm22-ee-17-native-image
  - type: Command
    name: "Set the PATH here. JAVA_HOME already set in env > variables above."
    command: |
      export PATH=$JAVA_HOME/bin:$PATH
  - type: Command
    name: "Build a native executable with the installed GraalVM Enterprise 22.x for Java 17 - Native Image"
    command: |
      mvn --no-transfer-progress -Pnative -DskipTests package
outputArtifacts:
  - name: app_native_executable
    type: BINARY
    location: target/my-app

例4:

MavenおよびGraalVM Enterprise 22.x for Java 17 - Native Imageを使用してMicronautアプリケーションからネイティブ実行可能ファイルをビルドするためのサンプル・ビルド仕様ファイル。

version: 0.1
component: build
timeoutInSeconds: 900
runAs: root
shell: bash
env:
  variables:
    "JAVA_HOME" : "/usr/lib64/graalvm/graalvm22-ee-java17"
    TAG: "mn-hello-ni:0.0.1"
    APP_FILE: "MnHelloRest"
  exportedVariables:
    - BUILDRUN_HASH
steps:
  - type: Command
    name: "Define unique image tag"
    timeoutInSeconds: 140
    command: |
      echo "OCI_BUILD_RUN_ID: ${OCI_BUILD_RUN_ID}"
      export BUILDRUN_HASH=`echo ${OCI_BUILD_RUN_ID} | rev | cut -c 1-7`
      echo "BUILDRUN_HASH: " $BUILDRUN_HASH
  - type: Command
    name: "Install the latest GraalVM Enterprise 22.x for Java 17 - JDK and Native Image"
    command: |
      yum -y install graalvm22-ee-17-native-image
  - type: Command
    name: "Set the PATH here. JAVA_HOME already set in env > variables above"
    command: |
      export PATH=$JAVA_HOME/bin:$PATH
  - type: Command
    name: "Build a native executable with the installed GraalVM Enterprise 22.x for Java 17 - Native Image"
    command: |
      ./mvnw --no-transfer-progress package -Dpackaging=native-image
  - type: Command
    name: "Package the native executable in a runtime container image"
    command: |
      docker build -f ./Dockerfile \
                  --build-arg APP_FILE=${APP_FILE} \
                  -t ${TAG}
outputArtifacts:
  - name: app_native_executable
    type: BINARY
    location: target/MnHelloRest
  - name: runtime_image
    type: DOCKER_IMAGE
    location: ${TAG}