Usando o Oracle GraalVM em DevOps Pipelines de Build

Os pipelines de build DevOps permitem que você use o Oracle GraalVM para criar aplicativos Java de alto desempenho.

No estágio Build Gerenciado, você pode instalar e usar componentes do Oracle GraalVM, como o Native Image e o JDK (Java Development Kit), adicionando um comando simples do gerenciador de pacotes YUM no arquivo de especificação do build.

Observação

O Oracle GraalVM está disponível no OCI (Oracle Cloud Infrastructure) sem custo adicional.

Atualizando o Arquivo de Especificação de Build

Para instalar e usar o Oracle GraalVM no pipeline de build DevOps, atualize seu arquivo de especificação de build da seguinte forma:

  1. Adicione o comando a seguir para instalar um ou mais componentes Oracle GraalVM necessários. Por exemplo, esse comando instala a Imagem Nativa junto com o JDK e outras dependências necessárias.
    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. Defina a variável do ambiente JAVA_HOME.
    env:
      variables:
        "JAVA_HOME" : "/usr/lib64/graalvm/graalvm-java20"
  3. Defina a variável de ambiente 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

Exemplo 1:

Amostra de arquivo de especificação de build para criar um arquivo executável nativo de um aplicativo Java usando Maven e Oracle GraalVM para JDK 17 - Native Image.

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

Exemplo 2:

Amostra de arquivo de especificação de build para criar um arquivo executável nativo de um aplicativo Micronaut usando Maven e Oracle GraalVM para JDK 17 - Native Image.

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}

Exemplo 3:

Amostra de arquivo de especificação de build para criar um arquivo executável nativo de um aplicativo Java usando Maven e GraalVM Enterprise 22.x para Java 17 - Native Image.

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

Exemplo 4:

Amostra de arquivo de especificação de build para criar um arquivo executável nativo de um aplicativo Micronaut usando Maven e GraalVM Enterprise 22.x para Java 17 - Native Image.

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}