尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Backstage 补丁发布流程全解析:从 `.patches` 目录到自动化的 Patch Release PR

Backstage 补丁发布流程全解析:从 `.patches` 目录到自动化的 Patch Release PR Backstage 补丁发布流程全解析从.patches目录到自动化的 Patch Release PR【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage.patches目录是 Backstage 仓库中维护“下一个补丁版本”修复清单的核心位置每个文件对应一个待纳入补丁发布的 Pull RequestPR。本文以 .patches/README.md 为骨架结合仓库内真实存在的补丁脚本、示例文件与 GitHub Actions 工作流完整讲解如何把一个 PR 加入补丁集、补丁如何被自动应用并生成 Patch Release PR以及整个流程如何在 CI 中自循环帮助你掌握 Backstage 补丁发布的完整操作链路与底层实现原理。1. 背景什么是 Patch Release.patches目录扮演什么角色在 Backstage 的版本发布体系中除了常规的版本迭代外还存在面向上一个稳定版本的补丁发布Patch Release把若干已经合入主干master的修复性 PR 挑选出来统一移植到对应的patch/vX.Y.Z分支上重新生成发布产物并产出一个以 Patch Release 为标题的 Pull Request供维护者评审后合并发布。[.patches](https://link.gitcode.com/i/3030f6e62ebdebe9c25e510e0c017c21)目录正是这一流程的“待办清单”目录内存放格式为pr-number.txt的补丁文件其中number是对应 Pull Request 的编号文件内容是该修复的描述文本目录同时附带 README.md 说明使用方式以及 create-pr-patch.js 实现yarn patch-pr命令目录状态一旦发生变更新增、修改、删除补丁文件会触发 .github/workflows/sync_patch-release.yml 工作流自动让 Patch Release PR 与目录保持同步。也就是说.patches目录既是人工维护的清单又是自动化流程的输入源二者通过文件系统这一约定完成衔接。2..patches目录结构清单、脚本与真实补丁示例当前仓库的.patches目录包含以下内容文件作用README.md补丁发布流程说明文档本文主题create-pr-patch.jsyarn patch-pr命令的底层实现脚本pr-35235.txt补丁示例catalog 导入时的 owner 自动补全修复pr-35270.txt补丁示例catalog 页面 owner 过滤器归一化修复pr-35279.txt补丁示例软件模板内联条件表达式渲染修复pr-35284.txt补丁示例ownership 卡片链接的 canonical owner 引用修复补丁文件遵循文件名编码 PR 号、文件内容编码修复描述的约定。以 pr-35235.txt 为例其内容为Fixed the catalog import owner autocomplete to write canonical group entity references instead of display names to generated catalog-info.yaml files.其余三个文件的描述同样是一句话的修复说明pr-35270.txt修复从 ownership 卡片打开的 catalog 页面在渲染前对遗留的裸 owner 过滤器做归一化避免实体引用错误pr-35279.txt修复软件模板中不带else分支的内联条件表达式条件为假时渲染空字符串pr-35284.txt修复 ownership 卡片链接改为按 canonical owner 实体引用过滤 catalog而不是使用可变的展示标题。这些真实示例表明补丁文件内容无需结构化字段一行人类可读的描述即可后续工作流会把它拼进 Patch Release PR 的正文。3. 添加补丁yarn patch-pr命令及其实现3.1 命令用法要把一个 PR 加入补丁集在仓库根目录执行yarn patch-pr pr-number descriptionpr-number待纳入补丁发布的 Pull Request 编号整数description对该修复的一句话描述多个单词之间用空格分隔命令会将其整体拼接。命令在 package.json 中注册为patch-pr: node .patches/create-pr-patch.js3.2 底层实现解析.patches/create-pr-patch.js 是一个非常精简的 Node 脚本共 17 行核心逻辑如下const prNumber process.argv[2]; const description process.argv.slice(3).join( ); if (!prNumber || !description) { console.error(Usage: yarn patch-pr pr-number description); process.exit(1); } const patchFilePath path.join(__dirname, pr-${prNumber}.txt); fs.writeFileSync(patchFilePath, description);可以拆解出几个关键点参数来源process.argv[2]取 PR 号process.argv.slice(3).join( )把剩余参数用空格连接成描述文本因此描述中的多个单词可以自由书写参数校验PR 号或描述任一缺失时打印用法提示并process.exit(1)以非零码退出避免生成内容不完整的补丁文件落盘位置通过path.join(__dirname, ...)把文件写入.patches目录脚本自身所在目录命名为pr-number.txt写入方式使用同步writeFileSync直接写入描述文本内容即最终出现在 Patch Release PR 正文中的描述。从源码结构看该脚本刻意保持只创建文件、不做任何 Git 或 GitHub 操作的单一职责其余工作全部交由发布脚本与 CI 工作流完成。4. 补丁发布核心脚本scripts/patch-release-for-pr.js如果说create-pr-patch.js负责登记那么 scripts/patch-release-for-pr.js 才是真正执行补丁发布的引擎拉取 PR 提交、移植到补丁分支、跳过已应用的补丁、重新生成发布产物并输出 Patch Release PR。4.1 两种调用方式与参数解析脚本通过parsePatchArguments支持两种输入模式见 patch-release-for-pr.js模式触发方式行为目录模式node scripts/patch-release-for-pr.js --from-dir短选项-d从.patches/目录读取全部pr-*.txt补丁文件命令行模式node scripts/patch-release-for-pr.js 35235 35270 ...使用位置参数作为 PR 号列表需为整数否则报错目录模式的读取逻辑在readPatchesFromDirectory中实现L141-L175用正则PATCH_FILE_PATTERN /^pr-(\d)\.txt$/过滤目录文件逐个读取内容空文件以empty占位最后按 PR 号升序排序以保证补丁应用顺序稳定。目录不存在或没有匹配文件时返回null脚本据此提前退出。4.2 定位当前稳定版本findCurrentReleaseVersionL53-L83负责确定补丁的目标发布版本先读取根目录package.json的version若该版本不是 prereleasesemver.prerelease为空直接作为目标版本若当前处于 prerelease如1.x.x-next.N则用git rev-list HEAD -- package.json沿历史向前回溯找到最近一个带稳定版本的提交返回该稳定版本。这一设计保证了补丁永远打在最近一个正式稳定版本之上而不是打到尚在迭代中的版本。4.3 分支管理与补丁应用循环脚本的主流程mainL191-L412大致为工作区洁净检查git status --porcelain有输出则直接抛错避免污染补丁分支确定补丁基线分支patch/v${release}如patch/v1.39.0。若远端已存在则checkout origin/patch/vX.Y.Z否则从vX.Y.Z标签新建并推送创建工作分支默认名为patch-release-pr-pr1-pr2-...可通过环境变量PATCH_RELEASE_BRANCH覆盖CI 中固定为patch-release逐 PR 处理L243-L328通过 GitHub APIOctokit读取 PR 的head.sha与base.sha计算merge-base用git log mergeBase...headSha --reverse列出 PR 引入的全部提交逐条git cherry-pick -n不自动提交若某个提交 cherry-pick 失败但工作区干净git status --porcelain为空判定为变更已存在跳过该提交全部提交应用成功后以--signoff --no-verify提交提交信息固定为Patch from PR #nL273幂等跳过机制L277-L297在应用前先用git log --grep ^Patch from PR #n$查找是否已有该补丁的提交存在则直接跳过。这正是 README 中脚本会自动跳过已应用到目标分支的补丁重复运行是安全的这一说法的代码实现重新生成发布产物执行yarn install与yarn release随后以Generate Release为提交信息提交L358-L372推送与 PR 产出git push --force-with-lease推送工作分支随后根据实际应用的补丁列表拼接 PR 正文格式为- desc (#n)并生成compare/patchBranch...branchName的比较 URLL377-L406运行方式差异非 CI 环境未设置PATCH_RELEASE_BRANCH会调用open命令在浏览器打开该比较 URL 供手动发起 PRCI 环境下则只依赖输出由工作流完成 PR 的创建或更新。需要说明的是脚本仅在本仓库owner/repo 硬编码为backstage/backstage场景下设计且需要有效的GITHUB_TOKEN环境变量才能调用 GitHub API 拉取 PR 元数据。5. 自动化工作流sync_patch-release.yml让 Patch Release PR 始终同步README 中提到的[sync_patch-release.yml](https://link.gitcode.com/i/928b72617c84f919c2883290f1095598)已在仓库中落地是整套流程的调度中枢。5.1 触发条件与并发控制on: push: branches: - master paths: - .patches/**只要推送到master且变更路径命中.patches/**新增、修改或删除补丁文件工作流即被触发concurrency组sync-patch-release配合cancel-in-progress: true保证同一时间只有一个同步任务在跑避免并发竞争。另外工作流仅当github.repository backstage/backstage时才执行这是对 fork 仓库的防护性约束。5.2 执行步骤拆解步骤关键行为说明Harden Runner开启egress-policy: audit安全加固Checkoutfetch-depth: 0、filter: blob:none、fetch-tags: true完整历史 标签供版本探测与 cherry-pick 使用使用GH_SERVICE_ACCOUNT_TOKEN配置 Node 22actions/setup-node与仓库 Node 版本要求一致检查补丁文件判断.patches/pr-*.txt是否存在输出has_patches标记决定后续分支查找现有 PR按owner:patch-releasehead 查找 open 状态的 PR复用已有 PR 而非重复创建关闭并删除无补丁时关闭旧 PR 删除patch-release分支目录清空时自动收敛分支不存在422则跳过安装依赖yarn --immutable严格按 lockfile 安装读取补丁生成 PR 正文读取全部pr-*.txt按 PR 号升序拼接正文格式This patch release fixes the following issues: 每行- desc运行发布脚本node scripts/patch-release-for-pr.js --from-dir传入PATCH_RELEASE_BRANCHpatch-release、HUSKY0随后git push origin patch-release --force创建或更新 PR有则pulls.update更新标题/正文无则用脚本输出的patch_branch作为 base 创建 PR标题固定为Patch Release5.3 PR 生命周期工作流对 Patch Release PR 的管理是有进有退的有补丁更新既有 PR 的标题与正文正文来自补丁文件的描述汇总或按需新建 PR无补丁找到以patch-release为 head 的 open PR 并关闭同时删除该分支——目录清空意味着补丁发布已全部完成不再保留悬挂的 PR。这一设计让.patches目录成为唯一的事实来源single source of truth目录内容与 PR 状态始终一一对应。6. 维护操作清单完整补丁发布闭环综合 README 说明与源码实现一个补丁从登记到发布的完整闭环如下登记补丁在仓库根目录执行yarn patch-pr pr-number description脚本在校验参数后于.patches/生成pr-number.txt触发同步将该提交推送到mastersync_patch-release.yml因.patches/**变更被触发自动更新或创建 Patch Release PR评审合并维护者评审 PR其中包含从patch/vX.Y.Z基线 cherry-pick 出来的修复提交、重新生成的发布产物以及补丁清单文件合并即完成一次补丁发布清理清单补丁应用并合并后手动删除对应的pr-number.txt文件。再次推送后工作流会发现补丁目录变化并同步 PR 状态安全重跑即使某些补丁已经应用在目标分支上patch-release-for-pr.js也会通过提交信息检索与 cherry-pick 结果判断自动跳过重复执行不会产生重复提交或冲突污染。7. 小结Backstage 的补丁发布流程是一个约定式文件 脚本 CI 工作流三层协作的典范[.patches](https://link.gitcode.com/i/3030f6e62ebdebe9c25e510e0c017c21)目录以pr-number.txt文件作为清单约定内容即修复描述[yarn patch-pr](https://link.gitcode.com/i/b42c2515eed8dfe96ded6b25a073871b)create-pr-patch.js负责把 PR 登记为补丁文件patch-release-for-pr.js 负责稳定版本探测、cherry-pick 移植、幂等跳过与发布产物重生成sync_patch-release.yml 在后台持续把目录状态同步为 Patch Release PR并在目录清空后自动关闭 PR、删除分支。理解这条链路后你不仅能在自己的 Backstage 仓库中熟练登记补丁也能把文件清单驱动 幂等脚本 CI 同步 PR这一模式迁移到其他需要维护多版本修复的发布体系中去。【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表