Skip to content

Return to the manual release process: restore package.yml, remove the publish automation - #1375

Merged
sacOO7 merged 6 commits into
integration/v2from
chore/revert-release-automation
Nov 2, 2026
Merged

sacOO7 merged 6 commits into
integration/v2from
chore/revert-release-automation

Conversation

@sacOO7

@sacOO7 sacOO7 commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Summary

This goes back to the 1.x release model, as the lead dev decided. CI packs the packages and uploads them as workflow artifacts. The release engineer then downloads them, checks them, and pushes them to nuget.org by hand, in dependency order.

The automated publish.yml (Trusted Publishing, release environment, dry-run dispatch) has never run and was never set up on nuget.org or in the repo settings, so there is nothing to undo outside the repo.

What's removed

  • .github/workflows/publish.yml and .github/workflows/release-dry-run.yml.
  • cake-build/tasks/release.cake, and with it every release-only target and task: Release.Preflight, Release.VerifyPackages, _Release_Preflight, _Release_Verify_Files and _Release_Verify_Packages. _Version and Package no longer depend on them.
  • The "Release Targets" section of cake-build/README.md, and the publish.yml / Trusted Publishing text in CONTRIBUTING.md.

What's restored or changed

.github/workflows/package.yml ("Package ably"), restored from main and adapted to the 2.0 packages. It keeps the file name, the version input, the pinned action SHAs and contents: read. Because main still has its 1.x copy, it can be dispatched against integration/v2 before PR 1340 merges.

  • package-library (windows-2022, needed for the net46 heads): ./package.cmd $VERSION, then the package-install test (Test.PackageConsumption.NoPack) on the packed files, with the .NET Framework apps on the .NET Framework CLR. Uploads ably-package.
  • package-unity (ubuntu-22.04, unchanged from main): ./package-unity.sh $VERSION. Uploads ably-unity-package, and now fails if no .unitypackage was produced.
  • merge-artifacts: output-package must hold exactly Ably.PubSub.{Core,Device,Server}.$VERSION.nupkg and ably.pubsub.$VERSION.unitypackage, and the job prints their SHA-256 values.
  • Dropped: the Android SDK and Xamarin steps, and the package-push job, which built packages 2.0 no longer has.

The package-install test still runs on every PR:

  • The full Test.PackageConsumption is now the last step of "Unit and Integration Test: Windows (NetFramework)". It packs at the committed version, and the .NET Framework apps run on the .NET Framework CLR. This replaces the per-PR packaging run that release-dry-run.yml did.
  • The macOS (Mono) step from PR 1373 is unchanged.

Cake:

  • The package set (nugetPackageSet), NuspecDirectory() and PackageOutputDirectory(), which reads --packageOutput, moved from release.cake to package.cake. _Package_Create_NuGet and package-consumption.cake now use them.
  • Package now fails without --version. Before, it would silently pack nothing once the pre-flight was gone. package.cmd and package-unity.sh also exit 1 without a version.

Comments in the nuspecs, paths.cake, build.cake, features.yml and the PackagingSpecs summary were updated to match. The "lockstep" wording about the versioning contract stays.

Pending lead-dev decisions (separate, droppable commits)

  • D1: "Check the packed door pins after every pack". Adds _Package_Verify_NuGet, which Package runs after the pack (and which can be run alone as Package.Verify). It asserts each package's packed version, and that every dependency group of both doors pins Ably.PubSub.Core as exactly [x.y.z]. PackagingSpecs only sees the source nuspecs, and a loose packed pin still passes the package-install test. I checked that locally: a package whose pin was loosened to 2.0.0 passed all 8 package-install cases, and D1 rejected it. If D1 is dropped, nothing checks the packed pin, and the nuspec and PackagingSpecs comments from the first commit, which point at CONTRIBUTING.md for that check, need rewording.
  • D2: "Check the package.yml version input against the committed version". Adds a step before packing that fails unless the version input equals src/CommonAssemblyInfo.cs (all three attributes), unity/Assets/Ably/version.txt, and the ProductVersion of the committed Unity plugin. Without it, _Version silently stamps whatever version it's given, as on 1.x.

Each is one self-contained commit. Reverting either applies cleanly, and the CONTRIBUTING.md release steps don't depend on them.

CONTRIBUTING.md release process

The release section is back to main's short numbered steps. It changes only what's different for the 2.0 packages:

  • The version files also include the README PackageReference examples.
  • output-package holds Ably.PubSub.Core, Ably.PubSub.Device and Ably.PubSub.Server .nupkg files plus ably.pubsub.<version>.unitypackage.
  • The packages are pushed one at a time, Ably.PubSub.Core first. Ably.PubSub.Device and Ably.PubSub.Server follow once the core is listed on nuget.org, because they pin that exact version.

The rest of the file is integration/v2's, including the PR 1372 changes. This branch has integration/v2 merged in (after PRs 1371 and 1372 landed). The CONTRIBUTING.md conflict was confined to the release section.

Validation

  • ./build.sh --target=Build.NetStandard: 0 warnings, 0 errors.
  • ./build.sh --target=Test.NetStandard.Unit.WithRetry --framework=net6.0: 1474 tests; 1455 passed, 19 skipped, 0 failed. All 14 PackagingSpecs cases passed.
  • Locally on macOS with Mono:
    • Package --version=2.0.0 --packageOutput=<scratch> packs all three, and D1 passes.
    • Test.PackageConsumption.NoPack against that output: 8/8.
    • The Mono CI command (Test.PackageConsumption --packageOutput=consumption-packages): 8/8.
    • Release.Preflight is now "target not found", and Package without --version fails.
  • D2's PowerShell step, run locally with PowerShell 7: it passes for 2.0.0 and fails for 2.0.1, with all five mismatches reported.
  • actionlint and a YAML parse pass on every changed workflow.
  • A grep for release.cake, publish.yml, release-dry-run, _Release_, Release.Preflight, dry_run, NUGET_USER, Trusted Publishing and the old helper names returns nothing. The remaining lockstep hits are about the versioning contract.
  • Independent reviews passed on each pushed head. The full revert was reviewed at c5240420 (every 3D item in the revert plan done or deferred with a reason). The integration/v2 merge was checked against both parents at 60b472d2 (Build.NetStandard 0/0; net6.0 unit tests 1492 total, 1473 passed, 19 skipped, 0 failed). The review-thread fixes and the shortened release section were reviewed at their own heads.
  • Not done here: dispatching package.yml against this branch. That's the first follow-up below.

Follow-ups not in this PR

Summary by CodeRabbit

  • New Features
    • Added a manually triggered packaging workflow that builds NuGet and Unity packages and provides a combined artifact with SHA-256 hashes.
    • Package builds now require a version and verify package versions and Core dependency pins.
  • Changes
    • Automated release publishing and pull-request release dry runs have been removed; releases follow a manual process.
    • Package-installation checks now run in the Windows .NET Framework workflow.
  • Documentation
    • Updated packaging and release instructions, including manual publication steps.
  • Bug Fixes
    • Packaging commands now exit with an error when no version is provided.

Go back to the 1.x release model. CI packs the packages and uploads them
as workflow artifacts, and the release engineer downloads them and pushes
them to nuget.org by hand.

- Delete publish.yml, release-dry-run.yml and cake-build/tasks/release.cake,
  with every release-only Cake task and target and their wiring (_Version
  and Package no longer depend on the release checks).
- Restore package.yml from main, adapted to the 2.0 packages: a Windows
  job packs the three NuGet packages and runs the package-install test
  (Test.PackageConsumption.NoPack) on them on the .NET Framework CLR, an
  Ubuntu job builds the Unity package, and output-package holds exactly the
  three .nupkg files and the .unitypackage. The Android, Xamarin and push
  package parts are gone with the packages they built.
- Run the full Test.PackageConsumption as the last step of the Windows
  (NetFramework) workflow, so every PR still runs the package-install test
  on the .NET Framework CLR, alongside the existing Mono step.
- Move the package set, NuspecDirectory() and PackageOutputDirectory()
  (behind --packageOutput) into package.cake, and point
  package-consumption.cake at them.
- Make Package, package.cmd and package-unity.sh fail without a version
  instead of succeeding with nothing packed.
- Update the comments, the PackagingSpecs summary and cake-build/README.md
  to match.
Pending lead-dev decision D1; this commit can be dropped on its own.

Add _Package_Verify_NuGet, run by Package after the pack and available
alone as Package.Verify. It opens each produced .nupkg and asserts its
version, and that every dependency group of both door packages pins
Ably.PubSub.Core as exactly [x.y.z].

PackagingSpecs checks the source nuspecs, but whether $version$ is
substituted inside the dependency's version attribute is a property of
the packer. A loose packed pin (x.y.z, a minimum) still passes the
package-install test, because restoring from the local source resolves
the same version, so nothing else catches it before the packages are
published.
Pending lead-dev decision D2; this commit can be dropped on its own.

Package stamps src/CommonAssemblyInfo.cs with whatever version it is
given, so a dispatch with the wrong version would pack binaries that
match neither the release commit nor the Unity plugin. Before packing,
fail unless the input equals the three assembly version attributes in
src/CommonAssemblyInfo.cs (numeric part for AssemblyVersion and
AssemblyFileVersion), unity/Assets/Ably/version.txt and the
ProductVersion of the committed Unity plugin.
Replace the publish.yml dispatch steps and the Trusted Publishing setup
with the manual process: bump the version files, regenerate the Unity
plugin after the bump, update the CHANGELOG, merge the release PR,
dispatch package.yml, download output-package, verify the packages
locally (version, exact core pin in every door group, lib/<tfm>
contents, strong-name token, the package-install test, README), then
push Ably.PubSub.Core alone, wait until nuget.org has indexed it, push
the device and server packages, and tag and release on GitHub. Add the
prerequisites, a nuget.org API key note and a release checklist.

The section is written on top of the docs refresh's wording of the
unchanged parts, so merging both only conflicts inside this section.
@coderabbitai

coderabbitai Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Caution

Review failed

The pull request is closed.

Recent review info
Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 9de8a314-ce92-40ee-bfa2-08b96b938ebd
Commits

Reviewing files that changed from the base of the PR and between f09a40a and 60b472d.

Files selected for processing: 18
  • .github/workflows/features.yml
  • .github/workflows/package.yml
  • .github/workflows/publish.yml
  • .github/workflows/release-dry-run.yml
  • .github/workflows/run-tests-windows-netframework.yml
  • CONTRIBUTING.md
  • cake-build/README.md
  • cake-build/build.cake
  • cake-build/helpers/paths.cake
  • cake-build/tasks/build.cake
  • cake-build/tasks/package-consumption.cake
  • cake-build/tasks/package.cake
  • cake-build/tasks/release.cake
  • nuget/ably.pubsub.device.nuspec
  • nuget/ably.pubsub.server.nuspec
  • package-unity.sh
  • package.cmd
  • src/Ably.PubSub.Tests.DotNET/PubSub/PackagingSpecs.cs
Files with no reviewable changes: 4
  • cake-build/build.cake
  • .github/workflows/release-dry-run.yml
  • cake-build/tasks/release.cake
  • .github/workflows/publish.yml

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

Walkthrough

The change adds a manual workflow to package NuGet and Unity artifacts. Cake packaging tasks now verify packed NuGet versions and Core dependency pins. The automated publishing workflows and release Cake tasks are removed, and the release instructions describe manual publication.

Changes

Manual release packaging

Layer / File(s) Summary
Shared package contract and verification
cake-build/tasks/package.cake, cake-build/tasks/package-consumption.cake, src/Ably.PubSub.Tests.DotNET/PubSub/PackagingSpecs.cs, nuget/*.nuspec, cake-build/README.md
Cake packaging now requires a version and verifies package versions and exact Core dependency pins. Package-consumption checks use shared package helpers. Comments and documentation describe the package checks.
Manual artifact packaging workflow
.github/workflows/package.yml, .github/workflows/run-tests-windows-netframework.yml, .github/workflows/features.yml, package-unity.sh, package.cmd, cake-build/README.md
The manual workflow checks the version, builds NuGet and Unity artifacts, and combines and validates them. The Windows .NET Framework workflow tests package installation. The packaging scripts fail when no version is supplied.
Remove automated publishing and document manual release steps
.github/workflows/publish.yml, .github/workflows/release-dry-run.yml, cake-build/tasks/release.cake, cake-build/build.cake, cake-build/tasks/build.cake, cake-build/helpers/paths.cake, CONTRIBUTING.md, cake-build/README.md
The publish and dry-run workflows and release Cake tasks are removed. The release instructions describe manual package publication and release steps.

Estimated code review effort: 4 (Complex) | ~45 minutes

Change: Other

Sequence Diagram(s)

sequenceDiagram
  actor Maintainer
  participant PackageWorkflow as package.yml
  participant WindowsJob as Windows packaging job
  participant UbuntuJob as Ubuntu packaging job
  participant MergeJob as Merge job
  Maintainer->>PackageWorkflow: Dispatch with version
  PackageWorkflow->>WindowsJob: Check version, package NuGet, run install tests
  PackageWorkflow->>UbuntuJob: Package Unity assets
  WindowsJob->>MergeJob: Upload NuGet artifacts
  UbuntuJob->>MergeJob: Upload Unity artifact
  MergeJob->>Maintainer: Upload combined artifact
Loading

Possibly related PRs

Suggested reviewers: umair-ably, ttypic

Merge Risk: Moderate · up to 98f5a

Packages may come from an unintended commit, and the release tag may point elsewhere. Verify and tag the packaged commit before release.

Pre-merge checks: Passed 4 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentat… Write docstrings for the functions missing them to satisfy the coverage threshold.
Passed Passed checks: 4 passed
Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title clearly summarizes the main changes: restoring the manual package workflow and removing automated publishing.
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentation-only edits and deletions within surviving functions are included; unchanged diff context and fully deleted functions are excluded. Analyzed 1 functions across 2 files. (12 skipped: 12 unsupported.)

Resolution

Write docstrings for the functions missing them to satisfy the coverage threshold.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

A rabbit checks the version bright
Then packs the goods and pins them right
NuGet and Unity travel near
Their hashes make the bundle clear
Manual steps complete the flight

Resolve the CONTRIBUTING.md conflict in the release section: keep the
manual release runbook in place of the publish.yml steps. Everything
above the release section comes from integration/v2 unchanged.

@coderabbitai coderabbitai Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • Fix comments: Fix CodeRabbit comments on this PR

Comment thread .github/workflows/package.yml Resolved
Comment thread cake-build/README.md Resolved
Comment thread CONTRIBUTING.md Resolved
@sacOO7

sacOO7 commented Nov 2, 2026

Copy link
Copy Markdown
Contributor Author

Future release automation (re-introducing automated NuGet publishing) is tracked in #1377.

Shorten the CONTRIBUTING.md release process to the 1.x numbered-step
style, remove the GitHub Codespaces note from it, and document the
--packageOutput argument in cake-build/README.md.
@sacOO7
sacOO7 force-pushed the chore/revert-release-automation branch from 89ec192 to 98f5aac Compare November 2, 2026 10:38
@sacOO7
sacOO7 merged commit bee5240 into integration/v2 Nov 2, 2026
15 checks passed
@sacOO7
sacOO7 deleted the chore/revert-release-automation branch November 2, 2026 10:44

This branch was successfully deployed

1 active deployment
staging/pull/1375/features — 98f5aacd Deployed Nov 2, 2026 by github-actions[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant