菜单

构建与 CI 系统

相关源文件

本文档涵盖了 Deno 的构建系统架构、持续集成管道和发布管理流程。它重点介绍了 Rust 工作区配置、GitHub Actions 工作流和自动化发布工具。

有关 CLI 架构和命令处理的信息,请参阅 CLI 架构。有关运行时引导和 JavaScript 环境设置的详细信息,请参阅 运行时架构

工作空间架构

Deno 使用 Cargo 工作区来管理其多 crate 结构。工作区定义在根目录的 `Cargo.toml`,包含几大类 crate。

工作空间结构

工作区在 `Cargo.toml`56-524 定义了共享依赖项,并在 `Cargo.toml`389-524 定义了构建配置文件。

来源: `Cargo.toml`3-47 `cli/Cargo.toml`4-5 `runtime/Cargo.toml`4-5

CI/CD 流水线

CI 系统围绕 GitHub Actions 构建,拥有一个动态生成的 CI 主工作流。该配置通过 TypeScript 管理,并生成实际的 YAML 工作流文件。

CI 工作流生成

主 CI 工作流由 `.github/workflows/ci.generate.ts` 生成,它定义了

来源: `.github/workflows/ci.generate.ts1-8 `.github/workflows/ci.yml1-2

CI 作业矩阵

CI 系统在多个平台上运行不同类型的作业

作业类型平台配置文件特性
测试Linux x86_64, macOS x86_64/ARM64, Windows x86_64debug/release核心功能测试
lintLinux x86_64, macOS x86_64, Windows x86_64debug代码质量检查
benchLinux x86_64release性能基准测试

构建环境设置

Linux 构建使用在 `.github/workflows/ci.generate.ts82-163 中配置的 sysroot 环境进行构建,并使用

  • LLVM 工具链clang-19lld-19 进行链接
  • 增量 LTO: 带有缓存的链接时优化
  • Sysroot:预构建的系统根,用于一致性构建

来源: `.github/workflows/ci.generate.ts82-163 `.github/workflows/ci.yml263-343

构建配置

构建系统使用 Cargo 功能和配置来控制编译

功能标志

CLI crate 在 `cli/Cargo.toml`34-52 定义了几个重要功能。

构建配置

工作区在 `Cargo.toml`389-524 定义了优化的构建配置。

单个 crate 在 `Cargo.toml`416-524 中定义了自定义优化设置,以平衡构建时间和性能。

来源: `cli/Cargo.toml`34-52 `Cargo.toml`389-524

发布管理

Deno 拥有一个通过 GitHub Actions 工作流和 TypeScript 自动化脚本管理的自动化发布流程。

发布工作流

版本升级流程

版本升级流程由 `tools/release/01_bump_crate_versions.ts` 处理。

  1. CLI 版本增量:通过 `cliCrate.promptAndIncrement()` 或根据参数自动进行。
  2. 运行时版本同步`denoRtCrate.setVersion(cliCrate.version)`
  3. 依赖 crate 升级`crate.increment("minor")` 用于所有 CLI 依赖项
  4. 锁定文件更新`cargoUpdate("--workspace")`
  5. 发布说明生成`updateReleasesMd()`

Crate 发布顺序

发布流程使用依赖排序,来自 `tools/release/03_publish_crates.ts

这确保了依赖项在依赖项之前发布,以避免构建失败。

来源: `tools/release/01_bump_crate_versions.ts1-155 `tools/release/03_publish_crates.ts14-16 `.github/workflows/cargo_publish.yml42-55

缓存和优化

CI 系统采用了多种缓存策略来缩短构建时间。

Cargo 缓存策略

中的缓存配置 `.github/workflows/ci.generate.ts504-522 包含

  • Cargo home 缓存:包含注册表和 git 数据,键为 ${cacheVersion}-cargo-home-${os}-${arch}-${Cargo.lock hash}
  • 目标目录缓存:包含构建产物,通过 `.github/mtime_cache/action.js 保留修改时间。
  • Playwright 缓存:浏览器测试依赖项。

LTO 缓存配置

对于 Linux 系统根构建,系统配置了增量 LTO 缓存。

这允许跨构建重用链接时间优化工作。

来源: `.github/workflows/ci.generate.ts504-522 `.github/mtime_cache/action.js1-30 `.github/workflows/ci.generate.ts142-143

平台特定考量

Windows 代码签名

Windows 二进制文件使用 Azure Key Vault 集成进行代码签名。

签名过程在 `.github/workflows/ci.yml649-677 中配置,并使用 GitHub OIDC 进行 Azure 身份验证。

macOS 代码签名

macOS 构建使用 rcodesign 和 Apple 证书。

来源: `.github/workflows/ci.yml649-677 `.github/workflows/ci.yml500-503