diff --git a/.github/workflows/java.yml b/.github/workflows/java.yml index ef2f2017e..eb9393519 100644 --- a/.github/workflows/java.yml +++ b/.github/workflows/java.yml @@ -11,8 +11,9 @@ on: workflow_dispatch: jobs: - build: + build-all: name: Check if tests compile cleanly with starter sources + if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' runs-on: ubuntu-24.04 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd @@ -25,6 +26,22 @@ jobs: run: ./gradlew compileStarterTestJava --continue working-directory: exercises + build-changed: + name: Check if changed exercise tests compile cleanly with starter sources + if: github.event_name == 'pull_request' + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + with: + fetch-depth: 0 + - name: Set up JDK 21 + uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 + with: + java-version: 21 + distribution: "temurin" + - name: Check if changed exercise tests compile cleanly + run: bin/build-changed-exercise + lint: name: Lint Java files using Checkstyle runs-on: ubuntu-24.04 diff --git a/bin/build-changed-exercise b/bin/build-changed-exercise new file mode 100755 index 000000000..ebb52a69e --- /dev/null +++ b/bin/build-changed-exercise @@ -0,0 +1,54 @@ +#!/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) + +# If any Gradle build file changed, run the full suite and exit +if echo "$changed_files" | grep -qE '\.(gradle|gradlew|bat)$|settings\.gradle'; then + echo "Gradle build files changed, running full build suite..." + cd exercises && ./gradlew compileStarterTestJava --continue + exit 0 +fi + +# Extract unique exercise directories +changed_exercises=$(echo "$changed_files" | \ + grep -E '^exercises/(practice|concept)/[^/]+/.+\.java$' | \ + cut -d/ -f1-3 | sort -u || true) + +if [ -z "$changed_exercises" ]; then + echo "No relevant exercises changed, skipping compile checks." + exit 0 +fi + +# Print exercises +echo "Changed exercises detected:" +echo "$changed_exercises" +echo "----------------------------------------" + +# Run build compile checks +exit_code=0 +for dir in $changed_exercises; do + slug=$(basename "$dir") + + echo "========================================" + echo "=== Running compileStarterTestJava for $slug ===" + echo "========================================" + + if [[ $dir == exercises/practice/* ]]; then + ./exercises/gradlew -p exercises ":practice:$slug:compileStarterTestJava" || exit_code=1 + elif [[ $dir == exercises/concept/* ]]; then + ./exercises/gradlew -p exercises ":concept:$slug:compileStarterTestJava" || exit_code=1 + fi +done + +exit $exit_code