Skip to content

Commit d0fe212

Browse files
docs(ci): align branch protection + Changesets comments with GitHub docs (#3)
- Clarify that skipped checks can satisfy required status checks - Document changeset-release/<base> from changesets/action - Prefer CI complete for one unambiguous required check
1 parent b366c53 commit d0fe212

2 files changed

Lines changed: 59 additions & 1 deletion

File tree

.github/CONTRIBUTING.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ bun run check-updates # interactive dependency updates (`bun update -i --lates
1818

1919
### `main` and pull requests
2020

21-
Branch **`main`** is **protected**: routine work does **not** push directly to `main`. Open a **pull request** and merge only after **[CI](workflows/ci.yml)** passes (format, lint, typecheck, test, build).
21+
Branch **`main`** is **protected**: routine work does **not** push directly to `main`. Open a **pull request** and merge only after **[CI](workflows/ci.yml)** passes.
22+
23+
**Required status checks:** Prefer requiring the single check **`CI complete`** (aggregates the matrix). PRs from **`changeset-release/<branch>`** (Changesets “Version packages”; see [changesets/action](https://github.com/changesets/action)) skip the heavy jobs here; per [GitHub](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches#require-status-checks-before-merging), **`skipped`** can still satisfy required checks — **`CI complete`** remains the clearest green/red signal. Ensure job **names** are unique across workflows ([docs](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches#about-branch-protection-rules)).
2224

2325
```bash
2426
git fetch origin && git checkout main && git pull

.github/workflows/ci.yml

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
# Version PRs from `changesets/action` use head branch `changeset-release/<base>` (e.g. `changeset-release/main`;
2+
# see changesets/action `run.ts`: `versionBranch = \`changeset-release/${branch}\``).
3+
#
4+
# GitHub docs: required status checks may be successful, skipped, or neutral — skipped often still allows merge
5+
# (see https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches#require-status-checks-before-merging ).
6+
# This workflow still gates on `changeset-release/*` and finishes with one **`CI complete`** job so there is a
7+
# single unambiguous pass/fail (branch protection also warns that duplicate job *names* across workflows can block merges).
18
name: CI
29

310
on:
@@ -9,8 +16,26 @@ on:
916
- main
1017

1118
jobs:
19+
skip-ci:
20+
name: Gate (skip full CI for version PRs?)
21+
runs-on: ubuntu-latest
22+
outputs:
23+
skip: ${{ steps.gate.outputs.skip }}
24+
steps:
25+
- id: gate
26+
run: |
27+
if [ "${{ github.event_name }}" = "pull_request" ] && \
28+
echo "${{ github.head_ref }}" | grep -q '^changeset-release/'; then
29+
echo "skip=true" >> "$GITHUB_OUTPUT"
30+
echo "Head is changeset-release/* — full CI skipped; ci-complete will pass."
31+
else
32+
echo "skip=false" >> "$GITHUB_OUTPUT"
33+
fi
34+
1235
format:
1336
name: 💅 Format
37+
needs: skip-ci
38+
if: needs['skip-ci'].outputs.skip != 'true'
1439
runs-on: ubuntu-latest
1540
steps:
1641
- name: Checkout
@@ -24,6 +49,8 @@ jobs:
2449

2550
lint:
2651
name: 🕵 Lint
52+
needs: skip-ci
53+
if: needs['skip-ci'].outputs.skip != 'true'
2754
runs-on: ubuntu-latest
2855
steps:
2956
- name: Checkout
@@ -37,6 +64,8 @@ jobs:
3764

3865
typecheck:
3966
name: ✅ Typecheck
67+
needs: skip-ci
68+
if: needs['skip-ci'].outputs.skip != 'true'
4069
runs-on: ubuntu-latest
4170
steps:
4271
- name: Checkout
@@ -50,6 +79,8 @@ jobs:
5079

5180
test:
5281
name: 🔬 Test
82+
needs: skip-ci
83+
if: needs['skip-ci'].outputs.skip != 'true'
5384
runs-on: ubuntu-latest
5485
steps:
5586
- name: Checkout
@@ -63,6 +94,8 @@ jobs:
6394

6495
build:
6596
name: 🧰 Build
97+
needs: skip-ci
98+
if: needs['skip-ci'].outputs.skip != 'true'
6699
runs-on: ubuntu-latest
67100
steps:
68101
- name: Checkout
@@ -89,6 +122,8 @@ jobs:
89122
90123
benchmark:
91124
name: 📊 Benchmark (fixture)
125+
needs: skip-ci
126+
if: needs['skip-ci'].outputs.skip != 'true'
92127
runs-on: ubuntu-latest
93128
steps:
94129
- name: Checkout
@@ -102,3 +137,24 @@ jobs:
102137
export CODEMAP_ROOT="$GITHUB_WORKSPACE/fixtures/minimal"
103138
bun run dev --full
104139
bun run benchmark
140+
141+
ci-complete:
142+
name: CI complete
143+
needs: [skip-ci, format, lint, typecheck, test, build, benchmark]
144+
if: always()
145+
runs-on: ubuntu-latest
146+
steps:
147+
- name: Fail if any required job failed
148+
if: |
149+
needs['skip-ci'].outputs.skip != 'true' && (
150+
needs.format.result != 'success' ||
151+
needs.lint.result != 'success' ||
152+
needs.typecheck.result != 'success' ||
153+
needs.test.result != 'success' ||
154+
needs.build.result != 'success' ||
155+
needs.benchmark.result != 'success'
156+
)
157+
run: exit 1
158+
159+
- name: OK
160+
run: echo "CI requirements satisfied"

0 commit comments

Comments
 (0)