Using Oracle GraalVM in DevOps Build Pipelines
DevOps build pipelines enable you to use Oracle GraalVM to build high-performance Java applications.
In the Managed Build stage, you can install and use Oracle GraalVM components such as Native Image and Java Development Kit (JDK) by adding a simple YUM package manager command in your build specification file.
Updating Build Specification File
To install and use Oracle GraalVM in the DevOps build pipeline, update your build specification file as follows:
- Add the following command to install one or more required Oracle GraalVM components. For example, this command installs Native Image along with JDK and other necessary dependencies.
steps: - type: Command name: "Install the latest Oracle GraalVM for JDK 20 - JDK and Native Image" command: | yum -y install graalvm-20-native-image
- Set the
JAVA_HOME
environment variable.env: variables: "JAVA_HOME" : "/usr/lib64/graalvm/graalvm-java20"
- Set the
PATH
environment variable.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
Example 1:
Sample build specification file to build a native executable from a Java application using Maven and Oracle GraalVM for 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
Example 2:
Sample build specification file to build a native executable from a Micronaut application using Maven and Oracle GraalVM for 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}
Example 3:
Sample build specification file to build a native executable from a Java application using Maven and GraalVM Enterprise 22.x for 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
Example 4:
Sample build specification file to build a native executable from a Micronaut application using Maven and GraalVM Enterprise 22.x for 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}