diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 04fcf19..d6336ba 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,12 +16,28 @@ jobs: - uses: actions/checkout@v6 with: persist-credentials: false + fetch-depth: 0 + - name: Relevant changes + id: changes + run: | + if [ "$GITHUB_EVENT_NAME" = "pull_request" ]; then + git fetch --no-tags origin "$GITHUB_BASE_REF" + base="origin/$GITHUB_BASE_REF" + else + base='${{ github.event.before }}' + fi + if git diff --quiet "$base"...HEAD -- '*.go' go.mod go.sum Dockerfile .dockerignore .github data README.md; then + echo "code=false" >> "$GITHUB_OUTPUT" + else + echo "code=true" >> "$GITHUB_OUTPUT" + fi # `docker build` streams the context to the daemon. A compose bind-mount of # `.` mounts an empty host dir instead, because the job is itself a container. - name: Latest supported Go + if: ${{ steps.changes.outputs.code == 'true' }} run: docker build . # Runs even when the step above failed, so a red build says whether the # failure is version-specific. - name: Lowest supported Go - if: ${{ !cancelled() }} + if: ${{ !cancelled() && steps.changes.outputs.code == 'true' }} run: docker build --build-arg GO_VERSION=1.22.12 . diff --git a/README.md b/README.md index ab1d65d..c1b21da 100644 --- a/README.md +++ b/README.md @@ -484,8 +484,10 @@ docker compose run --rm --user "$(id -u):$(id -g)" tidy # go mod tidy ``` Every pull request runs `docker build .` against both the latest and the lowest -supported Go, and must pass before it can be merged. That build is the whole -gate — vet, complexity, format check and tests — so run it locally before pushing: +supported Go, and must pass before it can be merged — unless it changes none of +the files the build and its tests read, nor the workflow itself, in which case +it's skipped (see [Decisions](#decisions)). That build is the whole gate — vet, +complexity, format check and tests — so run it locally before pushing: ```sh docker build . # latest