From f4d98b74e32535fb12394a085a0dd01bd9975a97 Mon Sep 17 00:00:00 2001 From: OrcaWin Date: Tue, 27 Oct 2026 16:02:46 -0700 Subject: [PATCH] ci: run hourly and daily dev builds on free hosted runners (#34585) Hourly and daily builds publish unvetted dev channels on a schedule, so their latency is not user-facing. Move the macOS build to hosted macos-15, the Windows build to hosted windows-2022 (the release path), template qualification to hosted lanes, and the small routing/publish jobs to ubuntu-latest. Adhoc and release builds stay on Blacksmith. Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> Co-authored-by: Claude --- .github/workflows/daily-mac-build.yml | 10 +++++----- .github/workflows/dev-channel-win-publish.yml | 2 +- .github/workflows/hourly-mac-build.yml | 8 ++++---- .../dev-channel-orcad-template-workflow.test.mjs | 2 +- config/scripts/hourly-preflight-workflow.test.mjs | 2 +- .../scripts/mac-notarization-builder-contract.test.mjs | 3 ++- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/.github/workflows/daily-mac-build.yml b/.github/workflows/daily-mac-build.yml index 38e20094ad6..fe72cfc6b8a 100644 --- a/.github/workflows/daily-mac-build.yml +++ b/.github/workflows/daily-mac-build.yml @@ -30,7 +30,7 @@ jobs: # Why: the app and the orcad template it ships must come from one commit, so resolve main once. resolve-main: if: github.repository == 'stablyai/orca' - runs-on: blacksmith-2vcpu-ubuntu-2404 + runs-on: ubuntu-latest timeout-minutes: 5 outputs: head_sha: ${{ steps.resolve.outputs.head_sha }} @@ -56,7 +56,7 @@ jobs: with: ref: ${{ needs.resolve-main.outputs.head_sha }} build_template: true - fast_runners: true + fast_runners: false build-daily-mac: needs: @@ -68,7 +68,7 @@ jobs: version: ${{ steps.daily.outputs.version }} head_sha: ${{ steps.freshness.outputs.head_sha }} published: ${{ steps.publish_live.outcome == 'success' && 'true' || 'false' }} - runs-on: blacksmith-6vcpu-macos-15 + runs-on: macos-15 # Allow 150min for install 3×10 + publish 2×45 + ~25 setup/build/verify, so outer timeout cannot strand cleanup mid-retry. timeout-minutes: 150 env: @@ -427,7 +427,7 @@ jobs: post-daily-e2e: needs: build-daily-mac if: ${{ needs.build-daily-mac.outputs.published == 'true' && needs.build-daily-mac.outputs.head_sha != '' }} - runs-on: blacksmith-2vcpu-ubuntu-2404 + runs-on: ubuntu-latest permissions: actions: write steps: @@ -464,4 +464,4 @@ jobs: ref: ${{ needs.build-daily-mac.outputs.head_sha }} version: ${{ needs.build-daily-mac.outputs.version }} orcad_template: true - fast_release: true + fast_release: false diff --git a/.github/workflows/dev-channel-win-publish.yml b/.github/workflows/dev-channel-win-publish.yml index cb702800565..34c28929046 100644 --- a/.github/workflows/dev-channel-win-publish.yml +++ b/.github/workflows/dev-channel-win-publish.yml @@ -28,7 +28,7 @@ jobs: publish-win: if: github.repository == 'stablyai/orca' environment: adhoc-mac-build - runs-on: blacksmith-2vcpu-ubuntu-2404 + runs-on: ubuntu-latest timeout-minutes: 165 env: CHANNEL: ${{ inputs.channel }} diff --git a/.github/workflows/hourly-mac-build.yml b/.github/workflows/hourly-mac-build.yml index ca4ee37aa76..62bff1f6ae3 100644 --- a/.github/workflows/hourly-mac-build.yml +++ b/.github/workflows/hourly-mac-build.yml @@ -30,7 +30,7 @@ jobs: # Avoid occupying the limited Mac pool when main has not moved. preflight: if: github.repository == 'stablyai/orca' - runs-on: blacksmith-2vcpu-ubuntu-2404 + runs-on: ubuntu-latest timeout-minutes: 5 outputs: should_build: ${{ steps.freshness.outputs.should_build }} @@ -92,7 +92,7 @@ jobs: with: ref: ${{ needs.preflight.outputs.head_sha }} build_template: true - fast_runners: true + fast_runners: false build-hourly-mac: needs: @@ -104,7 +104,7 @@ jobs: version: ${{ steps.hourly.outputs.version }} head_sha: ${{ needs.preflight.outputs.head_sha }} published: ${{ steps.publish_live.outcome == 'success' && 'true' || 'false' }} - runs-on: blacksmith-6vcpu-macos-15 + runs-on: macos-15 # Allow 150min for install 3×10 + publish 2×45 + ~25 setup/build/verify; outer timeout otherwise interrupts cleanup. timeout-minutes: 150 env: @@ -402,4 +402,4 @@ jobs: ref: ${{ needs.build-hourly-mac.outputs.head_sha }} version: ${{ needs.build-hourly-mac.outputs.version }} orcad_template: true - fast_release: true + fast_release: false diff --git a/config/scripts/dev-channel-orcad-template-workflow.test.mjs b/config/scripts/dev-channel-orcad-template-workflow.test.mjs index f6c91a16c91..8ae3b0880c9 100644 --- a/config/scripts/dev-channel-orcad-template-workflow.test.mjs +++ b/config/scripts/dev-channel-orcad-template-workflow.test.mjs @@ -35,7 +35,7 @@ describe.each(channels)('$name build ships the orcad template', (channel) => { expect(template.with).toEqual({ ref: channel.pinnedSha, build_template: true, - fast_runners: true + fast_runners: false }) expect(template.permissions).toEqual({ contents: 'read', actions: 'read' }) expect(template.secrets).toBeUndefined() diff --git a/config/scripts/hourly-preflight-workflow.test.mjs b/config/scripts/hourly-preflight-workflow.test.mjs index cb7eb0823c8..d23681c026c 100644 --- a/config/scripts/hourly-preflight-workflow.test.mjs +++ b/config/scripts/hourly-preflight-workflow.test.mjs @@ -57,7 +57,7 @@ async function checkFreshness(overrides = {}) { describe('hourly build preflight', () => { it('gates Mac allocation and pins the checkout and downstream identity', () => { const build = workflow.jobs['build-hourly-mac'] - expect(preflight['runs-on']).toBe('blacksmith-2vcpu-ubuntu-2404') + expect(preflight['runs-on']).toBe('ubuntu-latest') expect(preflight.steps.some((step) => step.uses?.startsWith('actions/checkout'))).toBe(false) expect( preflight.steps.find((step) => step.id === 'app_token').with['permission-contents'] diff --git a/config/scripts/mac-notarization-builder-contract.test.mjs b/config/scripts/mac-notarization-builder-contract.test.mjs index 0578a379f74..ca1b3a66bf8 100644 --- a/config/scripts/mac-notarization-builder-contract.test.mjs +++ b/config/scripts/mac-notarization-builder-contract.test.mjs @@ -88,7 +88,8 @@ describe('macOS build workflow policy', () => { job.steps?.some((step) => step.with?.command?.includes('electron-builder --config')) ) expect(job['runs-on']).toBe( - channel === 'adhoc' ? 'blacksmith-12vcpu-macos-15' : 'blacksmith-6vcpu-macos-15' + { adhoc: 'blacksmith-12vcpu-macos-15', release: 'blacksmith-6vcpu-macos-15' }[channel] ?? + 'macos-15' ) const step = job.steps.find((step) => step.with?.command?.includes('electron-builder --config')