ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Deno 版本发布全流程解析:从 release_doc_template 清单到仓库内发布自动化脚本

Deno 版本发布全流程解析:从 release_doc_template 清单到仓库内发布自动化脚本 Deno 版本发布全流程解析从 release_doc_template 清单到仓库内发布自动化脚本【免费下载链接】denoA modern runtime for JavaScript and TypeScript.项目地址: https://gitcode.com/GitHub_Trending/de/denoDeno 的每一次正式发布都不是靠人工“手动敲命令”完成的而是围绕一份可执行的发布清单release checklist展开冻结分支、提升版本号、发布 crates.io 依赖、触发 GitHub 发布草稿再到更新官网、文档站、Docker 镜像与 PyPI 包。本篇以仓库中的发布清单模板 tools/release/release_doc_template.md 为主体结合同目录下的自动化脚本与.github/workflows中的工作流定义拆解这份清单背后“每一步实际发生了什么”帮助读者理解 Deno 从代码冻结到二进制分发、再到紧急回滚的完整工程链路。发布清单是如何生成的从模板到 Gist清单模板并不是孤立存在的一份文档。Deno 的发布入口是start_release工作流其触发逻辑记录在 tools/cut_a_release.md 中选择main分支与发布类型patch / minor / major运行工作流等待 Create Gist URL 步骤输出一个 Gist 链接然后按 Gist 中的清单操作。生成这份 Gist 的脚本是 tools/release/00_start_release.ts它做三件事读取当前版本解析 cli/Cargo.toml 顶层的version字段得到当前 CLI 版本计算下一个版本根据传入的--patch/--minor/--major或--alpha/--beta/--rc参数按 SemVer 规则推导下一个版本号填充模板并创建 Gist读取 tools/release/release_doc_template.md预发布则使用 tools/release/prerelease_doc_template.md替换其中的占位符后创建私有 Gist。模板中的占位符与替换规则在源码中一一对应模板占位符替换来源$VERSION计算出的下一个完整版本号如2.30.0$BRANCH_NAMEv$major.$minor如v2.30即发布期间冻结的分支$MINOR_VERSION前两位版本号major.minor$PAST_VERSION当前cli/Cargo.toml中的旧版本也就是说开发者在执行清单时看到的v$VERSION、$BRANCH_NAME等变量都已被脚本渲染为真实值。Pre-flight冻结分支与准备工作清单的第一阶段Pre-flight要求在整个发布期间$BRANCH_NAME分支保持冻结、不接受任何新提交并完成以下准备准备好以下仓库的 fork 与本地克隆denoland/denoCLI 主仓库、denoland/dotcom官网、denoland/deno_dockerDocker 镜像、denoland/deno-docs文档站检查基准测试面板确认近期没有性能回归在公司内部#cli频道发出锁定公告:lock:here “DO NOT LAND ANY PRs”并附 Gist 清单链接。“冻结分支”这条规则的工程含义是发布过程中的版本号 bump、Releases.md更新等提交都直接落在该分支上如果此时有 PR 合入会污染发布提交的历史并干扰后续forward_v$VERSION回合cherry-pick 回 main的冲突判断。Phase 1Bumping versions —— 版本号提升到底改了什么清单第一阶段要求运行version_bump工作流选main分支选patch或minor等待其自动开出 PR审查后合并并特别强调不要手动创建 release tagtag 会在后续流程中自动生成。该工作流的生成本体是 .github/workflows/version_bump.ts生成产物为version_bump.generated.yml其调用的核心脚本是 tools/release/01_bump_crate_versions.ts。从源码看一次版本号提升实际包含 6 个动作1. 提升 CLI 版本与核心 crate脚本通过 tools/release/deno_workspace.ts 中的DenoWorkspace类定位三类关键 cratedenoCLI 本体即 cli/Cargo.tomldenortruntime crate对应 runtime/ 目录deno_liblib crate对应 cli/lib/ 目录。执行--patch/--minor/--major参数时脚本先对 CLI crate 调用increment然后把denort强制设置为与 CLI 相同的版本并将新版本写入deno_lib的version.txt即 cli/lib/version.txt保证三者版本严格对齐。2. 提升所有依赖 crate 的 minor 版本getCliDependencyCrates()会枚举 CLI 的仓库内下游依赖并排除test_server、test_macro、test_util三个纯测试 crate对每个 crate 执行 minor 提升。有一个值得注意的例外renamedCrates集合中包含deno_v8。因为根 Cargo.toml 中它以v8 { package deno_v8, ... }这种“依赖键名 ≠ crate 名”的方式声明而发布自动化是靠“行首 crate 名”匹配依赖条目的匹配不到就会报错。因此脚本用incrementRenamedCrateMinor()专门处理用正则分别改写根Cargo.toml中的package deno_v8依赖条目版本与其自身 manifest 的版本号对应 libs/deno_v8/。3. 更新 lockfile 并验证二进制版本cargoUpdate(--workspace)刷新 Cargo.lock随后assertDenoBinaryVersion()会实际执行cargo run -p deno -- -v把输出与期望版本比对不一致则直接Deno.exit(1)——这是对“版本号真的编译进了二进制”的硬校验。4. 提升 CI 缓存版本bumpCiCacheVersion()会把 .github/workflows/ci.ts 中的const cacheVersion N;自增 1然后重跑该生成脚本刷新ci.generated.yml。其目的是让每个新版本强制使用全新的 cargo 构建缓存目录避免跨版本缓存污染。5. 自动更新 Releases.mdupdateReleasesMd()会获取上次 tag 到当前的git log自动区分 minor 与 patch 发布的历史区间写入仓库根的 Releases.md若本次是 minor/major 版本提升releaseHasBlogPost()判定 major 或 minor 位发生变化还会在条目前加上官方博客链接文案。若自动更新失败脚本会打印手动兜底命令git log --oneline VERSION_FROM..VERSION_TO。6. 失败兜底路径清单中details里的 Failure Steps 说明了工作流失败时的人工路径checkout 发布分支手动运行./tools/release/01_bump_crate_versions.ts确认 crate 版本与Releases.md正确后自行开 PR 继续流程——这与脚本本身是“可本地重跑”的设计文件头 shebang 为deno run -A --locktools/deno.lock.json相吻合。PR 的创建由 tools/release/02_create_pr.ts 完成它创建release_X_Y_Z分支点号替换为下划线、提交并推送然后以草稿 PR形式打开PR 描述中内置了“crate 版本是否正确、Releases.md是否相关且移除了 revert”两个审查项并附上拉取分支的git fetch upstream ... git checkout -b ...命令。Phase 2Publish —— crates.io 发布与 GitHub 发布草稿清单第二阶段要求运行cargo_publish工作流在 Phase 1 相同的分支上其核心脚本是 tools/release/03_publish_crates.ts用getCratesPublishOrder()对依赖 crate 做拓扑排序按依赖顺序逐个cargo publish依赖 crate 使用--no-verify参数发布。源码注释解释了原因这些 crate 单独构建时无法完成deno_v8引擎特性选择引擎选择在denocrate 顶层的v8/quickjsfeatures 决定cargo 独立 tarball 校验会触发compile_error!而denocrate 本身仍走完整校验await cliCrate.publish()整个流程包在try/finally中结束时发出系统蜂鸣\x07提示操作者成功或失败。发布完成后清单要求验证两点⛔标记代表硬性检查项GitHub 上v$VERSION发布草稿包含46 个 assets对象存储dl.deno.land 对应的 R2 桶中该版本目录下有48 个 zip 文件。tag 的创建实际上发生在后续的 tools/release/04_post_publish.ts它拉取远端 tag 列表若v$VERSION不存在则创建并推送——这正是 Phase 1 清单中“不要手动打 tag”的原因tag 由 CI 在 crates 发布成功后自动创建而 tag 又会触发第二轮 CI 生成 GitHub 发布草稿。该脚本还实现了补丁版本回合若当前分支不是main即 patch release会基于origin/main创建forward_v$VERSION分支cherry-pick 发布提交若产生冲突则提交带冲突的工作树并在 PR 描述中标注 “THIS PR HAS GIT CONFLICTS THAT MUST BE RESOLVED”保证版本 bump 提交最终回到 main 分支避免 main 上的下一个版本 bump 与历史版本不一致。发布草稿的说明文本则由 tools/release/05_create_release_notes.ts 生成它取 Releases.md 中最新一条版本的文本写入target/release/release-notes.md供 GitHub 发布草稿使用。下游生态更新官网、文档站、Docker 与 PyPI清单的后半部分覆盖 CLI 之外的分发渠道每个渠道的机制略有不同deno.com 与 docs.deno.com两者都是“跑一个工作流 → 自动开 PR → 人工审查合并”的三步走官网的update_version.ymldenoland/dotcom仓库与文档站的update_versions.ymldenoland/deno-docs仓库。它们把站点展示的“最新版本号”指向新 tag通常还会被setup-deno等 CI 动作消费。deno_docker运行deno_docker仓库的version_bump工作流审查并合并其开的 PR然后在镜像仓库上创建不带v前缀的$VERSIONtag注意与主仓库v$VERSION的命名差异tag 触发镜像构建发布的 CI验证其成功即可。deno_pypipip 安装的 denodeno_pypi仓库需要跑两个工作流先version-bump开 PR审查合并再release工作流触发发布最终验证新版本已出现在 PyPI 的deno项目页。MDN browser-compat-data如果本次发布新增或启用了 JavaScript / Web API需要同步更新mdn/browser-compat-data。清单给出的保守策略是拿不准就跳过并联系对应维护者确认体现了“清单允许在证据不足时选择安全路径”的设计。deno upgrade 升级横幅清单提供了一个可选的发布后公告机制在deno upgrade执行时向用户打印一段纯文本提示。操作方式是创建一个banner.txt内容必须为 plaintext上传到对象存储中release/v$VERSION/banner.txt路径。适用场景是希望提醒用户“需要执行某个命令才能享受新功能”或“存在破坏性变更”的版本。收尾与 Downgrade回滚预案清单的 “All done!” 阶段要求回到内部频道发出解锁公告:unlock: “You can land PRs now” 版本发布完成通知标志$BRANCH_NAME分支解冻。模板最后给出了明确的Downgrade 预案In case something went wrong把 dl.deno.land 的release-latest.txt改回上一个稳定版本号——这是用户侧deno upgrade与自动安装脚本读取“最新稳定版”的依据改回它即可让流量回到旧版本revert 官网dotcom 仓库中更新版本号的 PR防止setup-deno等 GitHub Action 拉取到问题版本。这两步只动“版本指针”而不动已发布二进制因此是整个流程中代价最低的止血手段。发布自动化的目录地图将模板与仓库脚本对照tools/release/目录下的脚本按执行顺序可理解为一条完整流水线阶段脚本职责启动00_start_release.ts计算下一版本填充 release_doc_template.md / prerelease_doc_template.md创建发布清单 Gist版本 bump01_bump_crate_versions.ts提升deno/denort/deno_lib及依赖 crate 版本、更新 lockfile、CI 缓存版本、Releases.md并编译验证开 PR02_create_pr.ts创建release_X_Y_Z分支并打开草稿 PR发布03_publish_crates.ts拓扑排序后逐个cargo publish发布后04_post_publish.ts创建v$VERSIONtagpatch 版本时 cherry-pick 回合到 main发布说明05_create_release_notes.ts从 Releases.md 生成 GitHub 发布草稿说明公共库deno_workspace.ts、deps.ts封装仓库/crate 定位逻辑deps.ts转发自jsr:deno/rust-automation提供 Git、PR、SemVer 等基础能力此外promote_to_release.ts 与 promote_to_release_windows.ts 负责预发布alpha/beta/rc候选版本向正式发布的晋级upload_version_file.ts 与 purge_cdn_cache.ts 则负责分发侧的版本文件上传与 CDN 缓存清理.github/workflows/下的start_release.ts、version_bump.ts、cargo_publish.ts、post_publish.ts、promote_to_release.ts等脚本则是这些步骤对应的 CI 入口各带一份.generated.yml产物。小结这份清单模板表面上是“打勾式”的操作手册实际上它把 Deno 发布流程中的顺序依赖先 bump 后 publish先 publish 后打 tag先 tag 后发布草稿、硬性校验点46 个 assets、48 个 zip、cargo run -v版本比对和失败/回滚路径Failure Steps、Downgrade都显式化了。结合 tools/release/ 中的脚本源码可以看到模板中每一步人工动作背后都有一个可重跑的自动化脚本兜底人工介入被收敛到“审查 PR、验证产物、发布草稿”这几个真正需要判断的环节——这也是一个大型运行时项目能在多版本、多分发渠道二进制、crates.io、Docker、PyPI下保持发布一致性的工程基础。【免费下载链接】denoA modern runtime for JavaScript and TypeScript.项目地址: https://gitcode.com/GitHub_Trending/de/deno创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表