diff --git a/.github/workflows/java-publish-maven.yml b/.github/workflows/java-publish-maven.yml
index cf7af2c3fc..d8ca560ab7 100644
--- a/.github/workflows/java-publish-maven.yml
+++ b/.github/workflows/java-publish-maven.yml
@@ -208,8 +208,79 @@ jobs:
if-no-files-found: error
retention-days: 1
- build-windows-classifier:
- name: Build Windows native classifier
+ build-linuxmusl-x64-classifier:
+ name: Build Linux musl x64 native classifier
+ needs: resolve-source
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ defaults:
+ run:
+ shell: bash
+ working-directory: ./java
+ steps:
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ with:
+ ref: ${{ needs.resolve-source.outputs.validated_source }}
+ fetch-depth: 1
+ persist-credentials: false
+
+ - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
+ with:
+ node-version: 22
+ package-manager-cache: false
+
+ - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
+ with:
+ java-version: "25"
+ distribution: "microsoft"
+ cache: "maven"
+
+ - name: Build and validate linuxmusl-x64 classifier
+ run: |
+ set -euo pipefail
+ SOURCE_COMMIT=$(git rev-parse HEAD)
+ if [ "$SOURCE_COMMIT" != "${{ needs.resolve-source.outputs.validated_source }}" ]; then
+ echo "::error::Checked out $SOURCE_COMMIT instead of the resolved release source."
+ exit 1
+ fi
+ VERSION="${{ needs.resolve-source.outputs.release_version }}"
+ docker run --rm \
+ --volume "$GITHUB_WORKSPACE:/workspace" \
+ --volume "$HOME/.m2:/root/.m2" \
+ --workdir /workspace/java \
+ --env HOST_GID="$(id -g)" \
+ --env HOST_UID="$(id -u)" \
+ "eclipse-temurin:25-jdk-alpine" \
+ sh -c "apk add --no-cache git java-cacerts maven nodejs npm &&
+ export JAVA_TOOL_OPTIONS=-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts &&
+ git config --global --add safe.directory /workspace &&
+ node copilot-native/scripts/validate-native-host.mjs linuxmusl-x64 &&
+ mvn -B -pl copilot-native package -DskipTests -Dcopilot.native.libc=musl -Drevision=$VERSION &&
+ chown -R \$HOST_UID:\$HOST_GID copilot-native/target"
+ JAR="copilot-native/target/copilot-sdk-java-runtime-$VERSION-linuxmusl-x64.jar"
+ PRIMARY_JAR="copilot-native/target/copilot-sdk-java-runtime-$VERSION.jar"
+ test -f "$JAR"
+ node copilot-native/scripts/validate-native-artifact.mjs \
+ classifier linuxmusl-x64 "$JAR" "$(basename "$JAR")" ..
+ node copilot-native/scripts/validate-native-artifact.mjs placeholder "$PRIMARY_JAR"
+ MANIFEST="copilot-native/target/linuxmusl-x64-$VERSION.sha256"
+ HASH=$(sha256sum "$JAR" | cut -d ' ' -f 1)
+ printf '%s %s' "$HASH" "$(basename "$JAR")" > "$MANIFEST"
+ node copilot-native/scripts/validate-native-artifact.mjs \
+ checksum "$JAR" "$MANIFEST" "$(basename "$JAR")"
+
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
+ with:
+ name: java-native-linuxmusl-x64-release-${{ github.run_id }}-${{ github.run_attempt }}
+ path: |
+ java/copilot-native/target/copilot-sdk-java-runtime-${{ needs.resolve-source.outputs.release_version }}-linuxmusl-x64.jar
+ java/copilot-native/target/linuxmusl-x64-${{ needs.resolve-source.outputs.release_version }}.sha256
+ if-no-files-found: error
+ retention-days: 1
+
+ build-windows-x64-classifier:
+ name: Build Windows x64 native classifier
needs: resolve-source
runs-on: windows-latest
permissions:
@@ -446,7 +517,8 @@ jobs:
[
resolve-source,
build-linux-arm64-classifier,
- build-windows-classifier,
+ build-linuxmusl-x64-classifier,
+ build-windows-x64-classifier,
build-windows-arm64-classifier,
build-darwin-classifier,
build-darwin-x64-classifier,
@@ -488,6 +560,11 @@ jobs:
name: java-native-linux-arm64-release-${{ github.run_id }}-${{ github.run_attempt }}
path: ${{ runner.temp }}/java-native-linux-arm64
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+ with:
+ name: java-native-linuxmusl-x64-release-${{ github.run_id }}-${{ github.run_attempt }}
+ path: ${{ runner.temp }}/java-native-linuxmusl-x64
+
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: java-native-win32-x64-release-${{ github.run_id }}-${{ github.run_attempt }}
@@ -550,6 +627,27 @@ jobs:
echo "windows_jar=$JAR" >> "$GITHUB_OUTPUT"
echo "windows_sha=$(cut -d ' ' -f 1 "$MANIFEST")" >> "$GITHUB_OUTPUT"
+ - name: Verify immutable source and Linux musl x64 classifier
+ id: linuxmusl-x64-artifact
+ run: |
+ SOURCE_COMMIT=$(git rev-parse HEAD)
+ if [ "$SOURCE_COMMIT" != "${{ needs.resolve-source.outputs.validated_source }}" ]; then
+ echo "::error::Checked out $SOURCE_COMMIT instead of the resolved release source."
+ exit 1
+ fi
+ VERSION="${{ needs.resolve-source.outputs.release_version }}"
+ ARTIFACT_DIRECTORY="${{ runner.temp }}/java-native-linuxmusl-x64"
+ JAR="$ARTIFACT_DIRECTORY/copilot-sdk-java-runtime-$VERSION-linuxmusl-x64.jar"
+ MANIFEST="$ARTIFACT_DIRECTORY/linuxmusl-x64-$VERSION.sha256"
+ test -f "$JAR"
+ test -f "$MANIFEST"
+ node "$GITHUB_WORKSPACE/java/copilot-native/scripts/validate-native-artifact.mjs" \
+ checksum "$JAR" "$MANIFEST" "$(basename "$JAR")"
+ node "$GITHUB_WORKSPACE/java/copilot-native/scripts/validate-native-artifact.mjs" \
+ classifier linuxmusl-x64 "$JAR" "$(basename "$JAR")" "$GITHUB_WORKSPACE"
+ echo "linuxmusl_x64_jar=$JAR" >> "$GITHUB_OUTPUT"
+ echo "linuxmusl_x64_sha=$(cut -d ' ' -f 1 "$MANIFEST")" >> "$GITHUB_OUTPUT"
+
- name: Verify immutable source and Darwin classifier
id: darwin-artifact
run: |
@@ -619,6 +717,7 @@ jobs:
VERSION="${{ needs.resolve-source.outputs.release_version }}"
mvn -B deploy -DskipTests -DskipITs -Prelease -Drevision="$VERSION" -Dcopilot.native.libc=glibc \
"-Dcopilot.native.external.linux.arm64.classifier.path=${{ steps.linux-arm64-artifact.outputs.linux_arm64_jar }}" \
+ "-Dcopilot.native.external.linuxmusl.x64.classifier.path=${{ steps.linuxmusl-x64-artifact.outputs.linuxmusl_x64_jar }}" \
"-Dcopilot.native.external.win32.classifier.path=${{ steps.windows-artifact.outputs.windows_jar }}" \
"-Dcopilot.native.external.win32.arm64.classifier.path=${{ steps.windows-arm64-artifact.outputs.windows_arm64_jar }}" \
"-Dcopilot.native.external.darwin.classifier.path=${{ steps.darwin-artifact.outputs.darwin_jar }}" \
@@ -657,6 +756,7 @@ jobs:
echo "| --- | --- | --- | --- | --- |"
echo "| \`linux-x64\` | \`ubuntu-latest\` | \`$(basename "$LINUX_JAR")\` | \`$LINUX_SHA\` | Published |"
echo "| \`linux-arm64\` | \`ubuntu-24.04-arm\` | \`$(basename "${{ steps.linux-arm64-artifact.outputs.linux_arm64_jar }}")\` | \`${{ steps.linux-arm64-artifact.outputs.linux_arm64_sha }}\` | Published |"
+ echo "| \`linuxmusl-x64\` | \`Alpine x64\` | \`$(basename "${{ steps.linuxmusl-x64-artifact.outputs.linuxmusl_x64_jar }}")\` | \`${{ steps.linuxmusl-x64-artifact.outputs.linuxmusl_x64_sha }}\` | Published |"
echo "| \`win32-x64\` | \`windows-latest\` | \`$(basename "${{ steps.windows-artifact.outputs.windows_jar }}")\` | \`${{ steps.windows-artifact.outputs.windows_sha }}\` | Published |"
echo "| \`win32-arm64\` | \`windows-11-arm\` | \`$(basename "${{ steps.windows-arm64-artifact.outputs.windows_arm64_jar }}")\` | \`${{ steps.windows-arm64-artifact.outputs.windows_arm64_sha }}\` | Published |"
echo "| \`darwin-x64\` | \`macos-15-intel\` | \`$(basename "${{ steps.darwin-x64-artifact.outputs.darwin_x64_jar }}")\` | \`${{ steps.darwin-x64-artifact.outputs.darwin_x64_sha }}\` | Published |"
diff --git a/.github/workflows/java-publish-snapshot.yml b/.github/workflows/java-publish-snapshot.yml
index fbaf4a0d6d..ce5b8c5f4e 100644
--- a/.github/workflows/java-publish-snapshot.yml
+++ b/.github/workflows/java-publish-snapshot.yml
@@ -97,8 +97,82 @@ jobs:
if-no-files-found: error
retention-days: 1
- build-windows-classifier:
- name: Build Windows snapshot classifier
+ build-linuxmusl-x64-classifier:
+ name: Build Linux musl x64 snapshot classifier
+ needs: resolve-source
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ outputs:
+ version: ${{ steps.build.outputs.version }}
+ defaults:
+ run:
+ shell: bash
+ working-directory: ./java
+ steps:
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ with:
+ ref: ${{ github.sha }}
+ fetch-depth: 1
+ persist-credentials: false
+
+ - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
+ with:
+ node-version: 22
+
+ - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
+ with:
+ java-version: "25"
+ distribution: "microsoft"
+ cache: "maven"
+
+ - name: Build and validate linuxmusl-x64 classifier
+ id: build
+ run: |
+ set -euo pipefail
+ SOURCE_COMMIT=$(git rev-parse HEAD)
+ if [ "$SOURCE_COMMIT" != "${{ needs.resolve-source.outputs.source_sha }}" ]; then
+ echo "::error::Checked out $SOURCE_COMMIT instead of the resolved snapshot source."
+ exit 1
+ fi
+ VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
+ docker run --rm \
+ --volume "$GITHUB_WORKSPACE:/workspace" \
+ --volume "$HOME/.m2:/root/.m2" \
+ --workdir /workspace/java \
+ --env HOST_GID="$(id -g)" \
+ --env HOST_UID="$(id -u)" \
+ "eclipse-temurin:25-jdk-alpine" \
+ sh -c "apk add --no-cache git java-cacerts maven nodejs npm &&
+ export JAVA_TOOL_OPTIONS=-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts &&
+ git config --global --add safe.directory /workspace &&
+ node copilot-native/scripts/validate-native-host.mjs linuxmusl-x64 &&
+ mvn -B -pl copilot-native package -DskipTests -Dcopilot.native.libc=musl &&
+ chown -R \$HOST_UID:\$HOST_GID copilot-native/target"
+ JAR="copilot-native/target/copilot-sdk-java-runtime-$VERSION-linuxmusl-x64.jar"
+ PRIMARY_JAR="copilot-native/target/copilot-sdk-java-runtime-$VERSION.jar"
+ test -f "$JAR"
+ node copilot-native/scripts/validate-native-artifact.mjs \
+ classifier linuxmusl-x64 "$JAR" "$(basename "$JAR")" ..
+ node copilot-native/scripts/validate-native-artifact.mjs placeholder "$PRIMARY_JAR"
+ MANIFEST="copilot-native/target/linuxmusl-x64-$VERSION.sha256"
+ HASH=$(sha256sum "$JAR" | cut -d ' ' -f 1)
+ printf '%s %s' "$HASH" "$(basename "$JAR")" > "$MANIFEST"
+ node copilot-native/scripts/validate-native-artifact.mjs \
+ checksum "$JAR" "$MANIFEST" "$(basename "$JAR")"
+ echo "version=$VERSION" >> "$GITHUB_OUTPUT"
+
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
+ with:
+ name: java-native-linuxmusl-x64-snapshot-${{ github.run_id }}-${{ github.run_attempt }}
+ path: |
+ java/copilot-native/target/copilot-sdk-java-runtime-${{ steps.build.outputs.version }}-linuxmusl-x64.jar
+ java/copilot-native/target/linuxmusl-x64-${{ steps.build.outputs.version }}.sha256
+ if-no-files-found: error
+ retention-days: 1
+
+ build-windows-x64-classifier:
+ name: Build Windows x64 snapshot classifier
needs: resolve-source
runs-on: windows-latest
permissions:
@@ -351,7 +425,8 @@ jobs:
[
resolve-source,
build-linux-arm64-classifier,
- build-windows-classifier,
+ build-linuxmusl-x64-classifier,
+ build-windows-x64-classifier,
build-windows-arm64-classifier,
build-darwin-classifier,
build-darwin-x64-classifier,
@@ -388,6 +463,11 @@ jobs:
name: java-native-linux-arm64-snapshot-${{ github.run_id }}-${{ github.run_attempt }}
path: ${{ runner.temp }}/java-native-linux-arm64
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+ with:
+ name: java-native-linuxmusl-x64-snapshot-${{ github.run_id }}-${{ github.run_attempt }}
+ path: ${{ runner.temp }}/java-native-linuxmusl-x64
+
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: java-native-win32-x64-snapshot-${{ github.run_id }}-${{ github.run_attempt }}
@@ -447,7 +527,7 @@ jobs:
exit 1
fi
VERSION="${{ steps.linux-arm64-artifact.outputs.version }}"
- if [ "$VERSION" != "${{ needs.build-windows-classifier.outputs.version }}" ]; then
+ if [ "$VERSION" != "${{ needs.build-windows-x64-classifier.outputs.version }}" ]; then
echo "::error::Windows classifier version does not match deploy version."
exit 1
fi
@@ -464,6 +544,31 @@ jobs:
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "windows_sha=$(cut -d ' ' -f 1 "$MANIFEST")" >> "$GITHUB_OUTPUT"
+ - name: Verify version, source, and Linux musl x64 classifier
+ id: linuxmusl-x64-artifact
+ run: |
+ SOURCE_COMMIT=$(git rev-parse HEAD)
+ if [ "$SOURCE_COMMIT" != "${{ needs.resolve-source.outputs.source_sha }}" ]; then
+ echo "::error::Checked out $SOURCE_COMMIT instead of the resolved snapshot source."
+ exit 1
+ fi
+ VERSION="${{ steps.linux-arm64-artifact.outputs.version }}"
+ if [ "$VERSION" != "${{ needs.build-linuxmusl-x64-classifier.outputs.version }}" ]; then
+ echo "::error::Linux musl x64 classifier version does not match deploy version."
+ exit 1
+ fi
+ ARTIFACT_DIRECTORY="${{ runner.temp }}/java-native-linuxmusl-x64"
+ JAR="$ARTIFACT_DIRECTORY/copilot-sdk-java-runtime-$VERSION-linuxmusl-x64.jar"
+ MANIFEST="$ARTIFACT_DIRECTORY/linuxmusl-x64-$VERSION.sha256"
+ test -f "$JAR"
+ test -f "$MANIFEST"
+ node "$GITHUB_WORKSPACE/java/copilot-native/scripts/validate-native-artifact.mjs" \
+ checksum "$JAR" "$MANIFEST" "$(basename "$JAR")"
+ node "$GITHUB_WORKSPACE/java/copilot-native/scripts/validate-native-artifact.mjs" \
+ classifier linuxmusl-x64 "$JAR" "$(basename "$JAR")" "$GITHUB_WORKSPACE"
+ echo "linuxmusl_x64_jar=$JAR" >> "$GITHUB_OUTPUT"
+ echo "linuxmusl_x64_sha=$(cut -d ' ' -f 1 "$MANIFEST")" >> "$GITHUB_OUTPUT"
+
- name: Verify version, source, and Darwin classifier
id: darwin-artifact
run: |
@@ -544,6 +649,7 @@ jobs:
VERSION="${{ steps.windows-artifact.outputs.version }}"
mvn -B deploy -DskipTests -DskipITs -Dcopilot.native.libc=glibc \
"-Dcopilot.native.external.linux.arm64.classifier.path=${{ steps.linux-arm64-artifact.outputs.linux_arm64_jar }}" \
+ "-Dcopilot.native.external.linuxmusl.x64.classifier.path=${{ steps.linuxmusl-x64-artifact.outputs.linuxmusl_x64_jar }}" \
"-Dcopilot.native.external.win32.classifier.path=${{ steps.windows-artifact.outputs.windows_jar }}" \
"-Dcopilot.native.external.win32.arm64.classifier.path=${{ steps.windows-arm64-artifact.outputs.windows_arm64_jar }}" \
"-Dcopilot.native.external.darwin.classifier.path=${{ steps.darwin-artifact.outputs.darwin_jar }}" \
@@ -582,6 +688,7 @@ jobs:
echo "| --- | --- | --- | --- | --- |"
echo "| \`linux-x64\` | \`ubuntu-latest\` | \`$(basename "$LINUX_JAR")\` | \`$LINUX_SHA\` | Published |"
echo "| \`linux-arm64\` | \`ubuntu-24.04-arm\` | \`$(basename "${{ steps.linux-arm64-artifact.outputs.linux_arm64_jar }}")\` | \`${{ steps.linux-arm64-artifact.outputs.linux_arm64_sha }}\` | Published |"
+ echo "| \`linuxmusl-x64\` | \`Alpine x64\` | \`$(basename "${{ steps.linuxmusl-x64-artifact.outputs.linuxmusl_x64_jar }}")\` | \`${{ steps.linuxmusl-x64-artifact.outputs.linuxmusl_x64_sha }}\` | Published |"
echo "| \`win32-x64\` | \`windows-latest\` | \`$(basename "${{ steps.windows-artifact.outputs.windows_jar }}")\` | \`${{ steps.windows-artifact.outputs.windows_sha }}\` | Published |"
echo "| \`win32-arm64\` | \`windows-11-arm\` | \`$(basename "${{ steps.windows-arm64-artifact.outputs.windows_arm64_jar }}")\` | \`${{ steps.windows-arm64-artifact.outputs.windows_arm64_sha }}\` | Published |"
echo "| \`darwin-x64\` | \`macos-15-intel\` | \`$(basename "${{ steps.darwin-x64-artifact.outputs.darwin_x64_jar }}")\` | \`${{ steps.darwin-x64-artifact.outputs.darwin_x64_sha }}\` | Published |"
diff --git a/.github/workflows/java-sdk-tests.yml b/.github/workflows/java-sdk-tests.yml
index c51d56cc1f..b491717be6 100644
--- a/.github/workflows/java-sdk-tests.yml
+++ b/.github/workflows/java-sdk-tests.yml
@@ -26,6 +26,9 @@ jobs:
- os: ubuntu-24.04-arm
classifier: linux-arm64
maven-args: -Dcopilot.native.libc=glibc
+ - os: ubuntu-latest
+ classifier: linuxmusl-x64
+ alpine-image: eclipse-temurin:25-jdk-alpine
- os: windows-latest
classifier: win32-x64
- os: windows-11-arm
@@ -54,13 +57,36 @@ jobs:
node-version: 22
- name: Validate native host
+ if: matrix.alpine-image == ''
run: node copilot-native/scripts/validate-native-host.mjs ${{ matrix.classifier }}
- name: Run Java SDK tests (InProcess)
+ if: matrix.alpine-image == ''
env:
CI: "true"
run: mvn clean verify -Pinprocess ${{ matrix.maven-args }}
+ - name: Run Java SDK tests (InProcess, musl)
+ if: matrix.alpine-image != ''
+ env:
+ CI: "true"
+ run: |
+ docker run --rm \
+ --volume "$GITHUB_WORKSPACE:/workspace" \
+ --volume "$HOME/.m2:/root/.m2" \
+ --workdir /workspace/java \
+ --env CI \
+ --env HOST_GID="$(id -g)" \
+ --env HOST_UID="$(id -u)" \
+ --env MAVEN_OPTS \
+ "${{ matrix.alpine-image }}" \
+ sh -c 'apk add --no-cache git java-cacerts maven nodejs npm &&
+ export JAVA_TOOL_OPTIONS=-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts &&
+ git config --global --add safe.directory /workspace &&
+ node copilot-native/scripts/validate-native-host.mjs linuxmusl-x64 &&
+ mvn clean verify -Pinprocess -Dcopilot.native.libc=musl &&
+ chown -R "$HOST_UID:$HOST_GID" copilot-native/target sdk/target'
+
- name: Generate Test Report Summary
if: failure()
uses: ./.github/actions/java-test-report
@@ -137,7 +163,77 @@ jobs:
overwrite: true
retention-days: 1
- java-native-publication-windows:
+ java-native-publication-linuxmusl-x64:
+ name: "Java Native Publication Input (linuxmusl-x64)"
+ if: github.event.repository.fork == false
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ outputs:
+ source_sha: ${{ steps.build.outputs.source_sha }}
+ version: ${{ steps.build.outputs.version }}
+ defaults:
+ run:
+ shell: bash
+ working-directory: ./java
+ steps:
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ with:
+ persist-credentials: false
+
+ - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
+ with:
+ node-version: 22
+
+ - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
+ with:
+ java-version: "25"
+ distribution: "microsoft"
+ cache: "maven"
+
+ - name: Build and validate linuxmusl-x64 classifier
+ id: build
+ run: |
+ set -euo pipefail
+ VERSION="$JAVA_PUBLICATION_REVISION"
+ docker run --rm \
+ --volume "$GITHUB_WORKSPACE:/workspace" \
+ --volume "$HOME/.m2:/root/.m2" \
+ --workdir /workspace/java \
+ --env HOST_GID="$(id -g)" \
+ --env HOST_UID="$(id -u)" \
+ "eclipse-temurin:25-jdk-alpine" \
+ sh -c "apk add --no-cache git java-cacerts maven nodejs npm &&
+ export JAVA_TOOL_OPTIONS=-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts &&
+ git config --global --add safe.directory /workspace &&
+ node copilot-native/scripts/validate-native-host.mjs linuxmusl-x64 &&
+ mvn -B -pl copilot-native package -DskipTests -Dcopilot.native.libc=musl -Drevision=$VERSION &&
+ chown -R \$HOST_UID:\$HOST_GID copilot-native/target"
+ JAR="copilot-native/target/copilot-sdk-java-runtime-$VERSION-linuxmusl-x64.jar"
+ PRIMARY_JAR="copilot-native/target/copilot-sdk-java-runtime-$VERSION.jar"
+ test -f "$JAR"
+ node copilot-native/scripts/validate-native-artifact.mjs \
+ classifier linuxmusl-x64 "$JAR" "$(basename "$JAR")" ..
+ node copilot-native/scripts/validate-native-artifact.mjs placeholder "$PRIMARY_JAR"
+ MANIFEST="copilot-native/target/linuxmusl-x64-$VERSION.sha256"
+ HASH=$(sha256sum "$JAR" | cut -d ' ' -f 1)
+ printf '%s %s' "$HASH" "$(basename "$JAR")" > "$MANIFEST"
+ node copilot-native/scripts/validate-native-artifact.mjs \
+ checksum "$JAR" "$MANIFEST" "$(basename "$JAR")"
+ echo "source_sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"
+ echo "version=$VERSION" >> "$GITHUB_OUTPUT"
+
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
+ with:
+ name: java-native-publication-linuxmusl-x64-${{ github.run_id }}
+ path: |
+ java/copilot-native/target/copilot-sdk-java-runtime-${{ steps.build.outputs.version }}-linuxmusl-x64.jar
+ java/copilot-native/target/linuxmusl-x64-${{ steps.build.outputs.version }}.sha256
+ if-no-files-found: error
+ overwrite: true
+ retention-days: 1
+
+ java-native-publication-windows-x64:
name: "Java Native Publication Input (win32-x64)"
if: github.event.repository.fork == false
runs-on: windows-latest
@@ -253,7 +349,7 @@ jobs:
overwrite: true
retention-days: 1
- java-native-publication-darwin:
+ java-native-publication-darwin-arm64:
name: "Java Native Publication Input (darwin-arm64)"
if: github.event.repository.fork == false
runs-on: macos-26
@@ -376,9 +472,10 @@ jobs:
needs:
[
java-native-publication-linux-arm64,
- java-native-publication-windows,
+ java-native-publication-linuxmusl-x64,
+ java-native-publication-windows-x64,
java-native-publication-windows-arm64,
- java-native-publication-darwin,
+ java-native-publication-darwin-arm64,
java-native-publication-darwin-x64,
]
runs-on: ubuntu-latest
@@ -407,6 +504,11 @@ jobs:
name: java-native-publication-linux-arm64-${{ github.run_id }}
path: ${{ github.workspace }}/java/native-publication-input/linux-arm64
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+ with:
+ name: java-native-publication-linuxmusl-x64-${{ github.run_id }}
+ path: ${{ github.workspace }}/java/native-publication-input/linuxmusl-x64
+
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: java-native-publication-win32-x64-${{ github.run_id }}
@@ -431,23 +533,28 @@ jobs:
run: |
set -euo pipefail
test "$(git rev-parse HEAD)" = "${{ needs.java-native-publication-linux-arm64.outputs.source_sha }}"
- test "$(git rev-parse HEAD)" = "${{ needs.java-native-publication-windows.outputs.source_sha }}"
+ test "$(git rev-parse HEAD)" = "${{ needs.java-native-publication-linuxmusl-x64.outputs.source_sha }}"
+ test "$(git rev-parse HEAD)" = "${{ needs.java-native-publication-windows-x64.outputs.source_sha }}"
test "$(git rev-parse HEAD)" = "${{ needs.java-native-publication-windows-arm64.outputs.source_sha }}"
- test "$(git rev-parse HEAD)" = "${{ needs.java-native-publication-darwin.outputs.source_sha }}"
+ test "$(git rev-parse HEAD)" = "${{ needs.java-native-publication-darwin-arm64.outputs.source_sha }}"
test "$(git rev-parse HEAD)" = "${{ needs.java-native-publication-darwin-x64.outputs.source_sha }}"
- VERSION="${{ needs.java-native-publication-windows.outputs.version }}"
+ VERSION="${{ needs.java-native-publication-windows-x64.outputs.version }}"
test "$VERSION" = "$JAVA_PUBLICATION_REVISION"
test "$VERSION" = "${{ needs.java-native-publication-linux-arm64.outputs.version }}"
+ test "$VERSION" = "${{ needs.java-native-publication-linuxmusl-x64.outputs.version }}"
test "$VERSION" = "${{ needs.java-native-publication-windows-arm64.outputs.version }}"
- test "$VERSION" = "${{ needs.java-native-publication-darwin.outputs.version }}"
+ test "$VERSION" = "${{ needs.java-native-publication-darwin-arm64.outputs.version }}"
test "$VERSION" = "${{ needs.java-native-publication-darwin-x64.outputs.version }}"
LINUX_ARM64_DIRECTORY="$GITHUB_WORKSPACE/java/native-publication-input/linux-arm64"
+ LINUXMUSL_X64_DIRECTORY="$GITHUB_WORKSPACE/java/native-publication-input/linuxmusl-x64"
WINDOWS_DIRECTORY="$GITHUB_WORKSPACE/java/native-publication-input/windows"
WINDOWS_ARM64_DIRECTORY="$GITHUB_WORKSPACE/java/native-publication-input/windows-arm64"
DARWIN_DIRECTORY="$GITHUB_WORKSPACE/java/native-publication-input/darwin"
DARWIN_X64_DIRECTORY="$GITHUB_WORKSPACE/java/native-publication-input/darwin-x64"
LINUX_ARM64_JAR="$LINUX_ARM64_DIRECTORY/copilot-sdk-java-runtime-$VERSION-linux-arm64.jar"
LINUX_ARM64_MANIFEST="$LINUX_ARM64_DIRECTORY/linux-arm64-$VERSION.sha256"
+ LINUXMUSL_X64_JAR="$LINUXMUSL_X64_DIRECTORY/copilot-sdk-java-runtime-$VERSION-linuxmusl-x64.jar"
+ LINUXMUSL_X64_MANIFEST="$LINUXMUSL_X64_DIRECTORY/linuxmusl-x64-$VERSION.sha256"
WINDOWS_JAR="$WINDOWS_DIRECTORY/copilot-sdk-java-runtime-$VERSION-win32-x64.jar"
WINDOWS_MANIFEST="$WINDOWS_DIRECTORY/win32-x64-$VERSION.sha256"
WINDOWS_ARM64_JAR="$WINDOWS_ARM64_DIRECTORY/copilot-sdk-java-runtime-$VERSION-win32-arm64.jar"
@@ -460,6 +567,10 @@ jobs:
checksum "$LINUX_ARM64_JAR" "$LINUX_ARM64_MANIFEST" "$(basename "$LINUX_ARM64_JAR")"
node copilot-native/scripts/validate-native-artifact.mjs \
classifier linux-arm64 "$LINUX_ARM64_JAR" "$(basename "$LINUX_ARM64_JAR")" ..
+ node copilot-native/scripts/validate-native-artifact.mjs \
+ checksum "$LINUXMUSL_X64_JAR" "$LINUXMUSL_X64_MANIFEST" "$(basename "$LINUXMUSL_X64_JAR")"
+ node copilot-native/scripts/validate-native-artifact.mjs \
+ classifier linuxmusl-x64 "$LINUXMUSL_X64_JAR" "$(basename "$LINUXMUSL_X64_JAR")" ..
node copilot-native/scripts/validate-native-artifact.mjs \
checksum "$WINDOWS_JAR" "$WINDOWS_MANIFEST" "$(basename "$WINDOWS_JAR")"
node copilot-native/scripts/validate-native-artifact.mjs \
@@ -488,6 +599,7 @@ jobs:
"-Drevision=$VERSION" \
-Dcopilot.native.libc=glibc \
"-Dcopilot.native.external.linux.arm64.classifier.path=$LINUX_ARM64_JAR" \
+ "-Dcopilot.native.external.linuxmusl.x64.classifier.path=$LINUXMUSL_X64_JAR" \
"-Dcopilot.native.external.win32.classifier.path=$WINDOWS_JAR" \
"-Dcopilot.native.external.win32.arm64.classifier.path=$WINDOWS_ARM64_JAR" \
"-Dcopilot.native.external.darwin.classifier.path=$DARWIN_JAR" \
diff --git a/java/README.md b/java/README.md
index 153f838346..f3381e3255 100644
--- a/java/README.md
+++ b/java/README.md
@@ -74,7 +74,7 @@ implementation 'com.github:copilot-sdk-java:1.0.15-preview.1-SNAPSHOT'
## In-process mode (experimental)
-The SDK supports running the Copilot runtime **in-process** as a native library instead of spawning a separate CLI process. This eliminates process management overhead and simplifies deployment. In-process mode is currently experimental and supported on **linux-x64** (glibc), **linux-arm64** (glibc), **win32-x64**, **win32-arm64**, **darwin-x64**, and **darwin-arm64**.
+The SDK supports running the Copilot runtime **in-process** as a native library instead of spawning a separate CLI process. This eliminates process management overhead and simplifies deployment. In-process mode is currently experimental and supported on **linux-x64** (glibc), **linux-arm64** (glibc), **linuxmusl-x64**, **win32-x64**, **win32-arm64**, **darwin-x64**, and **darwin-arm64**.
Because in-process mode is experimental, see the [Using experimental APIs](#using-experimental-apis) section for how to opt in.
@@ -97,7 +97,7 @@ Add both the SDK and the platform-specific native runtime to your project:
${copilot.version}
linux-x64
-
+
net.java.dev.jna
@@ -644,7 +644,7 @@ CI enforces both checks. Spotless runs explicitly in CI; `mvn verify` alone does
Run native-runtime Maven commands from the `java` directory. Native packaging requires Node.js in addition to JDK 25 and Maven because `copilot-native/scripts/fetch-native.mjs` retrieves the pinned runtime package from the corresponding GitHub release.
-On a native Linux glibc host, Maven activates `native-linux-x64` or `native-linux-arm64` for the matching architecture when `copilot.native.libc=glibc` is set. On Windows x64, Windows ARM64, Intel macOS, and Apple Silicon macOS, Maven activates `native-win32-x64`, `native-win32-arm64`, `native-darwin-x64`, or `native-darwin-arm64` automatically. The matching profile validates the host, runs the native script tests, fetches the pinned platform package from the corresponding `github/copilot-cli` release during `generate-resources`, packages the classifier JAR during `package`, and verifies its native contents.
+On a native Linux glibc host, Maven activates `native-linux-x64` or `native-linux-arm64` for the matching architecture when `copilot.native.libc=glibc` is set. On a Linux musl x64 host, Maven activates `native-linuxmusl-x64` when `copilot.native.libc=musl` is set. On Windows x64, Windows ARM64, Intel macOS, and Apple Silicon macOS, Maven activates `native-win32-x64`, `native-win32-arm64`, `native-darwin-x64`, or `native-darwin-arm64` automatically. The matching profile validates the host, runs the native script tests, fetches the pinned platform package from the corresponding `github/copilot-cli` release during `generate-resources`, packages the classifier JAR during `package`, and verifies its native contents.
Before opting in, validate that Node.js reports glibc for the build host:
@@ -679,7 +679,14 @@ node copilot-native/scripts/validate-native-host.mjs linux-arm64
mvn -Pinprocess clean verify -Dcopilot.native.libc=glibc
```
-On Linux musl and other unsupported hosts, do not set `copilot.native.libc=glibc`. A normal build produces only the OS-neutral primary, sources, and Javadoc JARs; it does not run native script tests, download or stage native files, or produce a platform classifier JAR.
+The same command validates in-process mode on Linux musl x64:
+
+```bash
+node copilot-native/scripts/validate-native-host.mjs linuxmusl-x64
+mvn -Pinprocess clean verify -Dcopilot.native.libc=musl
+```
+
+On Linux musl ARM64 and other unsupported hosts, do not set `copilot.native.libc`. A normal build produces only the OS-neutral primary, sources, and Javadoc JARs; it does not run native script tests, download or stage native files, or produce a platform classifier JAR.
To build only the OS-neutral artifacts on any host, or override the glibc opt-in, disable native download and packaging:
diff --git a/java/copilot-native/pom.xml b/java/copilot-native/pom.xml
index f4ac485862..2c750e4e47 100644
--- a/java/copilot-native/pom.xml
+++ b/java/copilot-native/pom.xml
@@ -409,6 +409,64 @@
+
+ native-linuxmusl-x64
+
+
+ Linux
+ amd64
+
+
+ copilot.native.libc
+ musl
+
+
+
+ linuxmusl-x64
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+
+
+ validate-native-host
+ validate
+
+
+ fetch-native
+ generate-resources
+
+
+ test-fetch-native
+ test
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ jar-native
+ package
+
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+
+
+ verify-native-jars
+ package
+
+
+
+
+
+
native-win32-x64
@@ -689,6 +747,68 @@
+
+
+ attach-external-linuxmusl-x64-classifier
+
+
+ copilot.native.external.linuxmusl.x64.classifier.path
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+
+
+ validate-external-linuxmusl-x64-classifier
+ validate
+
+ exec
+
+
+ node
+
+ ${project.basedir}/scripts/validate-native-artifact.mjs
+ classifier
+ linuxmusl-x64
+ ${copilot.native.external.linuxmusl.x64.classifier.path}
+ ${project.build.finalName}-linuxmusl-x64.jar
+ ${copilot.sdk.root}
+
+
+
+
+
+
+ org.codehaus.mojo
+ build-helper-maven-plugin
+
+
+ attach-external-linuxmusl-x64-classifier
+ package
+
+ attach-artifact
+
+
+
+
+ ${copilot.native.external.linuxmusl.x64.classifier.path}
+ jar
+ linuxmusl-x64
+
+
+
+
+
+
+
+
+