Pulumi Upgrade Provider 是一个面向 Pulumi 提供商仓库升级场景的 Agent Skill,用于把 provider 仓库升级到新的上游版本。
用途 该技能用于自动化升级 Pulumi 提供商仓库。典型任务是把某个 pulumi provider 仓库升级到新的上游版本,并通过反复运行和修复来推动升级成功。
主要能力
- 运行
upgrade-provider工具进行本地升级:upgrade-provider $ORG/$REPO --repo-path . --no-submit,并在每次重试时保留--no-submit。 - 记录升级前基线:用
git status --short --untracked-files=all | tee "$baseline_file"记录已有改动,作为升级前基线。已有改动不会阻断升级,但工具会大范围暂存,可能把它们包含进生成的提交中。 - 日志与错误处理:将输出写入仓库外的日志文件,扫描以
error:开头的行。若成功退出,先检查是否出现No actions needed,若是则报告 provider 已是最新,或请求的目标并非升级,然后成功停止。 - 读取本地完成报告:用
awk '/^Upgrade completed locally;/{found=1} found' "$log_file"提取完整报告,其中包含建议的 PR 正文与元数据、审查命令以及所有被跳过的提交动作。 - 错误修复参考:遇到失败时使用该技能自带的
references/upgrade-provider-errors.md(技能文件夹内,而非仓库内)进行修复,然后以--no-submit重跑。 - 补丁工作流:若修复需要创建、修订、删除或变基补丁,使用 upstream-patches 技能;被中断的补丁工作流必须先 check in 再重跑。
- 处理上游 go get 失败:涉及被忽略的 replace 指令或 unknown revision v0.0.0 时,在应用文档中的 provider/go.mod 替换后,用
--target-version重跑,并保留原本的 major/non-major 意图,仅在真正的主版本升级时添加--major。 - 审阅本地升级:以工具最终报告为唯一事实来源,获取基础分支、工作分支、建议的 PR 标题/正文/元数据以及被跳过的提交动作。先做有界摘要审查(默认分支、git status、git log、git diff --shortstat、按目录统计的改动文件数),避免默认打印完整分支 diff。
- 生成文档占位符审计:在发布前必须检查
provider/replacements.json中是否存在未解决的占位符(TODO),若有则视为提交前阻断项;可用cd provider && go test -v -run TestReplacementDoesNotIncludeTodos .做聚焦验证。 - 补丁审查流程:如升级改动了补丁,先
./scripts/upstream.sh checkout,用git -C upstream log --oneline pulumi/checkout-base..pulumi/patch-checkout查看提交,审查后用./scripts/upstream.sh check_in退出(审查后必须 check_in,否则会阻塞下一次安全运行)。 - 提交已审阅的升级:复现报告中所有适用动作,而不仅是创建 PR;保留建议的标题、正文、release label、审查者和指派者。资料特别强调:绝不自行决定、推断或更改 release label,必须使用 upgrade-provider 发出的 label;仅在目标跨过当前上游主版本时才添加
--major。 - 推送使用更安全的 lease 保护形式:
git push --set-upstream origin "$branch" --force-with-lease,除非用户明确批准覆盖更新的远端工作。 - 用
gh创建或更新 PR,并在需要时把列出的升级 issue 指派给 PR 指派者;对于 bridge 升级,关闭被取代的 bridge PR 并评论替换 PR 的 URL。 - 获取并报告最终 PR URL:
gh pr view --json url --jq .url || gh pr list --head "$(git branch --show-current)" --json url --jq '.[0].url'。 - 若提交前未加入 fixes 段,可用
gh api -X PATCH追加而不是替换正文(避免使用gh pr edit以规避 GraphQL project-card 错误)。
使用方式
从仓库根目录运行;等待完成(可能长达 10 分钟)。整个运行循环中不得手动提交、推送或创建分支;--no-submit 成功之后,允许做聚焦的修正提交并手动提交。
适用场景
- 将 Pulumi provider 仓库升级到新上游版本。
- 处理升级过程中的中断补丁状态、补丁冲突、SDKv2 到 Plugin Framework 迁移、被忽略的上游替换、vendored 上游依赖、.NET 重复文件、新模块映射等错误。
限制与停止条件 在以下情况应停止迭代并报告失败:命令未找到(退出码 127);同一错误连续尝试修复 3 次仍未成功;错误模式未知且无法在参考文档中覆盖、无法确定安全修复;补丁状态不明确、无法证明每个补丁都已应用且目标变基已完成;需要人工判断(如多种有效实现方案之间选择、模块组织的架构决策)。上游破坏性变更、弃用或框架迁移本身不构成停止理由,只有当实施升级存在未解决的选择时才停止。停止时需报告:遇到的错误、尝试过的修复(含文件路径与改动)、为何需要人工介入、以及任何部分进展。
其他注意事项
- 不要使用
./scripts/upstream.sh init -f,除非有意丢弃被中断的补丁工作,它是破坏性的。 - 提交前不要让 upstream 停留在 checkout 或存在活动的 Git 操作状态。
- 不要 stash 改动,改用干净的工作树或移除无关产物。
- 旧版 git 不支持
git rebase --continue --no-edit,应使用git rebase --continue并接受现有提交信息;可用GIT_EDITOR=true(或GIT_EDITOR=:)避免编辑器提示。
资料未提供该技能的收费、价格、平台或效果信息。