Auto-release playtest builds when game files change on main #73

Merged
Nimby merged 1 commit from task/72-ci-release into main 2026-10-05 17:23:27 -04:00
Collaborator

Closes #72

Workflow .forgejo/workflows/playtest-release.yml

  • Runs on pushes to main touching scenes/, scripts/, assets/, project.godot or export_presets.cfg, plus manual dispatch with a patch/minor/major choice. Tooling-only pushes (including this PR) don't build. Builds never overlap.
  • Checks out with plain git (no Node in the image), then:
    • tools/ci/build.sh: import, then headless boots of the main menu, Armory and Treasury (any Godot ERROR fails before publishing), then the Windows export with a size check.
    • tools/ci/publish_release.py: next playtest-X.Y.Z (patch bump from the newest playtest-* tag; other tag lines ignored), as a prerelease with the exact ProjectAwry-windows-x86_64.exe asset the launcher requires, and notes listing commits since the previous tag. A re-run for an already-released commit is a no-op; a failed upload deletes the release and tag again.
  • Auth: the job's automatic token, or a RELEASE_TOKEN repo secret if that can't create releases.

Runner + image (tools/ci/)

  • Dockerfile: Debian + Godot 4.7.2 + only the Windows x86_64 release template (~109 MB, not the 1.3 GB set), both checksum-pinned.
  • runner/compose.yaml + config.yml: forgejo-runner 13.2.0 on optibcc, using the local image (force_pull: false), label godot.
  • README.md: the one-time setup (build the image, register with a token from repo Settings → Actions → Runners, docker compose up -d, first manual run).

Verified in the sandbox (no Docker or runner here)

  • build.sh on a fresh clone of current main: import, all 3 smoke boots, and a 109,228,648-byte Windows exe in about 11s.
  • A deliberately broken treasury.tscn fails the smoke step with Godot's errors, before export or publish.
  • Publisher: version-logic unit checks (numeric sort, launcher-* ignored); a dry run against the real API gives playtest-0.10.2 from playtest-0.10.1; a real create + multipart upload as a hidden draft under a throwaway tag (correct asset name/size, not visible to the anonymous listing the launcher uses), then deleted; fake-API checks of the idempotent re-run and failed-upload cleanup.
  • Image recipe: template archive checksum from SHA512-SUMS.txt; both extracted members confirmed present in the 1.28 GB archive via HTTP range reads.
  • Workflow and runner YAML lint- and structure-checked.

Not yet run for real: the image build, the runner, and an end-to-end job. Those happen on optibcc after the README setup.

🤖 Generated with Claude Code

Closes #72 **Workflow** `.forgejo/workflows/playtest-release.yml` - Runs on pushes to `main` touching `scenes/`, `scripts/`, `assets/`, `project.godot` or `export_presets.cfg`, plus manual dispatch with a `patch`/`minor`/`major` choice. Tooling-only pushes (including this PR) don't build. Builds never overlap. - Checks out with plain git (no Node in the image), then: - `tools/ci/build.sh`: import, then headless boots of the main menu, Armory and Treasury (any Godot `ERROR` fails before publishing), then the Windows export with a size check. - `tools/ci/publish_release.py`: next `playtest-X.Y.Z` (patch bump from the newest `playtest-*` tag; other tag lines ignored), as a prerelease with the exact `ProjectAwry-windows-x86_64.exe` asset the launcher requires, and notes listing commits since the previous tag. A re-run for an already-released commit is a no-op; a failed upload deletes the release and tag again. - Auth: the job's automatic token, or a `RELEASE_TOKEN` repo secret if that can't create releases. **Runner + image** (`tools/ci/`) - `Dockerfile`: Debian + Godot 4.7.2 + **only** the Windows x86_64 release template (~109 MB, not the 1.3 GB set), both checksum-pinned. - `runner/compose.yaml` + `config.yml`: `forgejo-runner` 13.2.0 on optibcc, using the local image (`force_pull: false`), label `godot`. - `README.md`: the one-time setup (build the image, register with a token from repo Settings → Actions → Runners, `docker compose up -d`, first manual run). **Verified in the sandbox** (no Docker or runner here) - `build.sh` on a fresh clone of current `main`: import, all 3 smoke boots, and a 109,228,648-byte Windows exe in about 11s. - A deliberately broken `treasury.tscn` fails the smoke step with Godot's errors, before export or publish. - Publisher: version-logic unit checks (numeric sort, `launcher-*` ignored); a dry run against the real API gives `playtest-0.10.2` from `playtest-0.10.1`; a real create + multipart upload as a hidden **draft** under a throwaway tag (correct asset name/size, not visible to the anonymous listing the launcher uses), then deleted; fake-API checks of the idempotent re-run and failed-upload cleanup. - Image recipe: template archive checksum from `SHA512-SUMS.txt`; both extracted members confirmed present in the 1.28 GB archive via HTTP range reads. - Workflow and runner YAML lint- and structure-checked. **Not yet run for real:** the image build, the runner, and an end-to-end job. Those happen on optibcc after the README setup. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
A Forgejo Actions workflow runs on pushes to main that touch scenes,
scripts, assets, project.godot or the export preset (plus manual
dispatch with a patch/minor/major choice). tools/ci/build.sh imports,
boots the main menu and both areas headlessly (any Godot ERROR fails the
run before publishing), and exports the Windows build. publish_release.py
then creates the next playtest-X.Y.Z prerelease with the
ProjectAwry-windows-x86_64.exe asset the launcher looks for, notes listing
commits since the previous tag. Re-runs for a released commit do nothing,
and a failed upload deletes the half-made release and tag.

Jobs run in a small image (Godot 4.7.2 + only the Windows release
template, both checksum-verified) on a forgejo-runner hosted on optibcc;
tools/ci/README.md covers the one-time setup.

Closes #72

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nimby merged commit f1b6252735 into main 2026-10-05 17:23:27 -04:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
scruffydude/project-awry!73
No description provided.