From 2444cc9e0bc32be3ac5872b696685d86684ac2cb Mon Sep 17 00:00:00 2001 From: Maxime David Date: Tue, 18 Aug 2026 18:48:06 +0000 Subject: [PATCH 1/4] fix: speed up CI --- .../workflows/runtime-interface-client_pr.yml | 22 ++++++++++--------- .../Makefile | 11 ++++++++-- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/.github/workflows/runtime-interface-client_pr.yml b/.github/workflows/runtime-interface-client_pr.yml index a0d8c6cc8..bd1e0e536 100644 --- a/.github/workflows/runtime-interface-client_pr.yml +++ b/.github/workflows/runtime-interface-client_pr.yml @@ -46,7 +46,15 @@ jobs: IS_JAVA_8: true build: - runs-on: ubuntu-latest + strategy: + fail-fast: true + matrix: + include: + - arch: x86_64 + runner: ubuntu-latest + - arch: aarch64 + runner: ubuntu-24.04-arm + runs-on: ${{ matrix.runner }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 @@ -57,17 +65,11 @@ jobs: distribution: corretto cache: maven - - name: Set up QEMU - uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3 - - name: Set up Docker Buildx uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3 with: install: true - - name: Available buildx platforms - run: echo ${{ steps.buildx.outputs.platforms }} - - name: Build and install core dependency locally working-directory: ./aws-lambda-java-core run: mvn clean install @@ -76,16 +78,16 @@ jobs: working-directory: ./aws-lambda-java-serialization run: mvn clean install - - name: Test Runtime Interface Client xplatform build - Run 'build' target + - name: Test Runtime Interface Client build - Run 'build-${{ matrix.arch }}' target working-directory: ./aws-lambda-java-runtime-interface-client - run: make build + run: make build-${{ matrix.arch }} env: IS_JAVA_8: true - name: Save the built jar uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: - name: aws-lambda-java-runtime-interface-client + name: aws-lambda-java-runtime-interface-client-${{ matrix.arch }} path: ./aws-lambda-java-runtime-interface-client/target/aws-lambda-java-runtime-interface-client-*.jar - name: Upload coverage to Codecov diff --git a/aws-lambda-java-runtime-interface-client/Makefile b/aws-lambda-java-runtime-interface-client/Makefile index 6c3a268fb..788a2beac 100644 --- a/aws-lambda-java-runtime-interface-client/Makefile +++ b/aws-lambda-java-runtime-interface-client/Makefile @@ -50,10 +50,17 @@ dev: test pr: test test-smoke .PHONY: build -build: - mvn clean install $(EXTRA_LOAD_ARG) +build: build-x86_64 build-aarch64 + +.PHONY: build-x86_64 +build-x86_64: + mvn clean install -DmultiArch=false $(EXTRA_LOAD_ARG) mvn install -P linux-x86_64 $(EXTRA_LOAD_ARG) mvn install -P linux_musl-x86_64 $(EXTRA_LOAD_ARG) + +.PHONY: build-aarch64 +build-aarch64: + mvn clean install -DmultiArch=false $(EXTRA_LOAD_ARG) mvn install -P linux-aarch64 $(EXTRA_LOAD_ARG) mvn install -P linux_musl-aarch64 $(EXTRA_LOAD_ARG) From 81a50823c831a5ae876c66f02e873cc69152d007 Mon Sep 17 00:00:00 2001 From: Maxime David Date: Tue, 18 Aug 2026 19:29:31 +0000 Subject: [PATCH 2/4] fix: build native JNI lib on aarch64 CI runners The multiArch=false path skips architectures whose name doesn't match the host arch, but ARCHITECTURES uses Maven's classifier spelling 'aarch_64' while `arch` reports 'aarch64'. On the ARM runner this mismatch caused every arch to be skipped, so no .so was built and the unit tests crashed loading the native library. Normalize the host arch to 'aarch_64' before comparing. --- .../src/main/jni/build-jni-lib.sh | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/aws-lambda-java-runtime-interface-client/src/main/jni/build-jni-lib.sh b/aws-lambda-java-runtime-interface-client/src/main/jni/build-jni-lib.sh index 44a290b6a..5323030fa 100755 --- a/aws-lambda-java-runtime-interface-client/src/main/jni/build-jni-lib.sh +++ b/aws-lambda-java-runtime-interface-client/src/main/jni/build-jni-lib.sh @@ -118,10 +118,17 @@ else declare -a ARCHITECTURES=("x86_64" "aarch_64") declare -a LIBC_IMPLS=("glibc" "musl") + # `arch` reports the host as `aarch64`, but we use Maven's classifier + # spelling `aarch_64` in ARCHITECTURES, so normalize before comparing. + host_arch=$(arch) + if [ "${host_arch}" == "aarch64" ]; then + host_arch="aarch_64" + fi + for arch in "${ARCHITECTURES[@]}"; do - if [[ "${MULTI_ARCH}" != "true" ]] && [[ "$(arch)" != "${arch}" ]]; then - echo "multi arch build not requested and host arch is $(arch), so skipping ${arch}..." + if [[ "${MULTI_ARCH}" != "true" ]] && [[ "${host_arch}" != "${arch}" ]]; then + echo "multi arch build not requested and host arch is ${host_arch}, so skipping ${arch}..." continue fi From 891251eb0f10ce5dcc932f3460bb70c8dd840e63 Mon Sep 17 00:00:00 2001 From: Maxime David Date: Tue, 18 Aug 2026 22:45:31 +0000 Subject: [PATCH 3/4] fix: speed up smoke tests --- .../workflows/runtime-interface-client_pr.yml | 14 ++++++++++--- .../Makefile | 20 +++++++++++++++++-- .../codebuild/buildspec.os.alpine.yml | 2 +- .../codebuild/buildspec.os.amazoncorretto.yml | 2 +- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/.github/workflows/runtime-interface-client_pr.yml b/.github/workflows/runtime-interface-client_pr.yml index bd1e0e536..33a041f64 100644 --- a/.github/workflows/runtime-interface-client_pr.yml +++ b/.github/workflows/runtime-interface-client_pr.yml @@ -20,7 +20,15 @@ permissions: jobs: smoke-test: - runs-on: ubuntu-latest + strategy: + fail-fast: true + matrix: + include: + - arch: x86_64 + runner: ubuntu-latest + - arch: aarch64 + runner: ubuntu-24.04-arm + runs-on: ${{ matrix.runner }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 @@ -39,9 +47,9 @@ jobs: working-directory: ./aws-lambda-java-serialization run: mvn clean install - - name: Runtime Interface Client smoke tests - Run 'pr' target + - name: Runtime Interface Client smoke tests - Run 'pr-${{ matrix.arch }}' target working-directory: ./aws-lambda-java-runtime-interface-client - run: make pr + run: make pr-${{ matrix.arch }} env: IS_JAVA_8: true diff --git a/aws-lambda-java-runtime-interface-client/Makefile b/aws-lambda-java-runtime-interface-client/Makefile index 788a2beac..e651abc96 100644 --- a/aws-lambda-java-runtime-interface-client/Makefile +++ b/aws-lambda-java-runtime-interface-client/Makefile @@ -30,11 +30,20 @@ setup-codebuild-agent: --build-arg ARCHITECTURE=$(ARCHITECTURE_ALIAS) \ - < test/integration/codebuild-local/Dockerfile.agent +# Smoke tests are split per-architecture so CI can run each set on a native +# runner. Running the linux/arm64/v8 combos under QEMU on an x86_64 host makes +# `mvn install` recompile curl for aarch64 emulated, which takes ~30 minutes. .PHONY: test-smoke -test-smoke: setup-codebuild-agent +test-smoke: test-smoke-x86_64 test-smoke-aarch64 + +.PHONY: test-smoke-x86_64 +test-smoke-x86_64: setup-codebuild-agent CODEBUILD_IMAGE_TAG=codebuild-agent test/integration/codebuild-local/test_one.sh test/integration/codebuild/buildspec.os.alpine.yml alpine 3.15 corretto11 linux/amd64 - CODEBUILD_IMAGE_TAG=codebuild-agent test/integration/codebuild-local/test_one.sh test/integration/codebuild/buildspec.os.alpine.yml alpine 3.15 corretto11 linux/arm64/v8 CODEBUILD_IMAGE_TAG=codebuild-agent test/integration/codebuild-local/test_one.sh test/integration/codebuild/buildspec.os.amazoncorretto.yml amazoncorretto amazoncorretto 11 linux/amd64 + +.PHONY: test-smoke-aarch64 +test-smoke-aarch64: setup-codebuild-agent + CODEBUILD_IMAGE_TAG=codebuild-agent test/integration/codebuild-local/test_one.sh test/integration/codebuild/buildspec.os.alpine.yml alpine 3.15 corretto11 linux/arm64/v8 CODEBUILD_IMAGE_TAG=codebuild-agent test/integration/codebuild-local/test_one.sh test/integration/codebuild/buildspec.os.amazoncorretto.yml amazoncorretto amazoncorretto 11 linux/arm64/v8 .PHONY: test-integ @@ -49,6 +58,13 @@ dev: test .PHONY: pr pr: test test-smoke +# Per-architecture PR checks so CI can run each on a native runner (no QEMU). +.PHONY: pr-x86_64 +pr-x86_64: test test-smoke-x86_64 + +.PHONY: pr-aarch64 +pr-aarch64: test test-smoke-aarch64 + .PHONY: build build: build-x86_64 build-aarch64 diff --git a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.alpine.yml b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.alpine.yml index 2a71cb1b0..afc68fd76 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.alpine.yml +++ b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.alpine.yml @@ -45,7 +45,7 @@ phases: # Install serialization (dependency of RIC) - (cd aws-lambda-java-core && mvn install) - (cd aws-lambda-java-serialization && mvn install) - - (cd aws-lambda-java-runtime-interface-client && mvn install -DargLineForReflectionTestOnly="") + - (cd aws-lambda-java-runtime-interface-client && mvn install -DmultiArch=false -DargLineForReflectionTestOnly="") - (cd aws-lambda-java-runtime-interface-client/test/integration/test-handler && mvn install) - export IMAGE_TAG="java-${OS_DISTRIBUTION}-${DISTRO_VERSION}:${RUNTIME_VERSION}" - echo "Extracting and including Runtime Interface Emulator" diff --git a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.amazoncorretto.yml b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.amazoncorretto.yml index db8bf2ba0..e5a586b91 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.amazoncorretto.yml +++ b/aws-lambda-java-runtime-interface-client/test/integration/codebuild/buildspec.os.amazoncorretto.yml @@ -44,7 +44,7 @@ phases: # Install serialization (dependency of RIC) - (cd aws-lambda-java-core && mvn install) - (cd aws-lambda-java-serialization && mvn install) - - (cd aws-lambda-java-runtime-interface-client && mvn install -DargLineForReflectionTestOnly="") + - (cd aws-lambda-java-runtime-interface-client && mvn install -DmultiArch=false -DargLineForReflectionTestOnly="") - (cd aws-lambda-java-runtime-interface-client/test/integration/test-handler && mvn install) - export IMAGE_TAG="java-${OS_DISTRIBUTION}-${DISTRO_VERSION}:${RUNTIME_VERSION}" - echo "Extracting and including Runtime Interface Emulator" From 884dd85ebb1b0f621d315ea545a2a8059ced6eef Mon Sep 17 00:00:00 2001 From: Maxime David Date: Wed, 19 Aug 2026 15:53:40 +0000 Subject: [PATCH 4/4] fix: pr comments --- .../workflows/runtime-interface-client_pr.yml | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/.github/workflows/runtime-interface-client_pr.yml b/.github/workflows/runtime-interface-client_pr.yml index 33a041f64..b8fb8cfbe 100644 --- a/.github/workflows/runtime-interface-client_pr.yml +++ b/.github/workflows/runtime-interface-client_pr.yml @@ -19,7 +19,7 @@ permissions: jobs: - smoke-test: + smoke-test-arch: strategy: fail-fast: true matrix: @@ -29,6 +29,7 @@ jobs: - arch: aarch64 runner: ubuntu-24.04-arm runs-on: ${{ matrix.runner }} + name: "smoke-test (${{ matrix.arch }})" steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 @@ -53,7 +54,7 @@ jobs: env: IS_JAVA_8: true - build: + build-arch: strategy: fail-fast: true matrix: @@ -63,6 +64,7 @@ jobs: - arch: aarch64 runner: ubuntu-24.04-arm runs-on: ${{ matrix.runner }} + name: "build (${{ matrix.arch }})" steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 @@ -103,3 +105,27 @@ jobs: uses: codecov/codecov-action@75cd11691c0faa626561e295848008c8a7dddffe # v5 env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + + smoke-test: + needs: smoke-test-arch + if: always() + runs-on: ubuntu-latest + steps: + - name: Check smoke-test results + run: | + if [ "${{ needs.smoke-test-arch.result }}" != "success" ]; then + echo "Smoke tests failed on one or more architectures" + exit 1 + fi + + build: + needs: build-arch + if: always() + runs-on: ubuntu-latest + steps: + - name: Check build results + run: | + if [ "${{ needs.build-arch.result }}" != "success" ]; then + echo "Build failed on one or more architectures" + exit 1 + fi