Skip to content

Commit 69d0d04

Browse files
committed
Run test for only changed exercises
1 parent 21f79eb commit 69d0d04

2 files changed

Lines changed: 52 additions & 1 deletion

File tree

.github/workflows/java.yml

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ jobs:
3939
run: ./gradlew check --exclude-task test --continue
4040
working-directory: exercises
4141

42-
test:
42+
test-all:
4343
name: Test all exercises using java-test-runner
44+
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
4445
runs-on: ubuntu-24.04
4546
steps:
4647
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8
@@ -52,3 +53,18 @@ jobs:
5253
name: test-results
5354
path: exercises/**/build/results.json
5455
if: failure()
56+
57+
test-changed:
58+
name: Test changed exercises using java-test-runner
59+
if: github.event_name == 'pull_request'
60+
runs-on: ubuntu-24.04
61+
steps:
62+
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8
63+
- name: Test all exercises using java-test-runner
64+
run: bin/test-changed-exercise
65+
- name: Archive test results
66+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
67+
with:
68+
name: test-results
69+
path: exercises/**/build/results.json
70+
if: failure()

bin/test-changed-exercise

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#!/usr/bin/env bash
2+
set -eo pipefail
3+
4+
# Fetch base branch to compare against
5+
git fetch origin main
6+
7+
# Get changed files in this PR
8+
changed_files=$(git diff --name-only origin/main...HEAD)
9+
10+
# Extract unique exercise directories (concept/*/<slug> or practice/*/<slug>)
11+
changed_exercises=$(echo "$changed_files" | \
12+
grep -E '^exercises/(practice|concept)/[^/]+/.*\.(java|json|gradle)$' | \
13+
cut -d/ -f1-3 | sort -u)
14+
15+
if [ -z "$changed_exercises" ]; then
16+
echo "No relevant exercises changed, skipping tests."
17+
exit 0
18+
fi
19+
20+
# Source the original script so we can reuse verify_exercise
21+
source ./bin/test-with-test-runner
22+
23+
# Run verify_exercise for each changed exercise
24+
for dir in $changed_exercises; do
25+
slug=$(basename "$dir")
26+
if [[ $dir == exercises/practice/* ]]; then
27+
echo "Checking $slug (practice)..."
28+
verify_exercise "$dir" "example" "practice"
29+
elif [[ $dir == exercises/concept/* ]]; then
30+
echo "Checking $slug (concept)..."
31+
verify_exercise "$dir" "exemplar" "concept"
32+
fi
33+
done
34+
35+
exit ${exit_code}

0 commit comments

Comments
 (0)