3.6 KiB
ProjectQuint macOS Alpha release harness
Public releases are always manually approved. Normal implementation, Unity tests, and Stable builds never invoke this harness and never change the public update manifest.
Machine configuration
Keep machine-specific paths out of source control. Create .release.local.json
at the repository root, or set the corresponding environment variables:
| JSON field | Environment variable | Purpose |
|---|---|---|
deploy_host |
PROJECTQUINT_DEPLOY_HOST |
SSH destination |
ssh_key |
PROJECTQUINT_DEPLOY_KEY |
Absolute path to an existing SSH identity |
remote_source |
PROJECTQUINT_REMOTE_SOURCE |
Remote static-site source directory |
stable_app |
PROJECTQUINT_STABLE_APP |
Absolute output path ending in .app |
releases_root |
PROJECTQUINT_RELEASES_ROOT |
Local release artifact directory |
Environment variables take precedence. Build outputs default to
_workspace/builds/Stable/ProjectQuint.app and _workspace/releases.
The deployment host and SSH identity are required before any remote operation.
Never put private-key contents or authentication tokens in this file.
Read-only plan
Tools/release-mac-alpha.sh --revision 3
This checks the live manifest, local release source, SSH access, and required tools. It does not edit files, build, upload, or deploy.
Publish
The Stable app may remain open while the replacement build is produced. The running process is never terminated by the harness; it continues to run the previous binary until it exits.
Run:
Tools/release-mac-alpha.sh \
--revision 3 \
--publish \
--title "Pack Manager and first-play improvements" \
--change "Non-blocking first-library guidance" \
--change "Recommended 4UE, AERY, and 6UE difficulty tables"
The harness:
- updates the explicit release revision and build number;
- runs the release-version and full Unity EditMode suites;
- builds and validates the macOS Universal Stable;
- creates, mounts, and validates a DMG with an Applications shortcut;
- signs the DMG with the ProjectQuint Sparkle Ed25519 key stored in Keychain;
- updates and builds the download page, changelog, JSON manifest, and appcast;
- uploads the DMG to a new immutable OCI release directory;
- deploys the static site only after the artifact checksum matches remotely;
- downloads the public DMG and verifies both SHA-256 and its Sparkle signature.
If a run stops after the exact artifact has already reached OCI but before the
site is switched, inspect the failure and rerun the same command with
--resume. Resume accepts the remote artifact only when its checksum matches
the locally verified DMG.
The previous public manifest and release remain available if any step before the final site deployment fails. Existing remote release artifacts are never overwritten.
Sparkle signing contract
- Framework: Sparkle 2.9.4
- Feed:
https://projectquint.duckdns.org/updates/appcast.xml - Keychain account:
com.teamdenia.projectquint - Public key:
w94qM58k8MAhIxYYQiR1ivyR5CyMW1tlRV68lQoLehA=
The private key stays only in the macOS login Keychain. Never copy it into the project, app bundle, website, deployment server, CI variables, logs, or release reports. Backing up or moving that key is a separate, explicitly approved security operation.
The first public build that embeds Sparkle is a bridge release: users on older builds must install that DMG manually. Automatic signed replacement works from that bridge release to the following release. Because the current Alpha uses ad-hoc code signing, Gatekeeper installation instructions still apply to the bridge release; Sparkle does not replace Apple notarization.