ci: atomic release publish hard-gated on OpenUPM signing - #16
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR restructures the release workflow so the GitHub Release is published as a single atomic step that is hard-gated on all prerequisites, including building and verifying a signed OpenUPM UPM tarball.
Changes:
- Adds
prepare-release-notesjob to generaterelease.mdearly and publish it as arelease-notesartifact. - Adds
build-signed-upm-packagejob to sign + verify the UPM package and upload it as asigned-upm-packageartifact (hard gate). - Rewrites
release-unity-pluginto download all artifacts and create the Release + tag in onesoftprops/action-gh-release@v2call; updates cleanup accordingly and adds OpenUPM signing setup docs.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 4 comments.
| File | Description |
|---|---|
.github/workflows/release.yml |
Adds parallel release-notes + signed-package jobs and switches release publication to a single atomic release step gated on all prerequisites. |
docs/openupm-signing.md |
Documents the one-time OpenUPM/Unity org setup and explains the hard-gated signing/release flow. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+254
to
+259
| archive_entries="$(tar -tzf "$archive")" | ||
| grep -qx 'package/package.json' <<<"$archive_entries" | ||
| grep -qx 'package/.attestation.p7m' <<<"$archive_entries" | ||
|
|
||
| printf 'Signed archive: %s\n' "$archive_basename" | ||
| tar -xOzf "$archive" package/package.json | jq '{name, version}' |
| exit 1 | ||
| fi | ||
|
|
||
| archive="${archives[0]}" |
Comment on lines
+221
to
+225
| - name: Install Unity UPM CLI | ||
| run: | | ||
| curl -fsSL https://cdn.packages.unity.com/upm-cli/install.sh -o install.sh | ||
| bash install.sh | ||
| echo "$HOME/.upm/bin" >> "$GITHUB_PATH" |
Comment on lines
+85
to
+91
| username=$(gh api repos/${GITHUB_REPOSITORY}/commits/$sha --jq '.author.login // .commit.author.name' 2>/dev/null || true) | ||
| if [ -z "$username" ]; then | ||
| username=$(git log -1 --pretty=format:'%an' $sha) | ||
| fi | ||
| message=$(git log -1 --pretty=format:'%s' $sha) | ||
| short_sha=$(git log -1 --pretty=format:'%h' $sha) | ||
| echo "- [\`$short_sha\`]($repo_url/commit/$sha) — $message by @$username" >> release.md |
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
Restructures
release.ymlso the GitHub Release is created as a single atomic publish gated on every prerequisite. Mirrors the parent Unity-MCP repo changes (#776 + #777 combined).prepare-release-notes(new): generatesrelease.md(preserving the# Package $versionheader) in parallel with tests/builds and uploads it as therelease-notesartifact.build-signed-upm-package(new): signscom.ivanmurzak.unity.mcp.particlesystem(Unity-Package/Assets/root) with Unity's UPM CLI, verifies attestation + thecom.ivanmurzak.unity.mcp.particlesystem-basename prefix, and uploads the signed.tgz. HARD GATE — notcontinue-on-error; missing signing secrets::error::+exit 1.release-unity-plugin(rewritten): downloads therelease-notes,unity-installer-package, andsigned-upm-packageartifacts and creates the Release + tag in a singlesoftprops/action-gh-release@v2call withbody_path+fail_on_unmatched_files: true. Inline release-notes generation removed; unusedsuccess/release_notesoutputs dropped.publish-unity-installerremoved;cleanup-artifactsre-pointed atrelease-unity-pluginand now also deletessigned-upm-packageandrelease-notes.docs/openupm-signing.md.This workflow is hard-gated on signing. Three repo secrets MUST be configured on
IvanMurzak/Unity-AI-ParticleSystemor the next release will hard-fail with no Release created:See
docs/openupm-signing.mdfor the full one-time setup (including theopenupm/openupmtrackingMode: githubReleaselisting change).Test plan
python -c "import yaml; ..."structural validation passes (jobs present/absent, needs wired, nocontinue-on-erroron the signed-package job).publish-unity-installer/.outputs.success/.outputs.release_notesreferences..unitypackageandcom.ivanmurzak.unity.mcp.particlesystem-<version>.tgz.Closes #15