diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fe24c36e..797adc39 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -49,18 +49,22 @@ jobs: baseImage: eclipse-temurin:25-jre-noble platforms: linux/amd64,linux/arm64,linux/riscv64 mcVersion: latest + enableMcHelperAotWarmup: true - variant: java25-alpine baseImage: eclipse-temurin:25-jre-alpine platforms: linux/amd64,linux/arm64 mcVersion: latest + enableMcHelperAotWarmup: true - variant: java25-jdk baseImage: eclipse-temurin:25 platforms: linux/amd64,linux/arm64 mcVersion: latest + enableMcHelperAotWarmup: true - variant: java25-graalvm baseImage: container-registry.oracle.com/graalvm/jdk:25-ol10 platforms: linux/amd64,linux/arm64 mcVersion: latest + enableMcHelperAotWarmup: true # JAVA 21: - variant: java21 baseImage: eclipse-temurin:21-jre @@ -240,6 +244,7 @@ jobs: REVISION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }} ${{ matrix.mcHelperVersion && format('MC_HELPER_VERSION={0}', matrix.mcHelperVersion) }} ${{ matrix.knockdRepoOrg && format('KNOCKD_REPO_ORG={0}', matrix.knockdRepoOrg) }} + ${{ matrix.enableMcHelperAotWarmup && 'ENABLE_MC_HELPER_AOT_WARMUP=1' || 'ENABLE_MC_HELPER_AOT_WARMUP=0' }} IMAGE_AUTHOR=${{ env.IMAGE_AUTHOR }} cache-from: type=gha,scope=${{ matrix.variant }} cache-to: type=gha,mode=max,scope=${{ matrix.variant }} diff --git a/.github/workflows/verify-pr.yml b/.github/workflows/verify-pr.yml index a0a3012f..6cd1effd 100644 --- a/.github/workflows/verify-pr.yml +++ b/.github/workflows/verify-pr.yml @@ -34,17 +34,20 @@ jobs: baseImage: eclipse-temurin:25-jre-noble platforms: linux/amd64,linux/arm64 mcVersion: latest + enableMcHelperAotWarmup: true - variant: java25-alpine baseImage: eclipse-temurin:25-jre-alpine platforms: linux/amd64,linux/arm64 mcVersion: latest # For GLIBC_2.34 support (and Alpine) knockdRepoOrg: Metalcape/knock + enableMcHelperAotWarmup: true - variant: java25-graalvm # stay aligned with build.yml baseImage: container-registry.oracle.com/graalvm/jdk:25-ol10 platforms: linux/amd64,linux/arm64 mcVersion: latest + enableMcHelperAotWarmup: true # JAVA 17: - variant: java17 # jammy doesn't work until minecraft updates to https://github.com/netty/netty/issues/12343 @@ -107,6 +110,7 @@ jobs: BASE_IMAGE=${{ matrix.baseImage }} ${{ matrix.mcHelperVersion && format('MC_HELPER_VERSION={0}', matrix.mcHelperVersion) }} ${{ matrix.knockdRepoOrg && format('KNOCKD_REPO_ORG={0}', matrix.knockdRepoOrg) }} + ${{ matrix.enableMcHelperAotWarmup && 'ENABLE_MC_HELPER_AOT_WARMUP=1' || 'ENABLE_MC_HELPER_AOT_WARMUP=0' }} cache-from: type=gha,scope=${{ matrix.variant }} - name: Run tests diff --git a/Dockerfile b/Dockerfile index 46c8a59f..719fec07 100644 --- a/Dockerfile +++ b/Dockerfile @@ -66,6 +66,12 @@ RUN curl -fsSL ${MC_HELPER_BASE_URL}/mc-image-helper-${MC_HELPER_VERSION}.tgz \ && ln -s /usr/share/mc-image-helper-${MC_HELPER_VERSION}/ /usr/share/mc-image-helper \ && ln -s /usr/share/mc-image-helper/bin/mc-image-helper /usr/bin + +ENV MC_IMAGE_HELPER_AOT_CACHE=/usr/share/mc-image-helper/cache/aot.cache +ARG ENABLE_MC_HELPER_AOT_WARMUP=0 +RUN --mount=target=/build,source=build \ + /build/create-aot-cache.sh + VOLUME ["/data"] WORKDIR /data diff --git a/build/create-aot-cache.sh b/build/create-aot-cache.sh new file mode 100755 index 00000000..4cb68fb6 --- /dev/null +++ b/build/create-aot-cache.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +set -e +if [ "${ENABLE_MC_HELPER_AOT_WARMUP}" = "1" ]; then + echo "Warming mc-image-helper AOT cache at ${MC_IMAGE_HELPER_AOT_CACHE}" + mkdir -p "$(dirname "${MC_IMAGE_HELPER_AOT_CACHE}")" + + aot_config=/tmp/mc-image-helper.aotconf + # record config + if ! MC_IMAGE_HELPER_OPTS="-XX:AOTMode=record -XX:AOTConfiguration=${aot_config}" mc-image-helper java-release > /dev/null; then + echo "Failed to record AOT configuration" + exit 1 + fi + + # create cache + if ! MC_IMAGE_HELPER_OPTS="-XX:AOTMode=create -XX:AOTConfiguration=${aot_config} -XX:AOTCache=${MC_IMAGE_HELPER_AOT_CACHE}" mc-image-helper java-release > /dev/null; then + echo "Failed to create AOT cache" + exit 1 + fi +else + echo "Skipping mc-image-helper AOT warmup" +fi diff --git a/scripts/start-configuration b/scripts/start-configuration index d04dfb97..8ff537b3 100755 --- a/scripts/start-configuration +++ b/scripts/start-configuration @@ -65,6 +65,12 @@ if isTrue "${DEBUG_MEMORY:-false}"; then free -m | applyLogPrefix fi +: "${MC_IMAGE_HELPER_AOT_CACHE:=/usr/share/mc-image-helper/cache/aot.cache}" +if (( $(getJavaRelease) >= 25 )) && [ -f "${MC_IMAGE_HELPER_AOT_CACHE}" ]; then + MC_IMAGE_HELPER_OPTS+=" -XX:AOTMode=auto -XX:AOTCache=${MC_IMAGE_HELPER_AOT_CACHE}" + export MC_IMAGE_HELPER_OPTS +fi + ########################################## # Setup RCON password