ci: move workflows to self-hosted Air/Mini/EVO runners

Replace GitHub-hosted ubuntu-latest and macos-26 runners with org
self-hosted labels so PR/push CI is not blocked by Actions spending
limits. Linux jobs use [self-hosted, Linux, X64, evo]; macOS jobs use
[self-hosted, macOS, ARM64]. Multi-arch image arm64 builds run on macOS
ARM64 runners; Windows desktop releases still use windows-2022 when
Authenticode signing is configured.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
This commit is contained in:
Cursor Agent 2026-09-21 17:45:03 +00:00
parent c8cab17e73
commit 0ebf438b4c
8 changed files with 31 additions and 26 deletions

View File

@ -14,7 +14,7 @@ concurrency:
jobs: jobs:
lint: lint:
name: Lint name: Lint
runs-on: ubuntu-latest runs-on: [self-hosted, Linux, X64, evo]
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v5
with: with:
@ -29,7 +29,7 @@ jobs:
check: check:
name: Typecheck name: Typecheck
runs-on: ubuntu-latest runs-on: [self-hosted, Linux, X64, evo]
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v5
with: with:
@ -47,7 +47,7 @@ jobs:
build: build:
name: Production builds name: Production builds
runs-on: ubuntu-latest runs-on: [self-hosted, Linux, X64, evo]
timeout-minutes: 10 timeout-minutes: 10
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v5
@ -76,7 +76,7 @@ jobs:
test: test:
name: Unit tests name: Unit tests
runs-on: ubuntu-latest runs-on: [self-hosted, Linux, X64, evo]
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v5
with: with:
@ -94,7 +94,7 @@ jobs:
test-integration: test-integration:
name: Postgres journeys name: Postgres journeys
runs-on: ubuntu-latest runs-on: [self-hosted, Linux, X64, evo]
timeout-minutes: 10 timeout-minutes: 10
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v5
@ -118,7 +118,7 @@ jobs:
name: Publish compatible mobile update name: Publish compatible mobile update
if: github.event_name == 'push' && github.ref == 'refs/heads/main' if: github.event_name == 'push' && github.ref == 'refs/heads/main'
needs: [lint, check, build, test, test-integration, test-e2e] needs: [lint, check, build, test, test-integration, test-e2e]
runs-on: ubuntu-latest runs-on: [self-hosted, Linux, X64, evo]
timeout-minutes: 20 timeout-minutes: 20
concurrency: concurrency:
group: mobile-production-update group: mobile-production-update
@ -271,7 +271,7 @@ jobs:
github.ref == 'refs/heads/main' && github.ref == 'refs/heads/main' &&
vars.PRODUCTION_DEPLOY_ENABLED == 'true' vars.PRODUCTION_DEPLOY_ENABLED == 'true'
needs: [lint, check, build, test, test-integration, test-e2e] needs: [lint, check, build, test, test-integration, test-e2e]
runs-on: ubuntu-latest runs-on: [self-hosted, Linux, X64, evo]
timeout-minutes: 30 timeout-minutes: 30
concurrency: concurrency:
group: production group: production

View File

@ -25,7 +25,7 @@ concurrency:
jobs: jobs:
screenshot: screenshot:
name: macOS setup screenshot name: macOS setup screenshot
runs-on: macos-26 runs-on: [self-hosted, macOS, ARM64]
timeout-minutes: 20 timeout-minutes: 20
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v5

View File

@ -13,7 +13,7 @@ concurrency:
jobs: jobs:
screenshots: screenshots:
name: Capture Android UI name: Capture Android UI
runs-on: ubuntu-latest runs-on: [self-hosted, Linux, X64, evo]
timeout-minutes: 45 timeout-minutes: 45
services: services:
postgres: postgres:

View File

@ -53,7 +53,7 @@ permissions:
jobs: jobs:
playwright: playwright:
name: Web E2E name: Web E2E
runs-on: ubuntu-latest runs-on: [self-hosted, Linux, X64, evo]
timeout-minutes: 20 timeout-minutes: 20
concurrency: concurrency:
group: ${{ inputs.publish_report && 'playwright-publication' || format('playwright-{0}', github.run_id) }} group: ${{ inputs.publish_report && 'playwright-publication' || format('playwright-{0}', github.run_id) }}
@ -72,8 +72,8 @@ jobs:
key: ${{ runner.os }}-playwright-${{ hashFiles('pnpm-lock.yaml') }} key: ${{ runner.os }}-playwright-${{ hashFiles('pnpm-lock.yaml') }}
- name: Install Chromium - name: Install Chromium
timeout-minutes: 5 timeout-minutes: 5
# Skip --with-deps: GitHub ubuntu-latest already has Chromium's OS libraries, # Skip --with-deps when the EVO runner already has Chromium's OS libraries.
# and apt-get against azure.archive.ubuntu.com can stall until the job timeout. # Re-enable --with-deps after provisioning a fresh self-hosted runner.
run: pnpm --filter @rakazo/web exec playwright install chromium run: pnpm --filter @rakazo/web exec playwright install chromium
- name: Validate E2B credentials - name: Validate E2B credentials
if: inputs.sandbox_provider == 'e2b' if: inputs.sandbox_provider == 'e2b'

View File

@ -24,7 +24,7 @@ jobs:
(github.event.workflow_run.event == 'pull_request' || (github.event.workflow_run.event == 'pull_request' ||
(github.event.workflow_run.event == 'push' && (github.event.workflow_run.event == 'push' &&
github.event.workflow_run.head_branch == 'main')) github.event.workflow_run.head_branch == 'main'))
runs-on: ubuntu-latest runs-on: [self-hosted, Linux, X64, evo]
timeout-minutes: 10 timeout-minutes: 10
steps: steps:
# workflow_run has repository secrets. Always use trusted default-branch code here; # workflow_run has repository secrets. Always use trusted default-branch code here;

View File

@ -36,7 +36,7 @@ jobs:
installer-smoke: installer-smoke:
name: Compose installer smokes name: Compose installer smokes
if: github.event_name == 'pull_request' if: github.event_name == 'pull_request'
runs-on: ubuntu-latest runs-on: [self-hosted, Linux, X64, evo]
timeout-minutes: 5 timeout-minutes: 5
permissions: permissions:
contents: read contents: read
@ -49,7 +49,7 @@ jobs:
validate: validate:
name: Validate ${{ matrix.name }} image name: Validate ${{ matrix.name }} image
if: github.event_name == 'pull_request' if: github.event_name == 'pull_request'
runs-on: ubuntu-latest runs-on: [self-hosted, Linux, X64, evo]
timeout-minutes: 90 timeout-minutes: 90
permissions: permissions:
contents: read contents: read
@ -93,8 +93,9 @@ jobs:
name: Build ${{ matrix.name }} ${{ matrix.arch }} name: Build ${{ matrix.name }} ${{ matrix.arch }}
if: github.event_name != 'pull_request' if: github.event_name != 'pull_request'
# Each architecture builds natively on its own runner and pushes by digest only. # Each architecture builds natively on its own runner and pushes by digest only.
# No QEMU: GitHub hosts native arm64 runners, and emulated arm64 took hours for the # amd64 on EVO; arm64 on macOS ARM64 (Air/Mini) because there is no Linux/arm64 runner.
# desktop-sized computer image. See docs/self-host.md (Published images and tags). # No QEMU: emulated arm64 took hours for the desktop-sized computer image.
# See docs/self-host.md (Published images and tags).
runs-on: ${{ matrix.runner }} runs-on: ${{ matrix.runner }}
timeout-minutes: 90 timeout-minutes: 90
permissions: permissions:
@ -118,9 +119,9 @@ jobs:
dockerfile: infra/sandboxes/computer/Dockerfile dockerfile: infra/sandboxes/computer/Dockerfile
context: infra/sandboxes/computer context: infra/sandboxes/computer
- arch: amd64 - arch: amd64
runner: ubuntu-latest runner: [self-hosted, Linux, X64, evo]
- arch: arm64 - arch: arm64
runner: ubuntu-24.04-arm runner: [self-hosted, macOS, ARM64]
steps: steps:
- uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.1.0 - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.1.0
with: with:
@ -171,7 +172,7 @@ jobs:
name: Publish ${{ matrix.name }} image name: Publish ${{ matrix.name }} image
if: github.event_name != 'pull_request' if: github.event_name != 'pull_request'
needs: build needs: build
runs-on: ubuntu-latest runs-on: [self-hosted, Linux, X64, evo]
timeout-minutes: 15 timeout-minutes: 15
permissions: permissions:
contents: read contents: read

View File

@ -17,7 +17,7 @@ concurrency:
jobs: jobs:
validate: validate:
name: Validate stable release name: Validate stable release
runs-on: ubuntu-24.04 runs-on: [self-hosted, Linux, X64, evo]
outputs: outputs:
tag: ${{ steps.release.outputs.tag }} tag: ${{ steps.release.outputs.tag }}
version: ${{ steps.release.outputs.version }} version: ${{ steps.release.outputs.version }}
@ -93,9 +93,13 @@ jobs:
shell: bash shell: bash
run: | run: |
set -euo pipefail set -euo pipefail
include='[{"os":"macos-26","artifact":"macos"},{"os":"ubuntu-24.04","artifact":"linux"}]' include='[
{"labels":["self-hosted","macOS","ARM64"],"artifact":"macos"},
{"labels":["self-hosted","Linux","X64","evo"],"artifact":"linux"}
]'
if [[ "$WINDOWS_SIGNING" == "true" ]]; then if [[ "$WINDOWS_SIGNING" == "true" ]]; then
include="$(jq -c '. + [{"os":"windows-2022","artifact":"windows"}]' <<<"$include")" # No self-hosted Windows runner; Authenticode builds still use GitHub-hosted billing.
include="$(jq -c '. + [{"labels":"windows-2022","artifact":"windows"}]' <<<"$include")"
fi fi
echo "include=$include" >> "$GITHUB_OUTPUT" echo "include=$include" >> "$GITHUB_OUTPUT"
echo "windows=$WINDOWS_SIGNING" >> "$GITHUB_OUTPUT" echo "windows=$WINDOWS_SIGNING" >> "$GITHUB_OUTPUT"
@ -103,7 +107,7 @@ jobs:
build: build:
name: Build signed ${{ matrix.artifact }} artifacts name: Build signed ${{ matrix.artifact }} artifacts
needs: validate needs: validate
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.labels }}
timeout-minutes: 60 timeout-minutes: 60
strategy: strategy:
fail-fast: false fail-fast: false
@ -261,7 +265,7 @@ jobs:
publish: publish:
name: Attest and publish complete release name: Attest and publish complete release
needs: [validate, build] needs: [validate, build]
runs-on: ubuntu-24.04 runs-on: [self-hosted, Linux, X64, evo]
timeout-minutes: 15 timeout-minutes: 15
permissions: permissions:
actions: read actions: read

View File

@ -9,7 +9,7 @@ permissions:
jobs: jobs:
topology: topology:
name: Production topology smoke name: Production topology smoke
runs-on: ubuntu-latest runs-on: [self-hosted, Linux, X64, evo]
timeout-minutes: 30 timeout-minutes: 30
steps: steps:
- uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5 - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5