Skip to content

ci: restructure release workflow for atomic publish, hard-gate on signing#778

Merged
IvanMurzak merged 2 commits into
mainfrom
worktree-777-restructure-release-workflow
May 23, 2026
Merged

ci: restructure release workflow for atomic publish, hard-gate on signing#778
IvanMurzak merged 2 commits into
mainfrom
worktree-777-restructure-release-workflow

Conversation

@IvanMurzak
Copy link
Copy Markdown
Owner

Summary

  • Restructures .github/workflows/release.yml so the GitHub Release is the last thing that happens, gated on every prerequisite (tests, builds, signed UPM tarball, release notes). All assets are uploaded in a single atomic softprops/action-gh-release@v2 call.
  • Reverses PR ci: sign OpenUPM package via Unity UPM CLI on release #776's soft-fail design: build-signed-upm-package (extracted from the old sign-and-publish-upm) is not continue-on-error. Missing UPM signing secrets fail fast and no GitHub Release is created.
  • New prepare-release-notes job decouples notes generation from release creation; release notes are produced in parallel with tests and consumed from an artifact by release-unity-plugin.
  • publish-unity-installer, publish-mcp-server, and sign-and-publish-upm are removed — their uploads are folded into release-unity-plugin so a failed upload cannot strand the release with incomplete assets.
  • publish_discord.needs and cleanup-artifacts.needs re-pointed at release-unity-plugin (was: the three removed publish jobs). cleanup-artifacts extended to delete the two new artifacts.
  • docs/openupm-signing.md rewritten to remove all soft-fail language and document the hard-gate semantics.

Job graph (after)

test-cli ─────────────────────────────────────────────────────────────┐
check-version-tag ──┬─► prepare-release-notes ──────────────────────┐ │
                    ├─► build-unity-installer ──────┬─► tests ──┐   │ │
                    ├─► build-and-zip-mcp-server ───┘           ├──►├─► release-unity-plugin ──┬─► deploy
                    └─► build-signed-upm-package ───────────────┘   │       (atomic publish)   ├─► publish_discord
                                                                    ┘                          └─► cleanup-artifacts

Test plan

  • release.yml validated as well-formed YAML with PyYAML.
  • needs: graph inspected: no references to removed jobs (publish-unity-installer, publish-mcp-server, sign-and-publish-upm) remain in publish_discord.needs or cleanup-artifacts.needs.
  • build-signed-upm-package and prepare-release-notes confirmed to run in parallel with tests (neither depends on release-unity-plugin).
  • release-unity-plugin.needs includes both new jobs plus all existing test/build deps.
  • build-signed-upm-package confirmed NOT continue-on-error (hard gate).
  • docs/openupm-signing.md no longer contains soft-fail language; explicitly states "no GitHub Release is created" without signing.
  • CI on this PR (release workflow is push: main-only, so the canonical signal here is the existing test-cli / test-pull-request workflows running on the PR; the restructured release workflow runs end-to-end on the next merge to main).

Closes #777

…ning

Reverses PR #776's soft-fail design and makes the GitHub Release the LAST
thing that happens, gated on every prerequisite — including UPM signing.

What changed
- New `prepare-release-notes` job — generates `release.md` in parallel with
  tests/builds and uploads as `release-notes` artifact.
- New `build-signed-upm-package` job — runs in parallel with tests/builds.
  Verifies secrets, runs `upm pack`, verifies attestation + filename prefix,
  uploads `.tgz` as `signed-upm-package` artifact. NOT continue-on-error.
- `release-unity-plugin` is now the atomic publish point. `needs:` extended
  to include `prepare-release-notes` and `build-signed-upm-package`. Downloads
  all asset artifacts and creates the GitHub Release + tag with the full
  asset set in a single `softprops/action-gh-release@v2` call. Release notes
  read from artifact via `body_path:` and re-exposed as `release_notes`
  output for `publish_discord`.
- `publish-unity-installer`, `publish-mcp-server`, and `sign-and-publish-upm`
  jobs REMOVED — collapsed into `release-unity-plugin` so a failed upload
  cannot strand a release with incomplete assets.
- `publish_discord.needs` / `cleanup-artifacts.needs` re-pointed at
  `release-unity-plugin` (was: the three removed publish jobs).
- `cleanup-artifacts` extended to delete `signed-upm-package` and
  `release-notes` artifacts in addition to the existing two.

Hard-gate semantics
- Missing UPM signing secrets cause `build-signed-upm-package` to fail fast
  with a clear `::error::` message. The release pipeline fails as a whole;
  no GitHub Release is created.
- `docs/openupm-signing.md` rewritten: all soft-fail language removed; the
  doc now states signing is a hard gate and that "no GitHub Release is
  created" without it.

Validation
- `.github/workflows/release.yml` validated with PyYAML — well-formed YAML.
  Per-job `needs:` graph inspected; no references to removed jobs remain.
  (Unity Editor / EditMode tests are not the gate for workflow-YAML diffs;
  CI on the PR is the authoritative signal, same coping strategy as #776.)

Closes #777
…ndomized heredoc delimiter, doc precision

simplify-pass: 1
@IvanMurzak IvanMurzak self-assigned this May 23, 2026
@IvanMurzak IvanMurzak added the enhancement New feature or request label May 23, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Test Results

   12 files    564 suites   46m 30s ⏱️
  954 tests   953 ✅ 1 💤 0 ❌
5 724 runs  5 718 ✅ 6 💤 0 ❌

Results for commit 561dac5.

@IvanMurzak IvanMurzak merged commit e0ebc0a into main May 23, 2026
17 checks passed
@IvanMurzak IvanMurzak deleted the worktree-777-restructure-release-workflow branch May 23, 2026 09:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Restructure release workflow for atomic publish: gate release on signing success

1 participant