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 100755 index 000000000..776e940e1 --- /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