迁移到 Replay
迁移到 Replay
本指南将 SDK 从 release 或 push 输出模式迁移到 pull-request 输出模式 — 启用 Fern Replay 所需的模式。仅当您的 SDK 当前使用 release 或 push 模式且希望切换以使用 Replay 时才需遵循本指南。已使用 pull-request 模式的 SDK 默认启用 Replay,无需迁移。
变更内容
- SDK 更新以 PR 形式到达,而非直接推送到
main。 - 对生成代码的自定义修改通过三方合并在重新生成后保留。
- 版本提升从纯生成器输出计算,不会被自定义修改污染。
- 发布与生成解耦,您可以控制何时发布。
开始之前
- 在 SDK 仓库上安装 Fern GitHub App。
- 更新到最新 Fern CLI:
fern upgrade。 - 更新到最新 SDK 生成器版本:
fern generator upgrade。
第一阶段:将发布密钥移至 SDK 仓库
Fern 在每次生成时会在 SDK 仓库中设置 GitHub Actions secrets。切换到 pull-request 输出模式时,该写入会覆盖您直接设置的密钥。为避免此问题,在切换模式前将密钥所有权从配置仓库移至 SDK 仓库。
对于每个 SDK 仓库:
识别发布密钥
找出 generators.yml 引用了哪些发布密钥:
- Python:
PYPI_USERNAME、PYPI_PASSWORD - TypeScript / npm:
NPM_TOKEN - Java / Maven:
MAVEN_USERNAME、MAVEN_PASSWORD、MAVEN_SIGNATURE_KID、MAVEN_SIGNATURE_PASSWORD、MAVEN_SIGNATURE_SECRET_KEY - Ruby:
RUBY_GEMS_API_KEY - C# / NuGet:
NUGET_API_KEY - Rust / Crates:
CRATES_TOKEN
第二阶段:切换输出模式
在 generators.yml 中:
如果使用 version: AUTO,则无需其他更改。自动版本管理作为生成器 CLI 流水线的一部分运行,并对纯生成器输出进行差异比较,因此客户的自定义修改不会污染版本差异。
第三阶段:将发布与生成解耦(可选)
要按自己的计划控制发布而非在每次 Fern 生成时发布,请将发布工作流从 Fern 的生成周期中分离:
第四阶段:首次使用 Replay 生成
第五阶段:验证
首次生成并合并后,确认以下内容:
- 创建了 PR(而非直接推送到
main)。 - 没有触发意外的包发布。
- SDK 代码正确且通过 CI。
- SDK 仓库中存在
.fern/replay.lock。 .fernignore包含replay.lock(和replay.yml)。
在首次实际自定义修改后,端到端验证 Replay 的行为:
- 您编辑一个生成的文件,提交并合并到
main。 - 下一次
fern generate检测到补丁(PR 正文显示patches detected: 1)。 - 自定义修改通过干净的三方合并在重新生成后保留。
.fern/replay.lock显示已存储的补丁。
回滚
Replay 从不破坏性地修改文件。您的 main 分支始终有正确的代码,因此回滚很简单。
快速禁用。 要在保持 pull-request 模式的同时停止 Replay,在 generators.yml 中设置 replay.enabled: false(参见 replay 参考)。下一次 fern generate 跳过补丁检测和应用阶段;PR 以与之前相同的形式到达,只是没有 [fern-replay] 提交。
完全恢复到 release 或 push 模式:
故障排除
已知注意事项
- 未合并就关闭的 Replay PR。 如果 Replay PR 被关闭而未合并,下一次生成会从当前分支历史重新推导锚点。无需手动清理。
- 强制推送和重写历史。 Replay 在每次运行时从
git log重新推导扫描锚点,因此强制推送的分支继续工作,现有补丁仍能正确应用。