Repository navigation
PFM-ISSUE-34283 - Consolidate the FE 2.0 release flow into a single workflow - #183
Conversation
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…orkflow - Add fe-release-flow.yml: guard -> install-deps -> build || e2e -> release (tag + publish) -> GitHub release in one run - Artifacts tool: RELEASE_FLOW mode with FORCE; affected check since the previous tag of the line; outputs released/tag/previous_tag/is_latest - run-many: normalize an empty/undefined ref so GHA_REF '' selects all projects - Remove the cancelling concurrency from fe-install-deps.yml - Replace the fe-release caller template (push release/* + dispatch force), delete fe-tag-pushed template - Document the flow in the README Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Benno42
left a comment
There was a problem hiding this comment.
Great! Clear flow, and the tests pass locally. Live validation is still open. maybe we can test it before merging.
| } else { | ||
| // affected since the previous release of the line, not since the pushed range: | ||
| // a push whose queued run was cancelled must not be missed | ||
| this.base = previousTag; |
There was a problem hiding this comment.
❓After a failed publish, "Re-run failed jobs" finds nothing affected and ends green without publishing, but design.md and plan.md promise a release. Is this intended, or should the run fail when the latest tag has no published artifact? 🤖
There was a problem hiding this comment.
Good catch, confirmed: with the previous tag as base, the dangling tag became the base and the re-run found nothing. Fixed by switching to publish before tag:
- the tool writes the version to
$RUNNER_TEMPbefore publishing, publishes all projects, then pushes the tag - a new cleanup step in the
releasejob (failure() || cancelled()) unpublishes that version via the existingONLY_DELETE_ARTIFACTS+TAGmode, unless the tag is already on the remote - the constructor-ordering bug is fixed so
TAGon arelease/*branch keeps its own version (needed for the cleanup)
Result: a version/* tag always means a complete release, and "Re-run failed jobs" (or the next push) releases the same version. design.md, plan.md and the README are updated accordingly.
…, caller concurrency - Publish first, then tag; a failed or cancelled release is unpublished by a cleanup step (ONLY_DELETE_ARTIFACTS + TAG), so a re-run releases the same version - Fix the constructor ordering: a TAG on a release branch keeps its own version - Guard fails while old fe-release/fe-tag callers exist; deprecation warnings in fe-tag.yml and workflows/fe-release.yml; link PFM-ISSUE-34282 - Concurrency moves to the caller templates (fe-pr, fe-main); README migration steps - Release job: plain npm ci, git identity via env, drop the redundant released output - calculateNewVersion returns a new Version instead of mutating the tag list - README recovery and design.md aligned (publish before tag, master only) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Summary
Replaces the two-run FE 2.0 release (branch push →
fe-tag.ymlpushes a tag → tag push →fe-release.ymlpublishes) with one run per push torelease/*or manual dispatch:guard → install-deps → build ∥ e2e → release (tag + publish, one job) → GitHub release
Ticket: PFM-ISSUE-34283
Changes
.github/workflows/fe-release-flow.yml(new reusable workflow)FORCEandRUN_E2Eguardjob that fails a dispatch on any ref other than the default branch orrelease/*releasejob that tags and publishesgithub-releasejob that usesGITHUB_TOKEN, sets the notes range from the previous tag of the line, and marks "Latest" only on the highestversion/*tagRELEASE_FLOWmode. It computes the next version, then checks for affected projects since the previous tag of the line (skipped whenFORCEis set or for X.Y.1). It then pushes the tag and publishes all projects at that version.released,tag,previous_tagandis_latest, exposed through the composite action.[branch-off]guard still runs first.run-manyturns an empty or undefined ref into'', soGHA_REF: ''selects all projects again. This was the original intent: pushes to main and release branches build all projects, PRs build only the affected ones.fe-install-deps.ymlloses its job-levelcancel-in-progressconcurrency. The new caller has its own run-level, non-cancelling concurrency instead.fe-release.ymlis replaced: push torelease/*, plusworkflow_dispatchwithforce, plussecrets: inherit. Thefe-tag-pushed.ymltemplate is deleted.force, secrets, recovery, concurrency.Behavior notes
[branch-off]commits are never tagged or published.Not in scope
version/*tag ruleset, a tag-triggered recovery path, and skip-if-exists or resumable publish.GITHUB_TOKEN(34282), immutable releases (34284), retiringGIT_USER*(34286).fe-tag.yml/workflows/fe-release.yml. Unmigrated callers keep the old flow.25.4–26.4don't get the new workflow. The first line with it is the next branch-off.Verification
affected-projects,artifacts-handler-release-flow(including[branch-off]over force) andutilstests pass. The only failures are the 5 known Windows path-separator tests, which also fail onmaster.tsc --noEmitis clean.release/99.xline (seeplan.md, "Manual Testing Steps").🤖 Generated with Claude Code