Skip to content

app-release: reusable workflow — tag + prerelease an app version (no bot key) - #3

Merged
matixan merged 3 commits into
mainfrom
feat/app-release
Oct 10, 2026
Merged

matixan merged 3 commits into
mainfrom
feat/app-release

Conversation

@matixan

@matixan matixan commented Oct 10, 2026

Copy link
Copy Markdown
Member

Phase 3 of the release automation (spec + plan: CrossPad/platform-idf#46).

A reusable workflow_call that the 13 app repos call @v1:

  • on a push to the default branch, it reads crosspad-app.json (checked against library.json);
  • if the version is new, it tags the commit that introduced it, vX.Y.Z, and publishes a GitHub prerelease with GITHUB_TOKEN;
  • the announcer then posts 🌙 Nightly, and its relay sends app-released to crosspad-apps (CrossPad/crosspad-announcer, separate PR).

Security (from review):

  • no bot key in app repos: a writer of an app repo cannot mint a crosspad-bot token;
  • scripts are checked out from refs/tags/v1, so a branch named v1 cannot shadow them;
  • runs only on push or dispatch to the default branch;
  • persist-credentials: false, python3 -I, GIT_CONFIG_GLOBAL=/dev/null;
  • inputs are validated (ASCII X.Y.Z, no leading zeros) and reach the script through env.

No backfill: while an app has no release tag, only a push that actually bumped the version publishes. A dispatch, an unchanged version, a new branch or an unknown before does nothing, so there is no burst of 🌙 pings.

Tests: 53 passed (pytest). actionlint clean.

After merge: an admin creates tag v1 on the merge commit, and rulesets protect refs/tags/v* and refs/heads/v* (admin only).

🤖 Generated with Claude Code

matixan and others added 3 commits October 10, 2026 23:25
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…sing

The announcer relays app-released after release.published, so the reusable
workflow only tags and publishes with GITHUB_TOKEN: the bot-token and dispatch
steps, bot-app-id and bot-private-key are gone. The scripts checkout uses
refs/tags/v1 (a branch named v1 can no longer shadow it). While a repo has no
vX.Y.Z tag only a push that bumps the version publishes; workflow_dispatch and
new-branch pushes are no-ops. Versions refuse leading zeros and non-ASCII
digits; bad JSON, non-object manifests and non-string changelogs end in a clean
::error:: (exit 1). The script runs with python3 -I and GIT_CONFIG_GLOBAL=/dev/null.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@matixan
matixan merged commit 81a15c9 into main Oct 10, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant