Skip to content

Commit 766c84e

Browse files
authored
Testing workflow (#3002)
* Run test for only changed exercises
1 parent 21f79eb commit 766c84e

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

.github/workflows/java.yml

Lines changed: 19 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,20 @@ 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+
with:
64+
fetch-depth: 0
65+
- name: Test changed exercises using java-test-runner
66+
run: bin/test-changed-exercise
67+
- name: Archive test results
68+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
69+
with:
70+
name: test-results
71+
path: exercises/**/build/results.json
72+
if: failure()

bin/test-changed-exercise

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#!/usr/bin/env bash
2+
set -eo pipefail
3+
4+
# Determine the base branch of the PR
5+
BASE_BRANCH=${GITHUB_BASE_REF:-main}
6+
7+
# Fetch full history for proper diff
8+
git fetch origin "$BASE_BRANCH"
9+
10+
# Compute merge base
11+
MERGE_BASE=$(git merge-base HEAD origin/"$BASE_BRANCH")
12+
13+
# Get changed files relative to merge base
14+
changed_files=$(git diff --name-only "$MERGE_BASE" HEAD)
15+
16+
# Extract unique exercise directories
17+
changed_exercises=$(echo "$changed_files" | \
18+
grep -E '^exercises/(practice|concept)/[^/]+/.+\.(java|gradle)$' | \
19+
cut -d/ -f1-3 | sort -u)
20+
21+
if [ -z "$changed_exercises" ]; then
22+
echo "No relevant exercises changed, skipping tests."
23+
exit 0
24+
fi
25+
26+
# Print exercises
27+
echo "Changed exercises detected:"
28+
echo "$changed_exercises"
29+
echo "----------------------------------------"
30+
31+
# Run tests
32+
for dir in $changed_exercises; do
33+
slug=$(basename "$dir")
34+
35+
echo "========================================"
36+
echo "=== Running tests for $slug ==="
37+
echo "========================================"
38+
39+
if [[ $dir == exercises/practice/* ]]; then
40+
./exercises/gradlew -p exercises ":practice:$slug:test"
41+
elif [[ $dir == exercises/concept/* ]]; then
42+
./exercises/gradlew -p exercises ":concept:$slug:test"
43+
fi
44+
done

0 commit comments

Comments
 (0)