55 tags :
66 - " v*.*.*"
77 schedule :
8- - cron : " 0 9 * * *"
8+ - cron : " 0 */3 * * *"
99 workflow_dispatch :
1010 inputs :
1111 channel :
@@ -26,9 +26,46 @@ permissions:
2626 id-token : write
2727
2828jobs :
29+ check_changes :
30+ name : Check for changes since last nightly
31+ if : github.event_name == 'schedule'
32+ runs-on : ubuntu-24.04
33+ outputs :
34+ has_changes : ${{ steps.check.outputs.has_changes }}
35+ steps :
36+ - name : Checkout
37+ uses : actions/checkout@v6
38+ with :
39+ fetch-depth : 0
40+
41+ - id : check
42+ name : Compare HEAD to last nightly tag
43+ run : |
44+ last_nightly_tag=$(git tag --list 'nightly-v*' --sort=-creatordate | head -n 1)
45+ if [[ -z "$last_nightly_tag" ]]; then
46+ echo "No previous nightly tag found. Proceeding with release."
47+ echo "has_changes=true" >> "$GITHUB_OUTPUT"
48+ exit 0
49+ fi
50+
51+ last_nightly_sha=$(git rev-parse "$last_nightly_tag^{commit}")
52+ head_sha=$(git rev-parse HEAD)
53+
54+ if [[ "$last_nightly_sha" == "$head_sha" ]]; then
55+ echo "No changes on main since last nightly release ($last_nightly_tag). Skipping."
56+ echo "has_changes=false" >> "$GITHUB_OUTPUT"
57+ else
58+ echo "Changes detected on main since $last_nightly_tag ($last_nightly_sha → $head_sha). Proceeding."
59+ echo "has_changes=true" >> "$GITHUB_OUTPUT"
60+ fi
61+
2962 preflight :
3063 name : Preflight
31- runs-on : ubuntu-24.04
64+ needs : [check_changes]
65+ if : |
66+ !failure() && !cancelled() &&
67+ (github.event_name != 'schedule' || needs.check_changes.outputs.has_changes == 'true')
68+ runs-on : blacksmith-8vcpu-ubuntu-2404
3269 timeout-minutes : 10
3370 outputs :
3471 release_channel : ${{ steps.release_meta.outputs.release_channel }}
@@ -141,25 +178,30 @@ jobs:
141178 matrix :
142179 include :
143180 - label : macOS arm64
144- runner : macos-14
181+ runner : blacksmith-12vcpu- macos-26
145182 platform : mac
146183 target : dmg
147184 arch : arm64
148185 - label : macOS x64
149- runner : macos-15-intel
186+ runner : blacksmith-12vcpu-macos-26
150187 platform : mac
151188 target : dmg
152189 arch : x64
153190 - label : Linux x64
154- runner : ubuntu-24.04
191+ runner : blacksmith-32vcpu- ubuntu-2404
155192 platform : linux
156193 target : AppImage
157194 arch : x64
158195 - label : Windows x64
159- runner : windows-2022
196+ runner : blacksmith-32vcpu- windows-2025
160197 platform : win
161198 target : nsis
162199 arch : x64
200+ # - label: Windows arm64
201+ # runner: windows-11-arm
202+ # platform: win
203+ # target: nsis
204+ # arch: arm64
163205 steps :
164206 - name : Checkout
165207 uses : actions/checkout@v6
@@ -183,6 +225,23 @@ jobs:
183225 - name : Align package versions to release version
184226 run : node scripts/update-release-package-versions.ts "${{ needs.preflight.outputs.version }}"
185227
228+ - name : Install Spectre-mitigated MSVC libs
229+ if : matrix.platform == 'win'
230+ shell : pwsh
231+ run : |
232+ $vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
233+ $installPath = & $vswhere -products * -latest -property installationPath
234+ $setupExe = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\setup.exe"
235+ $proc = Start-Process -FilePath $setupExe `
236+ -ArgumentList "modify", "--installPath", "`"$installPath`"", "--add", `
237+ "Microsoft.VisualStudio.Component.VC.Tools.x86.x64.Spectre", "--quiet", "--norestart" `
238+ -Wait -PassThru -NoNewWindow
239+ if ($null -eq $proc -or $proc.ExitCode -ne 0) {
240+ $code = if ($null -ne $proc) { $proc.ExitCode } else { 1 }
241+ Write-Error "Visual Studio Installer failed with exit code $code"
242+ exit $code
243+ }
244+
186245 - name : Build desktop artifact
187246 shell : bash
188247 env :
@@ -272,6 +331,18 @@ jobs:
272331 done
273332 fi
274333
334+ # Enable if Windows arm64 builds are enabled.
335+ # Windows updater metadata is channel-specific (for example
336+ # "latest.yml" or "nightly.yml"). Suffix each per-arch copy so the
337+ # release job can merge matching arm64/x64 manifests back into one
338+ # canonical manifest per channel.
339+ # if [[ "${{ matrix.platform }}" == "win" ]]; then
340+ # shopt -s nullglob
341+ # for manifest in release-publish/*.yml; do
342+ # mv "$manifest" "${manifest%.yml}-win-${{ matrix.arch }}.yml"
343+ # done
344+ # fi
345+
275346 - name : Upload build artifacts
276347 uses : actions/upload-artifact@v7
277348 with :
@@ -282,7 +353,7 @@ jobs:
282353 publish_cli :
283354 name : Publish CLI to npm
284355 needs : [preflight, build]
285- runs-on : ubuntu-24.04
356+ runs-on : ubuntu-24.04 # blacksmith-8vcpu-ubuntu-2404
286357 timeout-minutes : 10
287358 steps :
288359 - name : Checkout
@@ -316,19 +387,27 @@ jobs:
316387 release :
317388 name : Publish GitHub Release
318389 needs : [preflight, build, publish_cli]
319- runs-on : ubuntu-24.04
390+ runs-on : ubuntu-24.04 # blacksmith-8vcpu-ubuntu-2404
320391 timeout-minutes : 10
321392 steps :
322393 - name : Checkout
323394 uses : actions/checkout@v6
324395 with :
325396 ref : ${{ needs.preflight.outputs.ref }}
326397
398+ - name : Setup Bun
399+ uses : oven-sh/setup-bun@v2
400+ with :
401+ bun-version-file : package.json
402+
327403 - name : Setup Node
328404 uses : actions/setup-node@v6
329405 with :
330406 node-version-file : package.json
331407
408+ - name : Install dependencies
409+ run : bun install --frozen-lockfile
410+
332411 - name : Download all desktop artifacts
333412 uses : actions/download-artifact@v8
334413 with :
@@ -342,11 +421,40 @@ jobs:
342421 for x64_manifest in release-assets/*-mac-x64.yml; do
343422 arm64_manifest="${x64_manifest%-x64.yml}.yml"
344423 if [[ -f "$arm64_manifest" ]]; then
345- node scripts/merge-mac- update-manifests.ts "$arm64_manifest" "$x64_manifest"
424+ node scripts/merge-update-manifests.ts --platform mac "$arm64_manifest" "$x64_manifest"
346425 rm -f "$x64_manifest"
347426 fi
348427 done
349428
429+ # - name: Merge Windows updater manifests
430+ # run: |
431+ # shopt -s nullglob
432+ # found_windows_manifest=false
433+ # for x64_manifest in release-assets/*-win-x64.yml; do
434+ # if [[ "$(basename "$x64_manifest")" == builder-debug-* ]]; then
435+ # continue
436+ # fi
437+
438+ # arm64_manifest="${x64_manifest/-x64.yml/-arm64.yml}"
439+ # output_manifest="${x64_manifest/-win-x64.yml/.yml}"
440+ # if [[ ! -f "$arm64_manifest" ]]; then
441+ # echo "Missing matching arm64 Windows manifest for $x64_manifest" >&2
442+ # exit 1
443+ # fi
444+
445+ # found_windows_manifest=true
446+ # node scripts/merge-update-manifests.ts --platform win \
447+ # "$arm64_manifest" \
448+ # "$x64_manifest" \
449+ # "$output_manifest"
450+ # rm -f "$arm64_manifest" "$x64_manifest"
451+ # done
452+
453+ # if [[ "$found_windows_manifest" != true ]]; then
454+ # echo "No Windows updater manifests found to merge." >&2
455+ # exit 1
456+ # fi
457+
350458 - name : Publish release
351459 if : needs.preflight.outputs.previous_tag != ''
352460 uses : softprops/action-gh-release@v2
@@ -390,7 +498,7 @@ jobs:
390498 name : Finalize release
391499 if : needs.preflight.outputs.release_channel == 'stable'
392500 needs : [preflight, release]
393- runs-on : ubuntu-24.04
501+ runs-on : blacksmith-8vcpu- ubuntu-2404
394502 timeout-minutes : 10
395503 steps :
396504 - id : app_token
@@ -429,6 +537,9 @@ jobs:
429537 with :
430538 node-version-file : package.json
431539
540+ - name : Install dependencies
541+ run : bun install --frozen-lockfile
542+
432543 - id : update_versions
433544 name : Update version strings
434545 env :
0 commit comments