docs(release): rewrite release_process.md for the per-package model - #340
Conversation
There was a problem hiding this comment.
Pull request overview
Updates the release runbook (doc/release_process.md) to describe a per-package release model for this monorepo, including the ESRP-based publish path and package-specific tagging/versioning expectations.
Changes:
- Expands the runbook scope from two packages to three (core, azuremanaged, and
durable-functions) and documents per-package versioning/tagging. - Documents publish ordering constraints (core before
durable-functions) and ESRP release pipeline stage behavior (eng/ci/release.yml). - Adds guidance around prerelease dist-tags (notably
preview) and verification commands.
Comments suppressed due to low confidence (3)
doc/release_process.md:49
- The runbook says the Prepare Release workflow has a required
packageinput, but the current.github/workflows/prepare-release.yamlonly accepts aversioninput and bumps bothdurabletask-jsanddurabletask-js-azuremanagedtogether. If this doc is intended to merge independently of the per-package workflow change, this step should either be conditional or call out the prerequisite explicitly.
3. **Select the `package` to release** (required) — one of `durabletask-js`, `durabletask-js-azuremanaged`, or `azure-functions-durable`. Each run releases exactly one package.
doc/release_process.md:237
- This bullet claims the Prepare Release workflow's run summary suggests an
npm publish ... --tag previewcommand, but the current workflow summary only prints version/branch/tag and a Create PR link; it doesn't mentionnpm publishor dist-tags. This should be phrased as manual guidance (or gated on the per-package workflow update).
- The **Prepare Release** workflow publishes *every* prerelease (any version containing `-`) under the single **`preview`** dist-tag — its run summary suggests `npm publish --registry https://registry.npmjs.org/ --tag preview` — so a prerelease never moves `latest`.
doc/release_process.md:43
- This section currently reads as if the repo already has the per-package Prepare Release workflow (package selection, package-scoped tags/branches, etc.), but
.github/workflows/prepare-release.yamlin this branch is still the legacy workflow (singleversioninput, bumps two packages, tagsvX.Y.Z). Without an explicit prerequisite note, the runbook will be incorrect if merged before the workflow update.
Use the **Prepare Release** GitHub Action to automate the release preparation process.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (4)
doc/release_process.md:62
- This section describes a per-package Prepare Release workflow (package-scoped tags/branches, changelog scoped to a package directory,
durable-functionsnpm publish guard). The current.github/workflows/prepare-release.yamldoes not do any of this: it generates the changelog fromgit log <latest-tag>..HEAD(no path scope), bumps bothpackages/durabletask-jsandpackages/durabletask-js-azuremanaged(and rewrites the azuremanaged peer dependency to>=$NEW_VERSION), writes only the repo-rootCHANGELOG.md, and createsrelease/v<version>+v<version>. Either add an explicit prerequisite note that this section applies only after the per-package workflow lands, or update the bullets to match the workflow that currently exists.
For the **one package you selected** (and only that package):
1. **Determines the next version**: uses the `version` input, or auto-increments the selected package's current version
2. **Generates a changelog**: lists commits since that package's last release tag, scoped to the package's directory (`git log <last-tag>..HEAD -- <pkg-dir>`), so only commits that touched that package are included
3. **Bumps the version**: updates `version` in that package's own `package.json`
4. **Updates that package's changelog**: core and azuremanaged write the repo-root `CHANGELOG.md`; `durable-functions` writes `packages/azure-functions-durable/CHANGELOG.md`
5. **Creates a release branch and a package-scoped tag**: tag `<prefix><version>` and branch `release/<prefix><version>`, where the prefix is `v` (core), `azuremanaged-v`, or `durable-functions-v`
6. **For `durable-functions` only**: verifies the exact-pinned `@microsoft/durabletask-js` version is already published on public npm, and fails the run if it is not (guards the uninstallable-dependency case)
doc/release_process.md:239
- These bullets again state that the Prepare Release workflow emits
npm publish ... --tag previewand thatdurable-functions4.x previews are documented asnpm install durable-functions@previewinpackages/azure-functions-durable/CHANGELOG.md. In the current repo, the workflow summary does not emit a publish command, and the compat package changelog is currently just## TBDwith no preview install guidance. This should be rewritten to avoid referencing behavior/docs that aren’t present yet.
- The **Prepare Release** workflow prescribes publishing *every* prerelease (any version containing `-`) under the single **`preview`** dist-tag: its run summary emits `npm publish --registry https://registry.npmjs.org/ --tag preview` for you to run after the release PR merges — so a prerelease never moves `latest`.
- **`durable-functions` 4.x previews ship under `preview`.** Its documented install line is `npm install durable-functions@preview` (see `packages/azure-functions-durable/CHANGELOG.md`); publish these with `npm publish --tag preview`.
- Whether the **ESRP** pipeline (Step 3) can set a dist-tag is an open question (B11); the `--tag` guidance here applies to a manual `npm publish`.
doc/release_process.md:39
- This note asserts the Prepare Release workflow emits an
npm publish … --tag previewcommand and thatdurable-functionspreviews ship underpreview. In the current repo,.github/workflows/prepare-release.yamldoes not emit anynpm publishcommand (it only prints branch/tag/PR link), andpackages/azure-functions-durable/CHANGELOG.mddoes not documentdurable-functions@preview(it currently only has a## TBDplaceholder). This guidance should be rewritten to avoid stating behavior that isn’t present in the repo yet.
This issue also appears on line 237 of the same file.
> Note: current tooling overrides the beta/rc rows above for prereleases. The **Prepare Release** workflow emits an `npm publish … --tag preview` command (in its run summary, to run after the release PR merges) for **any** prerelease version — any version containing `-` — so prereleases go out under the single `preview` dist-tag rather than `beta`/`next`; `durable-functions` 4.x previews ship under `preview` (`npm install durable-functions@preview`). See *Quick Reference: npm Dist Tags* below.
doc/release_process.md:51
- The docs say the Prepare Release workflow requires selecting a
packageinput and givesdurable-functions-specific version examples. In the current.github/workflows/prepare-release.yaml, the only workflow_dispatch input isversion, and the workflow always bumps bothdurabletask-jsanddurabletask-js-azuremanagedtogether. Please make these steps conditional (or add a prerequisite note) so the runbook stays accurate until the per-package workflow is actually present.
This issue also appears on line 55 of the same file.
3. **Select the `package` to release** (required) — one of `durabletask-js`, `durabletask-js-azuremanaged`, or `azure-functions-durable`. Each run releases exactly one package.
4. Optionally specify a version (e.g., `0.2.0-beta.1` for core, or `4.0.0-beta.1` for `durable-functions`). Leave empty to auto-increment the selected package's current version (bumps the prerelease number for a prerelease, otherwise the patch).
5. Click **Run workflow**
Split out of #335 as a standalone, independently reviewable change. The doc/release_process.md content here is byte-identical to that branch's runbook commit (c602302). Rewrites the release runbook for the per-package release model: - per-package independent versioning, changelogs, and tags - the one hard ordering constraint: core must publish before durable-functions (compat exact-pins @microsoft/durabletask-js), while azuremanaged is unordered - ESRP via eng/ci/release.yml documented as the sanctioned publish path, with its three individually-selectable per-package stages - the required `package` workflow input and prefix-derived branch/tag names - the durable-functions@preview dist-tag Whether ESRP can set an npm dist-tag is left as an explicit open action item, not asserted as fact. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: d86f5f69-4e1a-4c1d-b017-5e290c85cc05
The Prepare Release workflow does not publish anything. It computes an `npm publish ... --tag preview` command (for any prerelease, i.e. any version containing "-") and writes it into the run summary for a human to run after the release PR merges. Reword the dist-tag note under the table, and the matching Quick Reference bullet, so both say the workflow emits/prescribes that command rather than publishing it. Keeps the "any version containing -" trigger, the preview-overrides-beta/rc point, and the durable-functions@preview example. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: d86f5f69-4e1a-4c1d-b017-5e290c85cc05
Follow-up on the rebase onto main (which now contains #337 + #339). Corrects doc/release_process.md so it matches the merged per-package release automation and the owner's #339 changelog decisions: - dist-tags: replace the misleading per-stage beta/next table + override note with the actual rule -- every prerelease publishes under a single `preview` dist-tag; a stable GA omits `--tag` and moves `latest`; git tags (v.../azuremanaged-v.../durable-functions-v...) are separate from npm dist-tags. Applied to both the Versioning Scheme and Quick Reference sections. - Prepare Release only prepares a branch/tag/changelog; its emitted `npm publish` command is a MANUAL FALLBACK. The sanctioned publish path is the ADO official build + ESRP release pipeline. - add a one-time azuremanaged tag preflight (seed azuremanaged-v0.3.0 from v0.3.0) so per-package changelog generation starts at v0.3.0 instead of the repo root -- no azuremanaged-v* tag exists yet, so the first run would otherwise fall back to the initial commit and dump the entire history. - Publishing Step 2: the official build (official-build.yml) triggers on and builds `main` -- it has no branch/tag selector and never builds the release branch; one main build packs all three .tgz into one drop; stage selection decides which package publishes. - Publishing Step 3: source artifact is the selected `main` official build (release.yml pins its build resource to branch: main); make explicit that core + compat need two release waves because the compat Prepare Release guard queries public npm for the exact core pin. - changelog wording: generated `### Changes` commit/PR entries, not hand-authored `### Breaking Changes`; preview/migration narrative lives in packages/azure-functions-durable/README.md; Quick Reference citation moved from the compat CHANGELOG to the README. - keep B11 as an explicit hard blocker for publishing durable-functions@ 4.0.0-beta.1 via ESRP; do not claim ESRP supports npm dist-tags. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: d86f5f69-4e1a-4c1d-b017-5e290c85cc05
8eacb0d to
54d5ae0
Compare
…fix B11 contradiction) The Versioning Scheme and Quick Reference sections asserted (unqualified) that "every prerelease publishes under a single preview dist-tag", which contradicts the B11 note that the sanctioned ESRP path's dist-tag behavior is unknown and blocked. Only #337's emitted MANUAL FALLBACK `npm publish` command is known to use `--tag preview`; ESRP is not. - Versioning Scheme: scope the preview mapping to the Prepare Release workflow's emitted manual fallback command, and state that sanctioned prerelease publishing via ESRP is blocked pending B11. - Quick Reference prerelease bullet: "Every prerelease publishes..." -> "When using this manual fallback, publish every prerelease..."; `latest` protection and the README install citation are preserved. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: d86f5f69-4e1a-4c1d-b017-5e290c85cc05
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (5)
doc/release_process.md:133
- Same as earlier: “B11” is not defined anywhere in-repo, so the label doesn’t help the reader. Consider removing the internal label (or defining it) while keeping the warning.
> **Open question (B11) — hard blocker for ESRP prereleases:** it is not yet confirmed whether the ESRP release task can set the npm **dist-tag** (e.g. publish a prerelease under `preview` rather than moving `latest`). Publishing a prerelease such as `durable-functions@4.0.0-beta.1` through ESRP is **blocked** until the ESRP / 1ES pipeline owners confirm how to apply the `preview` tag — do **not** assume ESRP applies a dist-tag. The `--tag` guidance in *Quick Reference: npm Dist Tags* applies to a manual `npm publish`.
doc/release_process.md:242
- “Open question (B11)” uses an internal label that isn’t defined elsewhere in the repo. Dropping the label (or defining it) would make this quick reference clearer to future maintainers.
- **ESRP path (sanctioned, Step 3):** whether the ESRP release task can set an npm dist-tag is an **open question (B11)** and a **hard blocker** for publishing a prerelease such as `durable-functions@4.0.0-beta.1` through ESRP — confirm with the ESRP / 1ES owners how to apply the `preview` tag before publishing any prerelease via ESRP. Do **not** assume ESRP applies a dist-tag; the `--tag preview` guidance above is for a manual `npm publish`.
doc/release_process.md:39
- The reference to “B11” is unclear/undefined in this repo, which makes this prerequisite hard to interpret for maintainers. Consider removing the internal label (or defining it explicitly) and state the dependency in plain terms.
This issue also appears in the following locations of the same file:
- line 133
- line 242
The scheme above describes the version **string**. Mapping a version to an **npm dist-tag** is a separate concern and does **not** follow a per-stage `beta`/`next` convention: the **Prepare Release** workflow's emitted **manual fallback** `npm publish` command tags every prerelease `preview` and omits `--tag` for a stable GA (so only a GA moves `latest`). Publishing a prerelease through the sanctioned ESRP path is **blocked pending B11** until owners confirm whether the ESRP task can set that tag. See *Quick Reference: npm Dist Tags* below for the authoritative rule.
doc/release_process.md:102
- This sentence claims the official build “has no branch/tag selector and never builds” the release branch. The YAML shows it triggers on
main, but it can still be manually queued on other branches; the more important constraint is that the release pipeline consumes artifacts frommain(resource pinned tobranch: main). Rewording avoids an absolute statement that may be inaccurate.
Trigger the official build pipeline to produce signed `.tgz` artifacts. The official build (`eng/ci/official-build.yml`) triggers on and builds **`main`** — it has no branch/tag selector and never builds the short-lived release branch. Use (or pick the automatic run of) the official build whose source commit **includes the merged release commit(s)**:
doc/release_process.md:123
- Leaving “ADO pipeline link: TBD” makes this step non-actionable in practice. If the link can’t be provided yet, it’s clearer to omit the placeholder (or replace it with concrete navigation instructions / a tracked issue).
**Pipeline**: `eng/ci/release.yml` (ADO pipeline link: TBD)
Splits the release-runbook rewrite out of #335.
What
Rewrites
doc/release_process.mdfor the per-package release model:durable-functions(compat exact-pins@microsoft/durabletask-js), while@microsoft/durabletask-js-azuremanagedis unordered (peer floor>=0.3.0already satisfied by published core);eng/ci/release.ymldocumented as the sanctioned publish path, with its three individually-selectable per-package stages;packageworkflow input and prefix-derived branch/tag names;durable-functions@previewdist-tag.Whether ESRP can set an npm dist-tag is written as an explicit open action item, not asserted as fact.
Provenance
doc/release_process.mdcontent is byte-identical to #335's runbook commitc602302.Part of the #335 split
#335 is being decomposed into four mutually independent PRs that can merge in any order:
Together these carry every one of #335's 10 files with no overlap. #335 stays open until the file→PR mapping posted there is confirmed; these PRs neither merge nor close it.