菜单

CI/CD 流水线

相关源文件

本文档提供了关于 uv 包管理器的持续集成 (CI) 和持续交付 (CD) 流水线的详细信息。它涵盖了确保 uv 在多个平台上的质量和可用性的工作流、构建流程、测试策略和发布流程。

概述

uv 项目使用 GitHub Actions 作为其 CI/CD 平台,并由 cargo-dist 协调发布。该流水线验证代码更改,跨多个平台进行测试,为各种架构构建二进制文件,并通过 PyPI、Docker 注册表和 GitHub releases 自动化分发。

CI/CD 管道概述

来源: .github/workflows/ci.yml1-11 .github/workflows/release.yml42-50 .github/workflows/sync-python-releases.yml6-8

持续集成

主要 CI 工作流

核心 CI 工作流在 .github/workflows/ci.yml 中定义,并使用 determine_changes 作业根据文件更改优化执行。该工作流在以下情况运行时:

  • 拉取请求被打开或更新时
  • 代码被推送到主分支时
  • 手动触发 workflow_dispatch

CI 作业依赖关系和执行流程

来源: .github/workflows/ci.yml21-68 .github/workflows/ci.yml120-167 .github/workflows/ci.yml199-362 .github/workflows/ci.yml469-877

测试策略

CI 流水线使用多种测试方法,以 cargo nextest 作为主要测试运行器。

测试作业配置

作业运行器特性并行度
cargo-test-linuxdepot-ubuntu-22.04-16python-patch-j 20
cargo-test-macosmacos-latest-xlargepython,python-managed,pypi,git,performance,crates-io-j 12
cargo-test-windowsgithub-windows-2025-x86_64-16python,pypi,python-managed-j 20

测试类别

Windows 崩溃转储分析 Windows 测试作业包含崩溃转储收集和使用 cdb.exe 进行的分析,用于调试退出代码为 -1073741819 的测试失败。

来源: .github/workflows/ci.yml199-362 .github/workflows/ci.yml741-796 .github/workflows/ci.yml797-873 .github/workflows/ci.yml365-467

代码质量检查

CI 流水线包含多项代码质量检查:

  1. Linting:Rust 代码 (clippy)、Python 代码 (ruff)、shell 脚本 (shellcheck)
  2. Formatting:Rust 的 rustfmt、YAML/JSON 的 Prettier、Python 的 ruff
  3. Type Checking:Python 代码的 MyPy
  4. Documentation:生成的文档验证

来源: .github/workflows/ci.yml69-119 .github/workflows/ci.yml120-168

持续交付

发布流程

发布过程由带有发布标签的 workflow_dispatch 触发。该过程由 cargo-dist 协调,并在 .github/workflows/release.yml 中定义。

cargo-dist 发布工作流

来源: .github/workflows/release.yml52-275 .github/workflows/build-binaries.yml7-11 .github/workflows/build-docker.yml6-8

二进制构建

二进制构建过程在 .github/workflows/build-binaries.yml 中定义,并使用 maturin 创建特定于平台的二进制文件和 Python wheels。该过程构建了主要的 uv 包和专门的 uv-build 包。

构建矩阵和目标

平台目标容器特殊选项
macOS x86_64x86_64原生--features self-update
macOS ARM64aarch64原生--features self-update
Windowsx86_64-pc-windows-msvc原生--features self-update,windows-gui-bin
Linux GNUx86_64-unknown-linux-gnuquay.io/pypa/manylinux2014--features self-update
Linux ARMaarch64-unknown-linux-gnumanylinux: 2_28JEMALLOC_SYS_WITH_LG_PAGE=16
Linux s390xs390x-unknown-linux-gnumanylinux: autorust-toolchain: nightly-2025-05-25

来源: .github/workflows/build-binaries.yml44-90 .github/workflows/build-binaries.yml92-209 .github/workflows/build-binaries.yml211-285 .github/workflows/build-binaries.yml287-489

Docker 镜像构建

Docker 镜像构建过程在 .github/workflows/build-docker.yml 中定义,并创建发布到 ghcr.io/astral-sh/uv 的多平台镜像。

Docker 构建和发布流程

Docker 镜像变体

基础镜像生成的标签目的
alpine:3.21alpine3.21, alpine基于 Alpine 的最小镜像
debian:bookworm-slimbookworm-slim, debian-slim基于 Debian 的最小镜像
buildpack-deps:bookwormbookworm, debian完整的 Debian 开发镜像
python:3.13-alpinepython3.13-alpinePython 3.13 (Alpine 版本)
python:3.13-bookwormpython3.13-bookwormPython 3.13 (Debian 版本)
python:3.13-slim-bookwormpython3.13-bookworm-slimPython 3.13 (Debian slim 版本)

来源: .github/workflows/build-docker.yml35-121 .github/workflows/build-docker.yml122-171 .github/workflows/build-docker.yml173-295 .github/workflows/build-docker.yml307-391

PyPI 发布

PyPI 发布过程使用构建好的 wheel 包通过受信任发布进行发布到 PyPI。

  1. uv Package:主要的 Python 包
  2. uv-build Package:用于构建操作的专用包

该过程使用 uv 的自身发布命令上传包。

来源: .github/workflows/publish-pypi.yml15-51

文档发布

文档发布过程

  1. 使用 MkDocs 构建文档
  2. 向 docs 仓库创建拉取请求
  3. 自动合并 PR 以进行发布(其他情况需要手动审核)

该过程支持公开文档和包含附加功能的私有“Insiders”版本。

来源: .github/workflows/publish-docs.yml20-144

基础设施

GitHub Actions Runner

该项目使用各种 GitHub Actions Runner 来优化不同的任务

运行器目的应用场景
depot-ubuntu-latest-4通用 Linux 构建发布工作流
depot-ubuntu-22.04-16Linux 测试CI 测试
github-macos-14-aarch64-6ARM macOS 测试macOS 测试
macos-latest-largeIntel macOS 测试macOS 测试
github-windows-2025-x86_64-16Windows 测试Windows 测试
github-windows-11-aarch64-4ARM Windows 测试Smoke 测试

该项目还使用了 Windows 开发的特殊配置,包括用于优化文件系统操作的 Dev Drive。

来源: .github/workflows/ci.yml196-198 .github/workflows/ci.yml203 .github/workflows/ci.yml235 .github/workflows/ci.yml268 .github/workflows/ci.yml846 .github/workflows/release.yml55

跨平台构建矩阵

该项目为 Cargo.toml 文件中 workspace.metadata.dist.targets 定义的平台构建二进制文件。 cargo-dist 配置在多个架构上指定了 18 个目标平台。

cargo-dist 目标矩阵

最低 glibc 覆盖

目标glibc 版本注意
aarch64-unknown-linux-gnu2.28ARM64 特定
riscv64gc-unknown-linux-gnu2.31RISC-V 特定
所有其他2.17默认最低

来源: Cargo.toml314-333 Cargo.toml362-368 Cargo.toml375-381

自动化维护

Python 版本同步

一个计划工作流每天运行,同步有关可用 Python 版本的信息

  1. 从外部源获取 Python 发行版元数据
  2. 更新内部元数据文件
  3. 创建包含更改的拉取请求
  4. 用于使 Python 版本管理器与最新发行版保持同步

来源: .github/workflows/sync-python-releases.yml1-42 crates/uv-python/minify-download-metadata.py1-44 crates/uv-python/src/download-metadata-minified.json1

发布流程

发布流程由 cargo-dist 编排,涉及跨多个工作流的协调执行

完整的发布序列

来源: .github/workflows/release.yml54-275 .github/workflows/build-binaries.yml1-7 .github/workflows/publish-pypi.yml15-51 .github/workflows/publish-docs.yml21-144

结论

uv 的 CI/CD 流水线是一个健壮的系统,旨在跨多个平台验证、构建和发布包管理器。它通过全面的测试和代码审查确保代码质量,并自动化发布流程,为用户交付一致的制品。

GitHub Actions 的使用提供了灵活性和可伸缩性,使项目能够高效地管理资源,同时满足不同平台和架构的多样化需求。