Repository navigation
feat: add version-specific Azure hotfix publishing - #7765
Open
Jane Chu (janechu) wants to merge 6 commits into
Open
Jane Chu (janechu) wants to merge 6 commits into
Jane Chu (janechu) wants to merge 6 commits into
Conversation
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 3d5933b7-14a8-40a3-8140-6992e94efbc8
Jane Chu (janechu)
requested review from
Chris Holt (chrisdholt) and
John Kreitlow (radium-v)
as code owners
October 16, 2026 17:20
Require unused npm and crate versions instead of reconciling partial publication. Remove pending-asset copies and self-hashed tooling, preserve provenance and verified completion gates, and encode scoped registry URL components completely. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 3d5933b7-14a8-40a3-8140-6992e94efbc8
Remove the publish parameter and opt-in environment flag while preserving manual-main enforcement and publishing approvals. Document how a hotfix tag selects a reviewed commit from a source branch and verify that later branch commits do not change the build. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 3d5933b7-14a8-40a3-8140-6992e94efbc8
Keep pipeline tooling central while selecting, validating, and pinning the pushed non-main source branch. Document the branch-from-tag workflow in the agent entry points and publishing guides. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 3d5933b7-14a8-40a3-8140-6992e94efbc8
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 3d5933b7-14a8-40a3-8140-6992e94efbc8
Delegate npm and Rust publication to the existing publisher with an explicit maintenance channel and strict errors. Retain provenance and registry verification, remove duplicate ESRP inputs, and document the prerequisite template update and three required variables. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 3d5933b7-14a8-40a3-8140-6992e94efbc8
This branch has not been deployed
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.
Pull Request
📖 Description
Add a version-specific hotfix publishing path that never creates or downloads GitHub Releases.
hotfixBranch, whose tip must match the reviewedhotfix/<package>_v<version>tag descended from a published baseline. Transfer only the selected package and paired crates through a governed Azure pipeline artifact.mainsupplies central tooling only. There is no build-only switch. ReuseFAST.Release.PipelineTemplate.yml@fastPipelineswith an explicit maintenance npm channel and strict publishing failures, rather than duplicating ordinary CD's ESRP tasks.DESIGN.md/README.mdand contributor/operator documentation. Make the branch-from-tag workflow discoverable through Copilot instructions and the shipping skill.No public package source, package versions, or package export sizes change.
🎫 Issues
No existing issue identified. Implements the hotfix pipeline requested in conversation.
👩💻 Reviewer Notes
Merge dependency: the shared release-template update adding backward-compatible
npmDistTagandcontinueOnErrorparameters must merge before this PR. This consumer continues to referencefastPipelinesonmain; previews used the prerequisite branch only as a repository-ref override.The normal nightly release path remains unchanged except for explicit hotfix exclusion. Hotfixes use their own source-tag namespace and Azure artifacts, not ordinary release tags or GitHub release assets.
The required pipeline inputs are
baseTag,hotfixBranch, andhotfixTag. Start a maintenance branch from the published tag (never frommain), make and review the relevant fix/tests/version changes, then push the branch toorigin. A maintainer tags that pushed branch's approved tip and queues the pipeline against it.mainand tag refs are rejected as source branches, and the remote branch head must match the reviewed source tag when planning begins.Azure's branch selector stays on
mainonly for central pipeline tooling; package code is built/tested/packed from the pinned non-main branch snapshot. Historical branches do not need publishing YAML or helper backports. Later branch movement cannot change a planned run, and the source branch does not need to be merged intomain. Already-deployed hotfixes still skip publication. The operator guide, shipping skill, and always-applied Copilot instructions document the same process and retain human control over actual publishing.The hotfix Deploy job now calls the same
FAST.Release.PipelineTemplate.yml@fastPipelinespublisher as ordinary CD, between preflight and post-publication verification. It suppliesnpmDistTag: $(npm_config_tag)andcontinueOnError: false. The template maps the channel to ESRP'sproductstate; local.npmrcconfiguration alone does not configure the distribution service. Publication errors remain failures, and a strictly successful registry verification gates the completion marker.The protected
fast-hotfix-publishingvariable group now needs onlyclientId,keyvault, andtenantId. Owners/approvers and npm/crate directory detection are reused from the shared publisher; separatereleaseOwners,releaseApprovers, and crate-selection wiring are removed.Simplified following review: keep npm packages and paired Rust crates, but remove automatic partial-publication reconciliation, pending-asset copies, self-hashed tooling, and the artifact-local
.npmrc. ESRP publishes the original artifact folders. Any existing version stops preflight for approved manual recovery, even when its bytes match; post-publication verification requires this exact version's maintenance channel.All three URL-encoding review comments are addressed with
encodeURIComponent, including the mocked registry. A regression checks the complete version and dist-tag URLs independently, and both encoded scoped URL forms returned HTTP 200 against the public npm registry.This PR does not register or dispatch a publishing pipeline, create real source/deployment tags, create GitHub Releases, publish packages, or change permissions. Activation requires human configuration of the Azure variable group, approved publishing identity, protected-resource approvals/branch control/exclusive lock, and tag permissions. The exact setup and recovery requirements are documented in
build/README.md.📑 Test Plan
npm run buildnpm run testnpm run biome:checknpm run biome:check -- --staged -- --no-errors-on-unmatchednpm run format:checknpm run checkchangenode build/scripts/create-github-releases.mjs --check-onlyGITHUB_REPOSITORY=microsoft/fast node build/scripts/download-github-releases.mjs --check-onlygit diff --checkandgit diff --cached --check0842d7e0b— GitHub/Azure CI and CodeQLAzure Pipelines Preview expanded both the three-input hotfix YAML and the existing ordinary CD YAML using the prerequisite shared-template branch as a repository-ref override. Structured checks of the compiled hotfix YAML verified both publishers, the explicit npm
productstate, fatal publisher errors, successful-predecessor conditions, preflight/publication/verification ordering, both stages, and verified deployment-marker gating. The ordinary consumer, with no new parameters, retained its unspecified npmproductstateandcontinueOnError: truedefaults. The committed resource still targetsmain, so the template prerequisite must merge first. These were preview-only requests; no pipeline runs were queued.The 32 tests use temporary repositories/local bare remotes, real npm tarballs, offline Cargo archives, standalone copied verification tools, and mocked registry responses. They cover source materialization/provenance, malformed and moved tags, version-line restrictions, paired crate validation, archive integrity, publish-config overrides, no-GitHub-release routing, always-included publication with central manual/main enforcement, rejection of previously published versions, exact scoped URL encoding, channel rollback/latest rejection, per-registry checksum verification, and verified completion markers.
Branch regressions reject missing/invalid/main/tag-ref inputs, local-only or missing remote branches, branch/tag mismatches, and mismatched publication context before registry access. The successful source-selection test uses a historical branch with no pipeline YAML, accepts
refs/heads/..., advances and pushes the branch after planning, and confirms packing still uses the original pinned source. The new required-branch and remote-branch regressions failed before implementation.The shared-template regression failed before integration and now requires the shared repository/call, explicit channel and strict failure parameters, and absence of duplicated ESRP tasks. The installed ESRP v10 task metadata confirms
productstateandwaitforreleasecompletionsemantics; authenticated EngHub guidance was not accessible.Lage's cached browser output includes an earlier Firefox retry; these browser tasks were not freshly executed. The initial GitHub CI run failed before project tests when the existing unlocked
cargo install wasm-packresolved a yankedzipdependency. The new hotfix pipeline usescargo install wasm-pack --locked; the published wasm-pack crate includes the required lockfile. General CI workflows are outside this change; the revised commit has fresh CI runs.No live ESRP publication or production hotfix run was performed.
✅ Checklist
General
$ npm run changeAgents
⏭ Next Steps
Merge the prerequisite shared-template update first. After this PR merges, an administrator must complete the activation/permissions steps in
build/README.md, validate the pipeline through Azure preview against the merged template, and review the built artifact before approving the first publication. Every queued new valid run requests publishing, subject to the configured approvals; there is no dry-run parameter. Keep all hotfix source tags immutable and outside the GitHub Releases flow.