关于 update-v8
用于更新 workerd 中 V8 的流程技能,面向维护其 V8 依赖的开发者。它涵盖补丁变基、依赖更新、构建和测试,并要求高风险决策经人工确认。
主要功能
- 01与开发者确认目标 V8 版本
- 02将 workerd 补丁变基到新 V8
- 03重新生成并更新补丁文件
- 04更新 V8 依赖固定版本
- 05构建并测试 workerd
适用场景
- 01准备 workerd 的 V8 版本更新
- 02审查并处理补丁冲突
- 03在 V8 变更后检查构建和测试
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ cloudflare/ workerd --skill update-v8安装后在 Claude Code 中输入/update-v8确认已加载。
详细介绍
更新 workerd 中的 V8
V8 更新属于高风险变更,需要谨慎管理补丁,并由人工判断如何解决合并冲突。本指南涵盖完整流程。开始前务必与开发者确认目标版本。
另请参阅 V8 更新参考。
务必在每个步骤与开发者沟通并确认。 未经明确确认,切勿执行不可逆操作(例如删除补丁或更新哈希)。
前置条件
- 已安装
depot_tools,且位于$PATH中(安装指南) - 本地 V8 检出目录(位于 workerd 仓库之外,以免与 Bazel 混淆):
mkdir v8 && cd v8 && fetch v8
步骤 1:确定目标版本
查看 chromiumdash.appspot.com,确认 Chrome Beta 使用的最新 V8 版本。与开发者确认目标版本 <new_version>。
在 build/deps/v8.MODULE.bazel 中查找当前版本:
VERSION = "14.5.201.6" # example — check the actual file
我们将其称为 <old_version>。
步骤 2:将本地 V8 同步到当前 workerd 版本
cd <path_to_v8>/v8
git checkout <old_version>
gclient sync
步骤 3:将 workerd 的补丁应用到分支上
git checkout -b workerd-patches
git am --keep-non-patch <path_to_workerd>/patches/v8/*
patches/v8/ 中有多个补丁,包括 workerd 专用的定制:
| 补丁类别 | 示例 |
|---|---|
| 序列化 | 自定义 ValueSerializer/Deserializer 格式版本、代理/函数宿主对象支持 |
| 构建系统 | Windows/Bazel 修复、共享链接、依赖路径覆盖(fp16、fast_float、simdutf、dragonbox) |
| Embedder 钩子 | Promise 上下文标记、跨请求 Promise 解析、额外的 isolate embedder 槽位 |
| Bug 规避方案 | 禁用内存泄漏断言、禁用慢速句柄检查、builtin-can-allocate 规避方案 |
| API 新增项 | 暴露 String::IsFlat、AdjustAmountOfExternalAllocatedMemory,新增 Exception 构造函数 |
| ICU/配置 | 导出 ICU 数据、绑定 googlesource ICU、verify_write_barriers 标志 |
步骤 4:将补丁变基到新版 V8 上
git rebase --onto <new_version> <old_version>
大部分工作都在这一步。 请预期会遇到冲突。关键指导:
- 构建系统补丁(依赖路径、Bazel 配置)最容易发生冲突,因为上游 V8 会重构其构建系统。
- API 补丁(在 V8 类中新增方法)如果上游改动了相邻代码,也可能发生冲突。
- 务必保留 workerd 的意图——解决冲突前,先了解每个补丁的作用。补丁文件名具有说明性。
- 未经开发者明确确认,不要删除补丁。
- 不要自动解决冲突——将其标记出来,交由人工审查。V8 补丁中的合并冲突几乎总是需要人工判断。
步骤 5:重新生成补丁
git format-patch --full-index -k --no-signature --no-stat --zero-commit <new_version>
这会在当前目录生成带编号的 .patch 文件。
步骤 6:替换 workerd 中的补丁
替换补丁前,务必先与相关人员确认。如果有补丁被删除或新增, 相关人员需要审查这些更改。
rm <path_to_workerd>/patches/v8/*
cp *.patch <path_to_workerd>/patches/v8/
步骤 7:更新 build/deps/v8.MODULE.bazel
需要更新三项:
-
VERSION:设置为<new_version>。 -
INTEGRITY:计算新 tarball 的 sha256 哈希:curl -sL "https://github.com/v8/v8/archive/refs/tags/<new_version>.tar.gz" -o v8.tar.gz openssl dgst -sha256 -binary v8.tar.gz | openssl base64 -A格式:
"sha256-<base64_hash>="。也可以尝试构建,并从 Bazel 的哈希不匹配错误中复制预期哈希。 -
PATCHES:如果补丁有新增、删除或重命名,请更新列表。列表必须与patches/v8/中的文件名完全一致,且顺序相同。
第 8 步:更新 V8 的依赖项
V8 依赖于几个固定在 build/deps/v8.MODULE.bazel 和 build/deps/deps.jsonc 中的库。检查本地 V8 检出目录中的 DEPS 文件,确认提交版本:
cat <path_to_v8>/v8/DEPS
需要检查和更新的依赖项:
| 依赖项 | 位置 | 说明 |
|---|---|---|
com_googlesource_chromium_icu | v8.MODULE.bazel(git_repository commit) | Chromium 分支;根据 V8 的 DEPS 更新提交 |
perfetto | deps.jsonc(由 update-deps.py 管理) | V8 通过 Chromium 依赖此项;可以安全地升级到 GitHub 上的最新版本 |
simdutf | deps.jsonc(由 update-deps.py 管理) | V8 通过 Chromium 依赖此项;可以安全地升级到 GitHub 上的最新版本 |
对于 deps.jsonc 中的依赖项,可以使用更新脚本:
python3 build/deps/update-deps.py perfetto
python3 build/deps/update-deps.py simdutf
该脚本会获取最新版本、计算完整性哈希,并重新生成 gen/ MODULE.bazel 片段。不要手动编辑 build/deps/gen/ 中的文件。
第 9 步:构建和测试
# Full build
just build
# Full test suite
just test
请留意:
-
V8 API 变更导致的构建失败:V8 可能会在不同版本间弃用或更改 API。请在构建输出中查找弃用警告。常见受影响区域:
src/workerd/jsg/— V8 绑定层,受影响最直接src/workerd/api/— 直接与 V8 类型交互的 APIsrc/workerd/io/worker.c++— Isolate 的创建和配置
-
行为变更导致的测试失败:V8 可能会改变可观察到的 JS 行为。请检查:
just test //src/workerd/jsg/...— JSG 绑定测试just test //src/workerd/api/tests/...— API 测试- Node.js 兼容性测试(
just node-test) - Web Platform Tests(
just wpt-test)
-
新增的 V8 弃用警告:这些警告预示着未来可能出现问题。即使测试通过,也要在 PR 描述中记录。
第 10 步:提交并发起审查
提示用户提交更改并推送以供审查。
未经人工审查补丁更改,切勿推送分支以供审查。
你可以为用户准备 PR 草稿。PR 应包括:
- 更新后的
build/deps/v8.MODULE.bazel(版本、完整性、补丁列表) - 更新后的
patches/v8/中的补丁 - 更新后的依赖项版本(如有更改)
- 针对 V8 API 变更所做的任何 C++ 修复
- PR 描述,列出:旧版本、新版本、需要解决冲突的补丁、观察到的任何弃用警告,以及注意到的任何行为变更
检查清单
- 已与开发人员确认目标 V8 版本
- 已在本地检出 V8,并同步到旧版本
- 已应用 workerd 补丁,并将其变基到新版本
- 已通过人工审查解决冲突(不自动解决)
- 已使用
git format-patch重新生成补丁 - 已用新补丁替换
patches/v8/中的旧补丁 - 已更新
v8.MODULE.bazel中的VERSION - 已更新
v8.MODULE.bazel中的INTEGRITY - 如果补丁有新增、删除或重命名,已更新
PATCHES列表 - 已检查并更新 V8 依赖项(ICU、perfetto、simdutf)
-
just build成功 -
just test通过(或已记录并说明失败原因) - 未经明确确认,没有丢弃任何新补丁
- PR 描述记录了版本变更、冲突解决情况和弃用警告
故障排除
Bazel 完整性不匹配:如果看到 expected sha256-... but got sha256-...,请将“got”哈希值复制到 INTEGRITY 字段。这通常是因为哈希值计算错误,或者 GitHub 重新生成了压缩包。
补丁无法应用:如果补丁在 git am 期间可以顺利应用,但在 Bazel 中失败,说明 git format-patch 的输出与 Bazel 预期的不一致。请确认使用了 --full-index -k --no-signature --no-stat --zero-commit 标志。还请确认补丁顺序与 PATCHES 列表一致。
ICU 构建失败:ICU 是通过 git_repository 获取的 Chromium 分支。如果 v8.MODULE.bazel 中的提交版本有误,ICU 中就会出现文件缺失或编译错误。请参照 V8 的 DEPS 文件,确认正确的提交版本。
update-deps.py 失败:该脚本需要联网获取版本信息。如果某个依赖项的 GitHub 发布格式发生变化,可能需要在 deps.jsonc 中手动更新版本,然后运行 python3 build/deps/update-deps.py 重新生成哈希值。