From 6276d3b8fc1c5a5cc7da27b077166cbfe8aed26b Mon Sep 17 00:00:00 2001 From: Jagdish Prajapati Date: Fri, 5 Sep 2025 16:10:52 +0530 Subject: [PATCH 1/3] Run test for only changed exercises --- .github/workflows/java.yml | 20 ++++++++++++++++- bin/test-changed-exercise | 44 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 bin/test-changed-exercise diff --git a/.github/workflows/java.yml b/.github/workflows/java.yml index 48fc8795a..a966405ee 100644 --- a/.github/workflows/java.yml +++ b/.github/workflows/java.yml @@ -39,8 +39,9 @@ jobs: run: ./gradlew check --exclude-task test --continue working-directory: exercises - test: + test-all: name: Test all exercises using java-test-runner + if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' runs-on: ubuntu-24.04 steps: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 @@ -52,3 +53,20 @@ jobs: name: test-results path: exercises/**/build/results.json if: failure() + + test-changed: + name: Test changed exercises using java-test-runner + if: github.event_name == 'pull_request' + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 + with: + fetch-depth: 0 + - name: Test changed exercises using java-test-runner + run: bin/test-changed-exercise + - name: Archive test results + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 + with: + name: test-results + path: exercises/**/build/results.json + if: failure() diff --git a/bin/test-changed-exercise b/bin/test-changed-exercise new file mode 100644 index 000000000..d930478f6 --- /dev/null +++ b/bin/test-changed-exercise @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +set -eo pipefail + +# Determine the base branch of the PR +BASE_BRANCH=${GITHUB_BASE_REF:-main} + +# Fetch full history for proper diff +git fetch origin "$BASE_BRANCH" + +# Compute merge base +MERGE_BASE=$(git merge-base HEAD origin/$BASE_BRANCH) + +# Get changed files relative to merge base +changed_files=$(git diff --name-only "$MERGE_BASE" HEAD) + +# Extract unique exercise directories +changed_exercises=$(echo "$changed_files" | \ + grep -E '^exercises/(practice|concept)/[^/]+/.+\.(java|gradle)$' | \ + cut -d/ -f1-3 | sort -u) + +if [ -z "$changed_exercises" ]; then + echo "No relevant exercises changed, skipping tests." + exit 0 +fi + +# Print exercises +echo "Changed exercises detected:" +echo "$changed_exercises" +echo "----------------------------------------" + +# Run tests +for dir in $changed_exercises; do + slug=$(basename "$dir") + + echo "========================================" + echo "=== Running tests for $slug ===" + echo "========================================" + + if [[ $dir == exercises/practice/* ]]; then + ./exercises/gradlew -p exercises ":practice:$slug:test" + elif [[ $dir == exercises/concept/* ]]; then + ./exercises/gradlew -p exercises ":concept:$slug:test" + fi +done From f897273692e8c632865da385eb9292f77987d4a4 Mon Sep 17 00:00:00 2001 From: Jagdish Prajapati Date: Fri, 5 Sep 2025 16:18:29 +0530 Subject: [PATCH 2/3] Make test-changed-exercise executable --- bin/test-changed-exercise | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 bin/test-changed-exercise diff --git a/bin/test-changed-exercise b/bin/test-changed-exercise old mode 100644 new mode 100755 From 3afd338f36e90c1095c0b1b7c1a1708b54f1f623 Mon Sep 17 00:00:00 2001 From: Jagdish Prajapati Date: Sat, 6 Sep 2025 22:25:20 +0530 Subject: [PATCH 3/3] Update bin/test-changed-exercise Co-authored-by: Kah Goh --- bin/test-changed-exercise | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/test-changed-exercise b/bin/test-changed-exercise index d930478f6..776e940e1 100755 --- a/bin/test-changed-exercise +++ b/bin/test-changed-exercise @@ -8,7 +8,7 @@ BASE_BRANCH=${GITHUB_BASE_REF:-main} git fetch origin "$BASE_BRANCH" # Compute merge base -MERGE_BASE=$(git merge-base HEAD origin/$BASE_BRANCH) +MERGE_BASE=$(git merge-base HEAD origin/"$BASE_BRANCH") # Get changed files relative to merge base changed_files=$(git diff --name-only "$MERGE_BASE" HEAD)