资讯详情

资讯详情

Homebrew BrewTestBot 维护者指南:PR 发布 Bottle、本地提交编辑与重新 Rebottle 的完整工作流

Homebrew BrewTestBot 维护者指南PR 发布 Bottle、本地提交编辑与重新 Rebottle 的完整工作流【免费下载链接】brew The Package Manager for Everywhere项目地址: https://gitcode.com/GitHub_Trending/br/brew本文基于 Homebrew 仓库中的维护者文档 BrewTestBot-For-Maintainers系统讲解brew test-bot必填检查required checks完成之后维护者需要执行的三类操作在 Pull Request 中批准并发布 bottle、通过brew pr-pull在本地编辑未发布的提交以及通过 rebottling workflow 为现有 formula 重新构建 bottle。读完本文你将掌握维护者视角下的 bottle 发布全链路包括brew pr-publish、brew pr-pull的完整参数语义、底层 cherry-pick/autosquash/signoff 机制以及哪些操作是明确禁止的。维护者在 BrewTestBot 流程中的定位brew test-bot是 Homebrew 的 CI 编排命令Homebrew 的 GitHub Actions workflow 会在 macOS 和 Linux runner 上运行它完成 formula 检查、构建 bottle 并测试受影响的依赖包dependent formulae。这一点在 BrewTestBot 文档 中有明确说明且 workflow 定义文件是当前 runner 与作业配置的唯一权威描述。从源码结构看一次完整的brew test-bot运行由 TestRunner 按固定顺序编排以下步骤见build_tests与run_tests方法cleanup_before清理 runner 上的历史状态可选由--cleanup控制setup检查本地系统是否配置正确--skip-setup可跳过tap_syntax对 tap 仓库做语法检查brew styleformulae_detect自动识别本次变更涉及、新增、删除的 formulaeformulae安装、测试目标 formula 并构建 bottleformulae_dependents测试依赖这些 formula 的包是否被破坏cleanup_after收尾清理bottles_fetch上传后的可选验证步骤确认 bottle 全部上传成功只有显式--only-bottles-fetch才运行。运行结果会写入bottle_output.txt、linkage_output.txt、skipped_or_failed_formulae-tag.txt等产物文件加上--junit时还会生成 JUnit XML 报告brew-test-bot.xml。命令的完整参数定义见 dev-cmd/test-bot.rb其中--build-from-source、--skip-dependents、--testing-formulae、--skip-livecheck等开关决定了 CI 中各 job 的具体行为。维护者文档的核心观点是必填检查通过后bot 的工作就结束了剩下的发布动作是维护者的职责。下面按原文档的三个场景展开。场景一从 Pull Request 发布 bottle标准流程当所有必填 job 通过且 PR 无需任何改动时原文档给出的维护者操作顺序是审阅 formula 文件——包括其中的test块以及生成的 bottle 信息各架构的bottleDSL 与 SHA256 校验和批准Approve该 Pull Request允许 BrewTestBot 在仓库规则允许时自动合并并发布盯住最终的发布 job并对 BrewTestBot 的失败通知做出响应。原文档特别强调两条纪律检查通过不能替代人工审阅。formula 文件本身、其测试内容、生成的 bottle 校验和必须逐项查看不要为了“试探发布 workflow 是否能成功”而批准 PR——批准意味着认可变更本身而不是当作发布流程的试金石。手动触发发布brew pr-publish当某个仓库刻意不启用自动发布时维护者需要手动触发受支持的 workflow。命令形式为brew pr-publish PULL_REQUEST参数可以直接是 PR 编号也可以是完整的 PR URL实现位于 dev-cmd/pr-publish.rb命令描述明确标注Requires write access to the repository需要仓库写权限。选项默认值说明--autosquash关闭若目标 tap 支持自动把 commit 重排、改写为 Homebrew 偏好的规范格式--large-runner关闭让 upload job 运行在大型 runner 上--branchmain使用哪个分支上的 workflow 定义--message无与--autosquash联用指定 autosquash 改写版本号提升/删除/rebuild 类提交时的附加说明--taphomebrew/core目标 tap 仓库--workflowpublish-commit-bottles.yml目标 workflow 文件名源码层面有几个值得注意的细节命令最终调用GitHub.workflow_dispatch_event(user, repo, workflow, ref, **inputs)即通过 GitHub 的workflow_dispatch事件触发发布 workflow因此它只能触发仓库中已存在的发布 workflow而不是任意上传行为若 PR 上带有autosquash或large-bottle-upload标签命令会自动把对应的 inputs 置为true源码中有 “Foundautosquashlabel on #N. Requesting autosquash.” 的提示维护者无需重复传参如果同时指定了--tap且与 PR URL 所属仓库不一致命令会直接报错退出防止误发到其他 tap。原文档对--autosquash的使用给出了明确前提只有当目标 tap 支持该选项、且产生的提交结构符合仓库提交策略时才使用。触发后维护者应在 GitHub 上对应的 Actions 队列中等待直到发布完成即原文档所说的 “Check the Homebrew/core Actions queue until publication finishes”。场景二需要本地编辑提交时使用brew pr-pull当维护者必须下载 bottle 产物并在本地编辑尚未发布的 commit时应使用brew pr-pull PULL_REQUEST原文档要求在使用任何会改变 commit 或上传产物的选项之前先检查该命令的 dry-run 输出和 help 输出。实现位于 dev-cmd/pr-pull.rb其命令描述为Download and publish bottles and apply the bottle commit from a pull request with artifacts generated by GitHub Actions同样要求写权限。完整参数集如下摘自源码中的cmd_args定义选项说明-n,--dry-run只打印将要执行的操作不实际执行原文档要求先跑这一步--no-upload只下载 bottle不上传--no-commit上传前不生成新的 commit--no-cherry-pick不 cherry-pick PR 分支上的提交--clean不 amend PR 带来的提交与--autosquash互斥--keep-old若 formula 指定了 rebuild 版本尝试在生成的 DSL 中保留其值--autosquash自动把 PR 提交重排、改写为规范格式可与--message联用--branch-okay不在非默认分支上拉取时告警测试场景有用--resolvepatch 应用失败时保留现场让用户手动解决而不是中止--warn-on-upload-failurebottle 上传失败时只告警不抛错专门用于修复此前上传失败的 bottle--retain-bottle-dir不清理 bottle 的临时目录供后续使用CI 中会写入GITHUB_OUTPUT的bottle_path--artifact-pattern下载符合该模式的产物默认bottles{,_*}--tap目标 tap 仓库默认homebrew/core--head-sha指定预期的 PR head commit SHA--root-url/--root-url-using用指定 URL 根 / 指定下载策略类替代 Homebrew 默认的 bottle URL--workflows从指定 workflow 取产物默认tests.yml可逗号分隔多个--ignore-missing-artifacts逗号分隔的、允许“未运行就跳过”的 workflow 列表编辑完成后的收尾动作原文档的表述是运行相关 formula 检查、检查最终提交然后只 push 目标 PR 分支。源码揭示了这条命令在幕后完成的完整动作链冲突预检pr_check_conflicts会扫描所有带 “no long build conflict” 标签的开放 PR若本 PR 修改的文件与某个长构建 PR 重叠直接报错并列出冲突 PR 与文件清单避免并发 bottle 构建互相覆盖cherry-pickgit fetch --force origin refs/pull/N/head后按merge-base逐个 cherry-pick PR 提交并校验 PR head SHA 与预期一致防止在过期基础上操作autosquash 改写autosquash! 会建立“commit ↔ formula/cask 文件”的双向映射对一一对应的提交做 reword对改同一文件的多条提交做 squash改写标题由determine_bump_subject依据新旧文件内容自动生成——版本号变化写成name 1.2.3revision 变化写成name: revision reasoncask 校验和变化写成name: checksum update reason其余为name: rebuild。若提交同时改动了多个文件无法拆分或包含非 formula/cask 文件命令会直接报错任何异常都会reset --hard回原状态后重新抛出保证仓库不被弄脏signoffsignoff!会把 PR 中所有 approved review 的审查者追加为Signed-off-by:trailer并在提交信息中补上Closes #N.下载与上传按--workflows指定的 workflow默认tests.yml和产物模式默认bottles{,_*}从 GitHub Actions 下载 bottle 产物然后内部调用brew pr-upload完成上传且--no-commit、--keep-old、--warn-on-upload-failure、--root-url等选项会透传下去。一个实用的判断逻辑也写在源码里formulae_need_bottles?会在 PR 带CI-syntax-only或CI-no-bottles标签、或改动中没有需要 bottle 的 formula例如只改 cask时跳过产物下载并打印 “Skipping artifacts for #N as the formulae dont need bottles”。如果 bottle 上传曾经失败、需要从更早的 commit 恢复上传原文档指向了 Common Issues for Maintainers 中“先保存当前状态再恢复失败 bottle 上传”的章节配合上表中的--warn-on-upload-failure与--no-upload/--retain-bottle-dir选项即可完成修复。对应的行为验证可参考 test/dev-cmd/pr-pull_spec.rb 与 test/dev-cmd/pr-publish_spec.rb。场景三为现有 formula 重新 Rebottle当某个 formula 需要新的 bottle 但不构成一次常规的版本更新时例如上游 bottle 损坏、构建环境要求变化、需要在新架构/新版本 macOS 上重新构建应使用homebrew/core仓库自带的rebottling workflowdispatch 类 workflow通常对应仓库中的dispatch-rebottle.yml。原文档给出的操作步骤在该 workflow 页面选择Run workflow输入 formula 名称与所需的重建信息像往常一样审阅生成的 Pull Request 及其 bottle job。原文档在此场景下给出了一条明确的红线不得利用 rebottling 来掩盖一次本应通过版本号或 revision 更新完成的 formula 变更——rebuild 语义的提交即前文determine_bump_subject生成的 “rebuild” 标题只应表达“同一版本的重新打包”而不是替代版本管理。小结与延伸阅读三个场景的决策路径可以归纳为PR 无需改动、仓库允许自动发布→ 审阅 批准 盯发布 jobPR 无需改动、但自动发布不可用→brew pr-publish PR注意--autosquash的使用前提与 Actions 队列等待必须在本地改提交/产物→ 先brew pr-pull PR --dry-run观察再按选项组合执行完成后只 push 目标 PR 分支无版本变化的重新打包→ 走 rebottling workflow拒绝用它逃避版本/revision 更新。延伸阅读均为仓库内路径docs/BrewTestBot.mdbrew test-bot的总览与 PR 状态展示docs/Common-Issues-for-Maintainers.md维护者常见问题的排障手册含 bottle 上传恢复docs/Bottles.mdbottle 构建机制背景manpages/brew.1brew test-bot的完整 manpage源码入口Library/Homebrew/dev-cmd/pr-publish.rb、Library/Homebrew/dev-cmd/pr-pull.rb、Library/Homebrew/test_bot/test_runner.rb、Library/Homebrew/dev-cmd/test-bot.rb。【免费下载链接】brew The Package Manager for Everywhere项目地址: https://gitcode.com/GitHub_Trending/br/brew创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →