ci: turnkey Mac .app + Linux Steam Sniper builds (additive)#324
Open
darkshade9 wants to merge 4 commits into
Open
ci: turnkey Mac .app + Linux Steam Sniper builds (additive)#324darkshade9 wants to merge 4 commits into
darkshade9 wants to merge 4 commits into
Conversation
Three new build jobs (additive — existing builds untouched): - darwin-arm64-turnkey: produces AQtion.app for Apple Silicon with all dylib deps bundled via dylibbundler. Player needs zero brew installs. Includes ad-hoc codesign (no Apple Developer cert required, no new Gatekeeper warning vs current bare-binary distribution). - darwin-x86_64-turnkey: same as above for Intel Macs. - linux-steam-sniper: builds inside the official Steam Linux Runtime Sniper SDK container. Binary links only against libs Steam ships with every install. Player hits Play in Steam, game launches, no apt/dnf. Mac bundle layout intentionally keeps baseaq/ and action/ OUTSIDE the .app. A launcher script (.ci/mac/AQtion-launcher.sh) cd's to the .app's parent directory before exec'ing the q2pro binary, so the engine resolves game data relative to CWD = install dir. This preserves the current "data lives next to binary" filesystem layout. Verification step in each Mac job runs otool -L and fails the build if any /opt/homebrew or /usr/local path leaks into the bundle. Release workflow updated to download and upload the three new artifacts alongside existing ones. Next steps after merge: 1. Drop AQtion.icns into .ci/mac/ when ready (build works without it). 2. Update Steam Pipe app_build.vdf to set linux_runtime to sniper. 3. Validate first build run, iterate on container path tweaks if needed. 4. Eventually drop the bare darwin/fedora jobs once turnkey is proven.
Two fixes for the .app launcher: 1. Rename launcher AQtion-launcher.sh -> AQtion-launcher (no extension). macOS Launch Services is more reliable with no-extension binaries as CFBundleExecutable; .sh extension can cause silent launch failure. 2. Drop the manual `zip` step in both Mac jobs. actions/upload-artifact already zips its input, so the previous output was double-zipped (q2pro-darwin-arm64-turnkey.zip -> AQtion-darwin-arm64.zip -> AQtion.app). Now upload the .app directly; user downloads AQtion-darwin-arm64.zip and extracts straight to AQtion.app. Added a diagnostic step that prints the bundle layout and launcher exec bit before upload, so if modes get stripped somewhere it shows in CI. release.yml updated to reference the new artifact names.
actions/upload-artifact strips the parent directory prefix when given a directory path. Result: the previous artifact had files at root (Contents/Frameworks/...) instead of the proper AQtion.app/Contents/... layout — broken bundle. Switch to ditto's --keepParent which preserves the AQtion.app wrapper AND preserves codesign metadata, extended attrs, and exec bits that plain zip strips. macOS opens ditto archives transparently via double-click. Tradeoff: two extract steps for the user (outer zip from upload-artifact, inner zip from ditto), but each is a single double-click and the .app survives intact.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds three new build jobs to produce turnkey (no-install-required) artifacts for Mac and Linux Steam players, alongside the existing builds. Existing jobs untouched.
darwin-arm64-turnkeyAQtion-darwin-arm64.zipcontainingAQtion.appwith all dylibs bundledbrew installSDL2, libpng, libjpeg, libcurl, etc.darwin-x86_64-turnkeyAQtion-darwin-x86_64.zip(same shape)linux-steam-sniperMac bundle layout
AQtion.appkeepsbaseaq/andaction/outside the bundle (sibling to the .app, not inside it). A launcher script inContents/MacOS/cd's to the .app's parent directory before exec'ingq2pro, so the engine resolves game data relative to CWD = install dir. Preserves the current "data sits next to binary" filesystem expectation.Gatekeeper / signing
codesign --sign -) — free, no Apple Developer cert required, produces a stable signature.Verification
Each Mac job runs
otool -Lafter dylibbundler and fails the build if any/opt/homebrew,/usr/local, or/opt/localpath leaks into the bundle. Silent bad bundles are not possible.Files
.ci/mac/AQtion-launcher.sh— 15-line launcher, sets CWD then execsq2pro.ci/mac/Info.plist— bundle metadata,CFBundleExecutablepoints at the launcher.github/workflows/build.yml— 3 new jobs appended after existingdarwin-arm64.github/workflows/release.yml— 3 new download steps + 3 new files in release uploadOptional follow-ups (not in this PR)
AQtion.icnsinto.ci/mac/(build works without it — Finder uses generic icon).app_build_<APPID>.vdfto setlinux_runtimetosniperfor the Linux depot.lipojob to produce a single universal.appfrom the two per-arch artifacts.darwin/fedorajobs once turnkey is proven in production.Test plan
q2pro-darwin-arm64-turnkeyartifact, unzip next to a realbaseaq/+action/, double-clickAQtion.app, verify it launches and finds game dataotool -L AQtion.app/Contents/MacOS/q2proshows only/System/...and@executable_path/...entriesldd q2proresolves all libs inside the Sniper runtime when extracted into a Sniper container🤖 Generated with Claude Code