From 75221868d68f38917b382bdadd0d93cc31c9d022 Mon Sep 17 00:00:00 2001 From: Philipp Page Date: Tue, 3 Mar 2026 11:49:42 +0100 Subject: [PATCH 01/10] Setup initial test matrix for test classes. --- .github/workflows/check-e2e.yml | 37 +++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/.github/workflows/check-e2e.yml b/.github/workflows/check-e2e.yml index e89051154..3004ad366 100644 --- a/.github/workflows/check-e2e.yml +++ b/.github/workflows/check-e2e.yml @@ -41,20 +41,31 @@ permissions: jobs: e2e: - name: End-to-end Tests (Java ${{ matrix.java }}) + name: E2E ${{ matrix.test-class }} (Java ${{ matrix.java }}) runs-on: ubuntu-latest permissions: id-token: write environment: E2E strategy: fail-fast: false - max-parallel: 4 + max-parallel: 3 matrix: java: - 11 - 17 - 21 - 25 + test-class: + - BatchE2ET + - IdempotencyE2ET + - LargeMessageE2ET + - LargeMessageIdempotentE2ET + - LoggingE2ET + - MetricsE2ET + - ParametersE2ET + - TracingE2ET + - ValidationALBE2ET + - ValidationApiGWE2ET steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -72,20 +83,30 @@ jobs: - name: Run e2e test with Maven env: JAVA_VERSION: ${{ matrix.java }} - run: mvn -DskipTests -ntp install --file pom.xml && mvn -Pe2e -B -ntp verify --file powertools-e2e-tests/pom.xml + run: > + mvn -DskipTests -ntp install --file pom.xml && + mvn -Pe2e -B -ntp + -Dit.test="${{ matrix.test-class }}" + verify --file powertools-e2e-tests/pom.xml e2e-graal: - name: End-to-end GraalVM Tests (Java ${{ matrix.java }}) + name: E2E GraalVM ${{ matrix.test-class }} (Java ${{ matrix.java }}) runs-on: ubuntu-latest permissions: id-token: write environment: E2E strategy: fail-fast: false - max-parallel: 1 + max-parallel: 3 matrix: java: - 25 + test-class: + - MetricsE2ET + - LoggingE2ET + - ParametersE2ET + - TracingE2ET + - IdempotencyE2ET steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -103,4 +124,8 @@ jobs: - name: Run e2e-graal test with Maven env: JAVA_VERSION: ${{ matrix.java }} - run: mvn -DskipTests -ntp install --file pom.xml && mvn -Pe2e-graal -B -ntp verify --file powertools-e2e-tests/pom.xml + run: > + mvn -DskipTests -ntp install --file pom.xml && + mvn -Pe2e-graal -B -ntp + -Dit.test="${{ matrix.test-class }}" + verify --file powertools-e2e-tests/pom.xml From b212ced5d1c771748bc5e9c68b9cd52990746126 Mon Sep 17 00:00:00 2001 From: Philipp Page Date: Tue, 3 Mar 2026 13:23:02 +0100 Subject: [PATCH 02/10] Increase concurrency and move build to its own step. --- .github/workflows/check-e2e.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/check-e2e.yml b/.github/workflows/check-e2e.yml index 3004ad366..db4021604 100644 --- a/.github/workflows/check-e2e.yml +++ b/.github/workflows/check-e2e.yml @@ -40,7 +40,7 @@ permissions: contents: read jobs: - e2e: + e2e: name: E2E ${{ matrix.test-class }} (Java ${{ matrix.java }}) runs-on: ubuntu-latest permissions: @@ -48,7 +48,7 @@ jobs: environment: E2E strategy: fail-fast: false - max-parallel: 3 + max-parallel: 10 matrix: java: - 11 @@ -75,6 +75,8 @@ jobs: distribution: 'corretto' java-version: ${{ matrix.java }} cache: maven + - name: Build all modules + run: mvn -DskipTests -ntp install --file pom.xml - name: Setup AWS credentials uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 # v6.0.0 with: @@ -84,7 +86,6 @@ jobs: env: JAVA_VERSION: ${{ matrix.java }} run: > - mvn -DskipTests -ntp install --file pom.xml && mvn -Pe2e -B -ntp -Dit.test="${{ matrix.test-class }}" verify --file powertools-e2e-tests/pom.xml @@ -97,7 +98,7 @@ jobs: environment: E2E strategy: fail-fast: false - max-parallel: 3 + max-parallel: 5 matrix: java: - 25 @@ -116,6 +117,8 @@ jobs: distribution: 'corretto' java-version: ${{ matrix.java }} cache: maven + - name: Build all modules + run: mvn -DskipTests -ntp install --file pom.xml - name: Setup AWS credentials uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 # v6.0.0 with: @@ -125,7 +128,6 @@ jobs: env: JAVA_VERSION: ${{ matrix.java }} run: > - mvn -DskipTests -ntp install --file pom.xml && mvn -Pe2e-graal -B -ntp -Dit.test="${{ matrix.test-class }}" verify --file powertools-e2e-tests/pom.xml From 7df7ca0b9723f9237b81e60973fb8ac02727061f Mon Sep 17 00:00:00 2001 From: Philipp Page Date: Tue, 3 Mar 2026 13:38:08 +0100 Subject: [PATCH 03/10] Add dynamic discovery of test classes to avoid duplication between pom.xml and GH actions script. --- .github/workflows/check-e2e.yml | 65 ++++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/.github/workflows/check-e2e.yml b/.github/workflows/check-e2e.yml index db4021604..166219dae 100644 --- a/.github/workflows/check-e2e.yml +++ b/.github/workflows/check-e2e.yml @@ -40,8 +40,53 @@ permissions: contents: read jobs: + discover-tests: + name: Discover E2E test classes + runs-on: ubuntu-latest + outputs: + e2e-classes: ${{ steps.parse.outputs.e2e-classes }} + e2e-graal-classes: ${{ steps.parse.outputs.e2e-graal-classes }} + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - name: Parse test classes from POM profiles + id: parse + run: | + TEST_DIR="powertools-e2e-tests/src/test/java" + POM="powertools-e2e-tests/pom.xml" + + # e2e profile uses **/*E2ET.java — find all matching test files + E2E_CLASSES=$(find "$TEST_DIR" -name '*E2ET.java' | xargs -n1 basename | sed 's/\.java$//' | sort | jq -R . | jq -s .) + + # Extract include patterns from e2e-graal profile, then match against test files + GRAAL_CLASSES=$( + awk '/e2e-graal<\/id>/,/<\/profile>/' "$POM" \ + | grep '' \ + | sed 's/.*\(.*\)<\/include>.*/\1/' \ + | while read -r pattern; do + filename="${pattern##*/}" + find "$TEST_DIR" -name "$filename" | xargs -n1 basename | sed 's/\.java$//' + done \ + | sort | jq -R . | jq -s . + ) + + echo "e2e test classes: $E2E_CLASSES" + echo "e2e-graal test classes: $GRAAL_CLASSES" + + if [ "$E2E_CLASSES" = "[]" ] || [ -z "$E2E_CLASSES" ]; then + echo "::error::No e2e test classes found — check POM includes and test directory" + exit 1 + fi + if [ "$GRAAL_CLASSES" = "[]" ] || [ -z "$GRAAL_CLASSES" ]; then + echo "::error::No e2e-graal test classes found — check POM includes and test directory" + exit 1 + fi + + echo "e2e-classes=$E2E_CLASSES" >> "$GITHUB_OUTPUT" + echo "e2e-graal-classes=$GRAAL_CLASSES" >> "$GITHUB_OUTPUT" + e2e: name: E2E ${{ matrix.test-class }} (Java ${{ matrix.java }}) + needs: discover-tests runs-on: ubuntu-latest permissions: id-token: write @@ -55,17 +100,7 @@ jobs: - 17 - 21 - 25 - test-class: - - BatchE2ET - - IdempotencyE2ET - - LargeMessageE2ET - - LargeMessageIdempotentE2ET - - LoggingE2ET - - MetricsE2ET - - ParametersE2ET - - TracingE2ET - - ValidationALBE2ET - - ValidationApiGWE2ET + test-class: ${{ fromJSON(needs.discover-tests.outputs.e2e-classes) }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -92,6 +127,7 @@ jobs: e2e-graal: name: E2E GraalVM ${{ matrix.test-class }} (Java ${{ matrix.java }}) + needs: discover-tests runs-on: ubuntu-latest permissions: id-token: write @@ -102,12 +138,7 @@ jobs: matrix: java: - 25 - test-class: - - MetricsE2ET - - LoggingE2ET - - ParametersE2ET - - TracingE2ET - - IdempotencyE2ET + test-class: ${{ fromJSON(needs.discover-tests.outputs.e2e-graal-classes) }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 From efb4672064abc5a86ccdc8b4c205279150a4a41d Mon Sep 17 00:00:00 2001 From: Philipp Page Date: Tue, 3 Mar 2026 13:40:03 +0100 Subject: [PATCH 04/10] output single-line JSON as multi-line is not supported with GITHUB_OUTPUT. --- .github/workflows/check-e2e.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check-e2e.yml b/.github/workflows/check-e2e.yml index 166219dae..f9fc08f3d 100644 --- a/.github/workflows/check-e2e.yml +++ b/.github/workflows/check-e2e.yml @@ -55,7 +55,7 @@ jobs: POM="powertools-e2e-tests/pom.xml" # e2e profile uses **/*E2ET.java — find all matching test files - E2E_CLASSES=$(find "$TEST_DIR" -name '*E2ET.java' | xargs -n1 basename | sed 's/\.java$//' | sort | jq -R . | jq -s .) + E2E_CLASSES=$(find "$TEST_DIR" -name '*E2ET.java' | xargs -n1 basename | sed 's/\.java$//' | sort | jq -R . | jq -sc .) # Extract include patterns from e2e-graal profile, then match against test files GRAAL_CLASSES=$( @@ -66,7 +66,7 @@ jobs: filename="${pattern##*/}" find "$TEST_DIR" -name "$filename" | xargs -n1 basename | sed 's/\.java$//' done \ - | sort | jq -R . | jq -s . + | sort | jq -R . | jq -sc . ) echo "e2e test classes: $E2E_CLASSES" From f03682119e35971c8a9d8860631edb3370fd86a5 Mon Sep 17 00:00:00 2001 From: Philipp Page Date: Tue, 3 Mar 2026 13:44:49 +0100 Subject: [PATCH 05/10] increase degree of concurreny to max 25 (20 for e2e and 5 for e2e-graal). --- .github/workflows/check-e2e.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check-e2e.yml b/.github/workflows/check-e2e.yml index f9fc08f3d..457ea5390 100644 --- a/.github/workflows/check-e2e.yml +++ b/.github/workflows/check-e2e.yml @@ -93,7 +93,7 @@ jobs: environment: E2E strategy: fail-fast: false - max-parallel: 10 + max-parallel: 20 matrix: java: - 11 From f35254b27e1cd4f2454040f3eef1e02511c109d7 Mon Sep 17 00:00:00 2001 From: Philipp Page Date: Tue, 3 Mar 2026 15:16:39 +0100 Subject: [PATCH 06/10] Update .github/workflows/check-e2e.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/workflows/check-e2e.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check-e2e.yml b/.github/workflows/check-e2e.yml index 457ea5390..b0934dafe 100644 --- a/.github/workflows/check-e2e.yml +++ b/.github/workflows/check-e2e.yml @@ -111,7 +111,7 @@ jobs: java-version: ${{ matrix.java }} cache: maven - name: Build all modules - run: mvn -DskipTests -ntp install --file pom.xml + run: mvn -B -DskipTests -ntp install --file pom.xml - name: Setup AWS credentials uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 # v6.0.0 with: From fb4157f491ec70a1937a21fbbfe912ccef340f43 Mon Sep 17 00:00:00 2001 From: Philipp Page Date: Tue, 3 Mar 2026 15:22:29 +0100 Subject: [PATCH 07/10] Address PR comments by Copilot. --- .github/workflows/check-e2e.yml | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/.github/workflows/check-e2e.yml b/.github/workflows/check-e2e.yml index b0934dafe..fbb01bc0b 100644 --- a/.github/workflows/check-e2e.yml +++ b/.github/workflows/check-e2e.yml @@ -54,20 +54,23 @@ jobs: TEST_DIR="powertools-e2e-tests/src/test/java" POM="powertools-e2e-tests/pom.xml" - # e2e profile uses **/*E2ET.java — find all matching test files - E2E_CLASSES=$(find "$TEST_DIR" -name '*E2ET.java' | xargs -n1 basename | sed 's/\.java$//' | sort | jq -R . | jq -sc .) - - # Extract include patterns from e2e-graal profile, then match against test files - GRAAL_CLASSES=$( - awk '/e2e-graal<\/id>/,/<\/profile>/' "$POM" \ + # Extracts patterns from a POM profile, resolves them + # against the test directory, and outputs a compact JSON array + # of class names (without .java suffix). + resolve_classes() { + local profile_id="$1" + awk "/${profile_id}<\\/id>/,/<\\/profile>/" "$POM" \ | grep '' \ | sed 's/.*\(.*\)<\/include>.*/\1/' \ | while read -r pattern; do filename="${pattern##*/}" - find "$TEST_DIR" -name "$filename" | xargs -n1 basename | sed 's/\.java$//' + find "$TEST_DIR" -name "$filename" -print0 | xargs -0 -r basename -a done \ - | sort | jq -R . | jq -sc . - ) + | sed 's/\.java$//' | sort -u | jq -R . | jq -sc . + } + + E2E_CLASSES=$(resolve_classes "e2e") + GRAAL_CLASSES=$(resolve_classes "e2e-graal") echo "e2e test classes: $E2E_CLASSES" echo "e2e-graal test classes: $GRAAL_CLASSES" @@ -149,7 +152,7 @@ jobs: java-version: ${{ matrix.java }} cache: maven - name: Build all modules - run: mvn -DskipTests -ntp install --file pom.xml + run: mvn -B -DskipTests -ntp install --file pom.xml - name: Setup AWS credentials uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 # v6.0.0 with: From 7abe0dc2a74ad06e8ff48a09eeddd066d29b063c Mon Sep 17 00:00:00 2001 From: Philipp Page Date: Tue, 3 Mar 2026 15:35:28 +0100 Subject: [PATCH 08/10] Update .github/workflows/check-e2e.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/workflows/check-e2e.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/check-e2e.yml b/.github/workflows/check-e2e.yml index fbb01bc0b..b0cacf218 100644 --- a/.github/workflows/check-e2e.yml +++ b/.github/workflows/check-e2e.yml @@ -63,8 +63,7 @@ jobs: | grep '' \ | sed 's/.*\(.*\)<\/include>.*/\1/' \ | while read -r pattern; do - filename="${pattern##*/}" - find "$TEST_DIR" -name "$filename" -print0 | xargs -0 -r basename -a + find "$TEST_DIR" -type f -path "$TEST_DIR/$pattern" -print0 | xargs -0 -r basename -a done \ | sed 's/\.java$//' | sort -u | jq -R . | jq -sc . } From 54a6aa99225cad0158e5455db12799ed9c501387 Mon Sep 17 00:00:00 2001 From: Philipp Page Date: Tue, 3 Mar 2026 15:35:39 +0100 Subject: [PATCH 09/10] Update .github/workflows/check-e2e.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/workflows/check-e2e.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/check-e2e.yml b/.github/workflows/check-e2e.yml index b0cacf218..b39cf9cf7 100644 --- a/.github/workflows/check-e2e.yml +++ b/.github/workflows/check-e2e.yml @@ -59,13 +59,13 @@ jobs: # of class names (without .java suffix). resolve_classes() { local profile_id="$1" - awk "/${profile_id}<\\/id>/,/<\\/profile>/" "$POM" \ - | grep '' \ + | grep '' || true \ | sed 's/.*\(.*\)<\/include>.*/\1/' \ | while read -r pattern; do - find "$TEST_DIR" -type f -path "$TEST_DIR/$pattern" -print0 | xargs -0 -r basename -a + filename="${pattern##*/}" + find "$TEST_DIR" -name "$filename" -print0 | xargs -0 -r basename -a done \ - | sed 's/\.java$//' | sort -u | jq -R . | jq -sc . + | sed 's/\.java$//' | sort -u | jq -R . | jq -sc 'if length == 0 then [] else . end' } E2E_CLASSES=$(resolve_classes "e2e") From 38f80bb2e57a9a6c0dc181d07443776a0e1780bb Mon Sep 17 00:00:00 2001 From: Philipp Page Date: Tue, 3 Mar 2026 15:45:34 +0100 Subject: [PATCH 10/10] Fix syntax error caused by Copilot. --- .github/workflows/check-e2e.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/check-e2e.yml b/.github/workflows/check-e2e.yml index b39cf9cf7..daf079efe 100644 --- a/.github/workflows/check-e2e.yml +++ b/.github/workflows/check-e2e.yml @@ -59,13 +59,13 @@ jobs: # of class names (without .java suffix). resolve_classes() { local profile_id="$1" - | grep '' || true \ + awk "/${profile_id}<\\/id>/,/<\\/profile>/" "$POM" \ + | { grep '' || true; } \ | sed 's/.*\(.*\)<\/include>.*/\1/' \ | while read -r pattern; do - filename="${pattern##*/}" - find "$TEST_DIR" -name "$filename" -print0 | xargs -0 -r basename -a + find "$TEST_DIR" -type f -path "$TEST_DIR/$pattern" -print0 | xargs -0 -r basename -a done \ - | sed 's/\.java$//' | sort -u | jq -R . | jq -sc 'if length == 0 then [] else . end' + | sed 's/\.java$//' | sort -u | jq -R . | jq -sc . } E2E_CLASSES=$(resolve_classes "e2e")