authorgravatar for me@t3.ggTheo Browne <me@t3.gg> 2026-08-26 00:03:29-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-08-26 00:03:29-07:00
loga3a8cbd60539b4af4de8f96c892dbd07a2b6c041
tree9cd9fa6ff6793a10f461a50fbc7f19af8b489de6
parent3b86ef941c218a000a2ea9920480f469b726f437
signature Signed by PGP key B5690EEEBB952194

perf(ci): cut about a minute from every release (#8250)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

1 files changed, 31 insertions(+), 10 deletions(-)

.github/workflows/release.yml+31-10
......@@ -6,7 +6,8 @@ on:
66 - "v*.*.*"
77 - "!v*-nightly.*"
88 schedule:
9 - cron: "0 */3 * * *"
9 # Off minute zero: GitHub delays scheduled runs most at the top of the hour.
10 - cron: "7 */3 * * *"
1011 workflow_dispatch:
1112 inputs:
1213 channel:
......@@ -22,6 +23,17 @@ on:
2223 required: false
2324 type: string
2425
26# Serialize nightlies (scheduled and manual) so overlapping runs cannot build
27# the same commit twice or publish out of order. Stable tag releases get their
28# own group so a nightly never blocks them. Running publishers are never
29# canceled, and queue: max keeps every pending run instead of the default
30# newest-wins single slot, so a queued stable tag can never be silently
31# dropped. Queued nightlies with no new commits skip via check_changes.
32concurrency:
33 group: release-${{ (github.event_name == 'schedule' || inputs.channel == 'nightly') && 'nightly' || 'stable' }}
34 cancel-in-progress: false
35 queue: max
36
2537permissions:
2638 contents: read
2739 id-token: none
......@@ -199,8 +211,14 @@ jobs:
199211
200212 relay_public_config:
201213 name: Resolve T3 Connect public config
202 needs: preflight
203 if: ${{ !failure() && !cancelled() && needs.preflight.result == 'success' }}
214 # Consumes only the commit SHA, not preflight's resolved version, so it runs
215 # alongside preflight instead of after it. The condition mirrors preflight's:
216 # check_changes is skipped on non-schedule events (skipped is neither failure
217 # nor success, so success() would be wrong here).
218 needs: [check_changes]
219 if: |
220 !failure() && !cancelled() &&
221 (github.event_name != 'schedule' || needs.check_changes.outputs.has_changes == 'true')
204222 runs-on: blacksmith-8vcpu-ubuntu-2404
205223 timeout-minutes: 5
206224 environment:
......@@ -222,7 +240,7 @@ jobs:
222240 - name: Checkout
223241 uses: actions/checkout@v6
224242 with:
225 ref: ${{ needs.preflight.outputs.ref }}
243 ref: ${{ github.sha }}
226244 sparse-checkout: |
227245 /*
228246 !/.repos/
......@@ -295,15 +313,19 @@ jobs:
295313 # machine. node-pty is N-API, so one binary works across all WSL Node versions.
296314 build_wsl_node_pty:
297315 name: Build WSL node-pty (linux-x64)
298 needs: [preflight]
299 if: ${{ !failure() && !cancelled() && needs.preflight.result == 'success' }}
316 # Same gating as relay_public_config: only the commit SHA is needed, so this
317 # runs alongside preflight. See the condition comment there.
318 needs: [check_changes]
319 if: |
320 !failure() && !cancelled() &&
321 (github.event_name != 'schedule' || needs.check_changes.outputs.has_changes == 'true')
300322 runs-on: blacksmith-8vcpu-ubuntu-2404
301323 timeout-minutes: 15
302324 steps:
303325 - name: Checkout
304326 uses: actions/checkout@v6
305327 with:
306 ref: ${{ needs.preflight.outputs.ref }}
328 ref: ${{ github.sha }}
307329 sparse-checkout: |
308330 /*
309331 !/.repos/
......@@ -758,9 +780,8 @@ jobs:
758780 - name: Align package versions to release version
759781 run: node scripts/update-release-package-versions.ts "${{ needs.preflight.outputs.version }}"
760782
761 - name: Build web package
762 run: vp run --filter @t3tools/web build
763
783 # The t3 build task depends on @t3tools/web#build, so the web client is
784 # built (once) as part of this step.
764785 - name: Build CLI package
765786 run: vp run --filter t3 build
766787