chore(partnerctl): add GraalVM native-image setup and arm64 build tooling

This commit is contained in:
2026-05-03 15:46:26 +08:00
parent d2c3416f48
commit cbdb33fefe
3 changed files with 112 additions and 1 deletions

View File

@@ -0,0 +1,12 @@
FROM --platform=linux/arm64 ghcr.io/graalvm/native-image-community:21
RUN microdnf install -y \
maven \
findutils \
gzip \
tar \
which \
file \
&& microdnf clean all
WORKDIR /workspace

View File

@@ -15,8 +15,10 @@
<maven.compiler.source>21</maven.compiler.source> <maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target> <maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<picocli.version>4.7.7</picocli.version>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.jline</groupId> <groupId>org.jline</groupId>
@@ -26,8 +28,78 @@
<dependency> <dependency>
<groupId>info.picocli</groupId> <groupId>info.picocli</groupId>
<artifactId>picocli</artifactId> <artifactId>picocli</artifactId>
<version>4.7.7</version> <version>${picocli.version}</version>
</dependency>
<dependency>
<groupId>info.picocli</groupId>
<artifactId>picocli-codegen</artifactId>
<version>${picocli.version}</version>
<scope>provided</scope>
</dependency> </dependency>
</dependencies> </dependencies>
<build>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>kapt</id>
<goals>
<goal>kapt</goal>
</goals>
<configuration>
<sourceDirs>
<sourceDir>src/main/java</sourceDir>
</sourceDirs>
<annotationProcessorPaths>
<annotationProcessorPath>
<groupId>info.picocli</groupId>
<artifactId>picocli-codegen</artifactId>
<version>${picocli.version}</version>
</annotationProcessorPath>
</annotationProcessorPaths>
<annotationProcessorArgs>
<project>partnerctl</project>
</annotationProcessorArgs>
</configuration>
</execution>
<execution>
<id>compile</id>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<sourceDirs>
<sourceDir>src/main/java</sourceDir>
</sourceDirs>
<jvmTarget>21</jvmTarget>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>1.0.0</version>
<extensions>true</extensions>
<configuration>
<imageName>partnerctl</imageName>
<mainClass>work.slhaf.partner.ctl.PartnerCtlKt</mainClass>
<metadataRepository>
<enabled>false</enabled>
</metadataRepository>
<buildArgs>
<buildArg>--no-fallback</buildArg>
<buildArg>-H:+ReportExceptionStackTraces</buildArg>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
</project> </project>

View File

@@ -0,0 +1,27 @@
#!/usr/bin/env bash
set -euo pipefail
MODULE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
REPO_DIR="$(cd "${MODULE_DIR}/.." && pwd)"
IMAGE_NAME="${PARTNERCTL_ARM64_BUILDER_IMAGE:-partnerctl-native-arm64-builder:21}"
DOCKERFILE="${MODULE_DIR}/Dockerfile.native-arm64"
if ! docker image inspect "${IMAGE_NAME}" >/dev/null 2>&1; then
echo "[partnerctl] building reusable arm64 native builder image: ${IMAGE_NAME}"
docker buildx build \
--platform linux/arm64 \
-f "${DOCKERFILE}" \
-t "${IMAGE_NAME}" \
--load \
"${MODULE_DIR}"
fi
echo "[partnerctl] building linux-aarch64 native executable"
docker run --rm \
--platform linux/arm64 \
--entrypoint /bin/bash \
-v "${REPO_DIR}":/workspace \
-v "${HOME}/.m2":/root/.m2 \
-w /workspace/PartnerCtl \
"${IMAGE_NAME}" \
-lc 'mvn -Pnative native:compile && file target/partnerctl'