From 3fca28810b80e3e87dea948e7fae59fcb56e838b Mon Sep 17 00:00:00 2001 From: Jean-Luc Makiola Date: Thu, 30 Jul 2026 11:22:23 +0200 Subject: [PATCH] Don't run the Android build for forge-housekeeping changes (#98) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI already skips the Android build for docs-only pull requests, and that part works — a README-only PR reports green in ~11s. The skip-list was just too narrow to catch a realistic docs PR. PR #96 is the example: a contributing guide, docs corrections and issue templates. It ran the full lint + test + assemble four times, over exactly two files Gradle never reads — `.forgejo/ISSUE_TEMPLATE/config.yml` and `.gitignore`. Added to the list: issue templates, `.planning/`, `licenses/`, `renovate.json5`, `.gitignore`, `.gitattributes`, `.editorconfig`. It stays a skip-list rather than a build-list, so an unfamiliar path still builds by default; the workflows themselves, `.gitmodules` and `scripts/` are deliberately not skippable. The step now also prints which files forced the build, so the next "why did my docs PR build?" is answerable from the log. One latent bug alongside it: `github.base_ref` is normalised against a `refs/heads/` prefix. Arriving in full-ref form would fail the merge-base lookup and quietly degrade the guard into "always build" — the failure mode this PR is fixing, but permanently and invisibly. Verified by replaying the new pattern over real history: PR #96 and #97 now skip; the forge migration (workflows), the search fix (app code) and a Weblate translation merge still build. No issue — reported directly. Co-authored-by: Jean-Luc Makiola Reviewed-on: https://codeberg.org/jlmakiola/calendula/pulls/98 --- .forgejo/workflows/ci.yaml | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/.forgejo/workflows/ci.yaml b/.forgejo/workflows/ci.yaml index 65831ab..834d026 100644 --- a/.forgejo/workflows/ci.yaml +++ b/.forgejo/workflows/ci.yaml @@ -37,14 +37,29 @@ jobs: - name: Reproducible-release invariant run: bash scripts/check_reproducible_release.sh - # Decide whether anything that affects the app build changed. Docs, - # F-Droid metadata and the licence don't, so those PRs skip the SDK + - # Gradle work below but still report a green `ci`. + # Decide whether anything that affects the app build changed. Docs, store + # metadata, licence texts and forge housekeeping don't, so those PRs skip + # the SDK + Gradle work below but still report a green `ci`. - name: Classify change scope id: scope + env: + # Deliberately a skip-list, not a build-list: a path nobody thought + # about defaults to building. Only paths the Gradle build provably + # never reads belong here — note that the workflows themselves, the + # `.gitmodules` submodule pointer and `scripts/` are *not* in it. + SKIP_RE: '(\.md$|^docs/|^fastlane/|^fdroid-metadata/|^licenses/|^\.planning/|^\.(forgejo|gitea)/ISSUE_TEMPLATE/|^\.editorconfig$|^\.gitattributes$|^\.gitignore$|^renovate\.json5$|^LICENSE$)' run: | set -e BASE="${{ github.base_ref }}" + # Normally the bare branch name; tolerate a full ref, which would + # otherwise make the merge-base lookup fail and quietly degrade this + # guard into "always build". + BASE="${BASE#refs/heads/}" + if [ -z "$BASE" ]; then + echo "No base branch on this event — running the full build to be safe." + echo "code=true" >> "$GITHUB_OUTPUT" + exit 0 + fi # Full (not --depth=1) base fetch so the merge-base is present even when # the PR branch forked several commits back; a shallow tip has no merge # base with a divergent branch and `git diff base...HEAD` aborts. @@ -58,11 +73,15 @@ jobs: fi CHANGED=$(git diff --name-only "$MB" HEAD) echo "Changed files:"; echo "$CHANGED" - if echo "$CHANGED" | grep -vE '(\.md$|^docs/|^fdroid-metadata/|^fastlane/|^LICENSE$)' | grep -q .; then + RELEVANT=$(echo "$CHANGED" | grep -vE "$SKIP_RE" || true) + if [ -n "$RELEVANT" ]; then + # Naming them makes "why did my docs PR build for four minutes?" + # answerable from the log alone. + echo "Build-relevant changes:"; echo "$RELEVANT" echo "code=true" >> "$GITHUB_OUTPUT" else - echo "code=false" >> "$GITHUB_OUTPUT" echo "Docs/metadata-only change — skipping the Android build." + echo "code=false" >> "$GITHUB_OUTPUT" fi - name: Setup Java