本文档描述了 Deno 项目的持续集成(CI)工作流。它解释了如何通过 GitHub Actions 管理自动化构建、测试和发布,工作流的结构以及 CI 管道的关键组件。
有关更广泛的构建系统(包括 Cargo 设置)的信息,请参阅 Cargo 设置。
Deno 项目使用 GitHub Actions 来自动执行跨多个平台(Windows、macOS、Linux)和架构(x86_64、aarch64)的测试、代码检查和发布。CI 工作流定义在 .github/workflows/ci.yml 中,该文件由一个 TypeScript 文件(.github/workflows/ci.generate.ts)生成,从而实现更易于维护和程序化的工作流配置。
CI 系统有几个关键目的:
来源:.github/workflows/ci.yml1-1180 .github/workflows/ci.generate.ts1-100
CI 工作流由三个主要事件触发:
工作流具有并发控制,以防止重复构建,尤其是在拉取请求的情况下。
来源:.github/workflows/ci.yml3-20 .github/workflows/ci.generate.ts317-337
对于草稿 PR,工作流会运行一个 pre_build 作业,检查 PR 是否应该构建。除非满足以下条件之一,否则会跳过草稿 PR 的构建:
[ci]ci-draft 标签这样可以避免为正在进行中的 PR 消耗不必要的资源。
来源:.github/workflows/ci.yml22-44 .github/workflows/ci.generate.ts343-362
CI 使用构建矩阵来跨不同的组合运行作业:
某些组合仅在特定触发器上运行
ci-full 标签时运行ci-bench 标签来源:.github/workflows/ci.yml45-137 .github/workflows/ci.generate.ts379-449
CI 工作流根据作业需求使用不同的 runner:
| 操作系统 | 架构 | 标准 Runner | XL Runner(用于资源密集型作业) |
|---|---|---|---|
| Linux | x86_64 | ubuntu-24.04 | ubuntu-24.04-xl |
| Linux | aarch64 | ubicloud-standard-16-arm | - |
| macOS | x86_64 | macos-13 | - |
| macOS | aarch64 | macos-14 | cirruslabs/macos-runner:sonoma (自托管) |
| Windows | x86_64 | windows-2022 | windows-2022-xl |
对于主分支或标签的 macOS ARM 构建,使用自托管 runner 以提高性能。
来源:.github/workflows/ci.yml55-76 .github/workflows/ci.generate.ts10-63
在构建和测试之前,工作流会设置必要的环境:
对于主分支或标签上的发布构建,还会进行 Google Cloud 认证以进行发布。
来源:.github/workflows/ci.yml142-252 .github/workflows/ci.generate.ts165-250
Linux 发布构建使用特殊的 sysroot 配置来实现增量链接时优化(LTO)。这包括:
此配置可提高发布构建的性能和优化。
来源:.github/workflows/ci.yml259-339 .github/workflows/ci.generate.ts80-162
工作流根据配置有不同的构建步骤:
Debug 构建
cargo build --locked --all-targets
Release 构建
cargo build --release --locked --all-targets
对于发布构建,成功编译后,会生成符号缓存以更好地进行调试。
target/release/deno -A tools/release/create_symcache.ts ./deno.symcache
来源:.github/workflows/ci.yml415-448 .github/workflows/ci.generate.ts955-978
不同的作业类型运行不同种类的测试:
代码检查作业:
deno run --allow-write --allow-read --allow-run --allow-net ./tools/format.js --check)deno run --allow-write --allow-read --allow-run --allow-net ./tools/lint.js)deno run --allow-read --allow-env --allow-sys ./tools/jsdoc_checker.js)测试作业:
基准测试作业:
来源:.github/workflows/ci.yml396-412 .github/workflows/ci.generate.ts920-954
对于发布构建(来自主分支或标签),工作流:
对于 Linux 构建,还会创建源代码压缩包。
来源:.github/workflows/ci.yml457-520 .github/workflows/ci.generate.ts979-1081
工作流使用缓存来加速构建。
Cargo 缓存使用 cirruslabs/cache@v4 来存储/恢复:
此缓存由操作系统、架构和 Cargo.lock 哈希值进行键控,并回退到之前的按操作系统和架构的缓存。
来源:.github/workflows/ci.yml177-188 .github/workflows/ci.generate.ts495-514
对于 PR 构建,工作流还缓存构建产物,以避免重新构建未更改的代码。
target/
!target/*/gn_out
!target/*/gn_root
!target/*/*.zip
!target/*/*.tar.gz
此外,它还会维护文件修改时间以保留增量构建。
来源: .github/workflows/ci.yml373-389 .github/workflows/ci.generate.ts66-76
CI 工作流 YAML 文件是从 TypeScript 文件(.github/workflows/ci.generate.ts)生成的,这提供了几个优势
生成脚本定义了
如 CI YAML 文件顶部的注释所示,在需要更改时,该脚本手动运行以更新工作流文件
# GENERATED BY ./ci.generate.ts -- DO NOT DIRECTLY EDIT
来源: .github/workflows/ci.yml1-2 .github/workflows/ci.generate.ts1-30
矩阵配置使用了一个名为 handleMatrixItems 的辅助函数,该函数
skip_pr 属性转换为完整的跳过条件这提供了一种更清晰、更易于维护的方式来定义具有各种跳过条件和条件性运行器选择的复杂构建矩阵。
来源: .github/workflows/ci.generate.ts273-315 .github/workflows/ci.generate.ts379-449
CI 工作流包含多项针对 Pull Request 的优化
这些优化有助于节省 CI 资源,同时在需要时提供详尽的测试。
来源: .github/workflows/ci.yml137-146 .github/workflows/ci.generate.ts453-458
对于已标记的版本(发布),CI 工作流会
此过程确保所有发布工件都已正确构建、签名和发布。
来源:.github/workflows/ci.yml457-520 .github/workflows/ci.generate.ts979-1081
对于来自主分支(但非标签)的构建,工作流会设置 DENO_CANARY 环境变量,该变量
来源: .github/workflows/ci.yml252-258 .github/workflows/ci.generate.ts252-258