菜单

CI/CD 流水线

相关源文件

本文档描述了 CPython 的持续集成和持续部署 (CI/CD) 流水线。它解释了当代码库发生更改时运行的基于 GitHub Actions 的自动化构建、测试和验证过程。有关通用构建过程的信息,请参阅 构建系统配置过程

概述

CPython 项目使用 GitHub Actions 来实现其 CI/CD 流水线。此流水线会自动在多个平台、架构和配置上构建和测试 Python,以确保代码质量和兼容性。流水线由以下事件触发:

  • 推送到 main 或版本分支(例如 3.x)的拉取请求
  • 直接推送到 main 或版本分支
  • 通过 GitHub UI 手动触发(workflow_dispatch

来源:.github/workflows/build.yml1-672 .github/workflows/reusable-context.yml1-105

变更检测系统

流水线包含一个智能变更检测系统,可根据修改的文件确定需要运行哪些测试。通过仅运行相关测试来优化 CI 资源。

该系统会检查变更的文件以确定:

  1. 是否运行文档测试(例如,如果修改了 .rst.md 文件)
  2. 是否运行 C/C++ 模糊测试(如果修改了 .c.h 文件)
  3. 是否运行 Windows 测试(如果修改了特定于 Windows 的代码)
  4. 是否构建 Windows MSI 安装程序(如果修改了与 MSI 相关的 .dll 文件)
  5. 是否运行标准测试(针对大多数代码更改)

此优化可防止在仅更改特定文件时运行不必要的测试,同时确保所有相关系统的代码质量得到维护。

来源:Tools/build/compute-changes.py1-209 .github/workflows/reusable-context.yml1-105 .github/workflows/build.yml25-38

主构建流水线

主构建工作流 (build.yml) 协调整个 CI/CD 过程。它定义了以下关键作业:

  1. build-context:根据文件更改确定要运行的测试
  2. check-docs:验证文档更改
  3. check-autoconf-regen:确保 Autoconf 文件是最新的
  4. check-generated-files:验证生成的文件是最新的
  5. 特定于平台的构建和测试作业(Windows、macOS、Ubuntu)
  6. 专用测试作业(SSL 测试、地址/线程消毒器等)
  7. all-required-green:最终验证所有必需的检查都已通过

主构建工作流使用基于 build-context 作业设置的标志的条件执行系统,确保只运行必要的测试。

来源:.github/workflows/build.yml25-672

特定平台构建

Windows 构建

Windows 构建在 x64、Win32 和 ARM64 架构上测试 CPython,并提供标准和免费线程模式。

Windows 构建过程:

  1. 使用 Visual Studio 构建系统通过 PCbuild/build.bat
  2. 为指定架构(x64、Win32 或 ARM64)构建
  3. 可选地启用免费线程模式(禁用 GIL)
  4. 使用 PCbuild/rt.bat 运行测试
  5. 此外,还会构建 MSI 安装程序以进行打包

来源:.github/workflows/reusable-windows.yml1-51 .github/workflows/build.yml150-188

macOS 构建

macOS 流水线在 Intel 和 Apple Silicon 架构上构建和测试 CPython。

macOS 构建过程:

  1. 使用 Homebrew 安装依赖项(OpenSSL、Tcl/Tk 等)
  2. 使用特定于 macOS 的设置和部署目标进行配置
  3. 使用 make 构建
  4. 在 Intel (macOS 13) 和 Apple Silicon (macOS 14) 硬件上进行测试
  5. 检查特定平台上的编译器警告

来源:.github/workflows/reusable-macos.yml1-82 .github/workflows/build.yml190-222

Ubuntu 构建

Ubuntu 构建在 x86_64 和 ARM64 平台上测试 CPython,并采用各种优化。

Ubuntu 构建过程:

  1. 使用 out-of-tree 构建(源目录和构建目录是分开的)
  2. 使用特定配置进行构建(debug、free-threading、BOLT)
  3. 与预期警告列表进行比较,检查编译器警告
  4. 使用 xvfb 运行 GUI 测试
  5. 在 x86_64 和 ARM64 架构上构建

来源:.github/workflows/reusable-ubuntu.yml1-127 .github/workflows/build.yml224-255

专用测试配置

WebAssembly 构建 (WASI)

WebAssembly 系统接口 (WASI) 构建编译 Python 以在 WebAssembly 环境中运行。

WASI 构建过程:

  1. 安装 WASI SDK 和 Wasmtime runtime
  2. 构建主机 Python 以进行交叉编译
  3. 配置并构建 WASI 目标
  4. 使用 Wasmtime 测试 WebAssembly 构建

来源:.github/workflows/reusable-wasi.yml1-85 .github/workflows/build.yml319-326

Sanitizer 构建

CI 流水线包含带有 Sanitizer 的专用构建,用于检测各种运行时问题。

Address Sanitizer (ASan)

Address Sanitizer 构建:

  1. 使用 --with-address-sanitizer 标志进行配置
  2. 启用内存错误检测进行构建
  3. 运行测试以捕获内存损坏、use-after-free 等问题

来源:.github/workflows/build.yml442-505

Thread Sanitizer (TSan)

Thread Sanitizer 构建:

  1. 使用 --with-thread-sanitizer 标志进行配置
  2. 在标准和免费线程模式下进行测试
  3. 运行测试以捕获数据竞争和线程相关问题
  4. 保留日志以详细分析发现的问题

来源:.github/workflows/reusable-tsan.yml1-95 .github/workflows/build.yml506-522

JIT 测试

JIT(即时)编译器受到特殊关注,其专用工作流可在多个平台上进行测试。

JIT 测试工作流:

  1. 首先测试 tier-two 解释器功能
  2. 跨平台和架构测试 JIT 实现
  3. 测试 JIT 的免费线程模式(禁用 GIL)
  4. 使用 LLVM 工具进行 JIT 编译

来源:.github/workflows/jit.yml1-155

文档测试

通过一个专用工作流来验证文档,该工作流会检查格式、结构和示例。

文档测试过程:

  1. 使用严格选项构建 HTML 文档
  2. 对照基线检查警告(对回归或改进失败)
  3. 运行 doctest 以验证文档中的示例是否正常工作
  4. 确保文档准确且最新

来源:.github/workflows/reusable-docs.yml1-105 .github/workflows/build.yml40-44

编译器警告检查

流水线仔细管理跨平台的编译器警告,以防止回归。

编译器警告系统:

  1. 在构建过程中捕获编译器输出
  2. 使用特定于编译器的正则表达式模式(GCC、Clang)解析警告
  3. 与特定于平台的 .warningignore 文件中的基线进行比较
  4. 如果出现意外警告或修复了预期警告,则生成失败

来源: Tools/build/check_warnings.py1-324 Tools/build/.warningignore_macos1-10 Tools/build/.warningignore_ubuntu1-6 .github/workflows/reusable-ubuntu.yml106-121 .github/workflows/reusable-macos.yml65-79

最终验证

流水线以最终验证步骤结束,确保所有必需的检查都已通过。

最终验证

  1. 确定哪些作业是必需的,哪些可以跳过
  2. 验证所有必需的作业是否已通过
  3. 当所有关键检查都通过时,允许合并 PR
  4. 为跳过或允许某些作业失败提供了灵活性

来源: .github/workflows/build.yml603-672

工作流分派和手动触发

流水线可以通过 GitHub 的工作流分派机制手动触发,这对于以下情况可能很有用:

  1. 按需运行完整的测试套件
  2. 在不创建拉取请求的情况下测试更改
  3. 在基础设施更改后重新运行测试
  4. 验证间歇性测试失败的修复

此功能为开发人员和维护人员提供了在提交代码之前或之后验证更改的灵活性。

来源: .github/workflows/build.yml3-12

缓存和优化

流水线使用广泛的缓存来提高性能

  1. 配置缓存 (config.cache) 加速配置步骤
  2. ccache 用于 C 编译缓存
  3. OpenSSL 构建缓存用于 SSL 测试
  4. WASI SDK 缓存

这些优化显著缩短了 CI 中的构建时间,尤其是在增量更改时。

来源: .github/workflows/reusable-ubuntu.yml82-86 .github/workflows/reusable-macos.yml39-43 .github/workflows/reusable-wasi.yml33-75

结论

CPython 的 CI/CD 流水线代表了一个全面的测试基础设施,它确保了跨多个平台、架构和配置的代码质量。它通过根据更改的文件选择性地运行测试来平衡彻底性和效率。该流水线对于在各种环境中维护 CPython 的兼容性和稳定性至关重要。