本文档涵盖了 Caddy 的持续集成、构建自动化和发布管理基础设施。该系统处理跨多个平台的自动化测试、针对各种操作系统和架构的交叉编译、软件包生成以及通过多个渠道进行安全发布分发。
有关用于构建的 CLI 命令信息,请参阅命令。有关测试框架的详细信息,请参阅测试框架。
Caddy 的构建和发布系统通过 GitHub Actions 工作流实现,这些工作流协调测试、构建、打包和分发。该系统支持多种平台、架构和软件包格式,并通过密码签名和验证来维护安全性。
来源:.github/workflows/ci.yml .github/workflows/release.yml .github/workflows/lint.yml .github/workflows/cross-build.yml .github/workflows/release_published.yml .goreleaser.yml
主要 CI 流水线在 .github/workflows/ci.yml 中定义,并跨多个平台和 Go 版本执行全面的测试。
CI 系统在三个主要平台使用特定的操作系统标签和二进制路径进行测试
| 平台 | 操作系统标签 | 二进制路径 | 成功值 |
|---|---|---|---|
| Linux | ubuntu-latest | ./cmd/caddy/caddy | 0 |
| macOS | macos-14 | ./cmd/caddy/caddy | 0 |
| Windows | windows-latest | ./cmd/caddy/caddy.exe | 'True' |
来源:.github/workflows/ci.yml42-55
标准构建过程使用特定的构建标签和编译标志
此配置禁用 CGO 并排除可选的数据库驱动程序,同时应用大小和调试优化。
来源:.github/workflows/ci.yml97-102
CI 包含针对 IBM Z 架构的专用测试,使用基于 SSH 的远程执行
s390x 测试包括重试逻辑,对于不稳定测试场景最多可重试 3 次。
来源:.github/workflows/ci.yml143-194
CI 流水线包含 GoReleaser 配置验证,以确保发布构建能够成功
goreleaser check 进行配置语法检查--single-target --snapshot 生成测试构建xcaddy 集成以获得扩展构建能力来源:.github/workflows/ci.yml195-221
发布由匹配模式 v*.*.* 的 Git 标签触发。发布过程包括加密验证
验证过程确保只有正确签名的标签才能触发发布。
来源:.github/workflows/release.yml93-101
GoReleaser 配置通过使用单独的构建目录来实现复杂的构建策略,以避免在构建过程中修改 Git 仓库。
此过程在保留原始仓库状态的同时创建干净的构建环境。
构建配置支持广泛的平台覆盖
| 操作系统 | 架构 | 特殊说明 |
|---|---|---|
darwin | amd64, arm64 | 排除 arm, ppc64le, s390x, riscv64 |
linux | amd64, arm (v5,v6,v7), arm64, s390x, ppc64le, riscv64 | 完整架构支持 |
windows | amd64, arm (v5,v6,v7), arm64 | 排除 ppc64le, s390x, riscv64 |
freebsd | amd64, arm64, arm (v6,v7) | 有限架构支持 |
系统生成包含全面系统集成的 .deb 软件包
软件包包括 systemd 服务文件、默认配置、文档和安装脚本。
分发策略将稳定版和实验版发布分离到不同的仓库中。
来源:.github/workflows/release.yml130-182
所有发布 Artifact 都使用 Cosign 进行无密钥签名
这提供了 Artifact 真实性的密码验证,无需密钥管理。
系统使用 Syft 生成 SBOM,以实现供应链透明度
SBOM 为所有二进制 Artifact 生成,并遵循 CycloneDX JSON 格式。
交叉构建工作流验证了包括 AIX、Solaris、Illumos 和 BSD 变体在内的各种平台的编译。这确保了可移植性,而无需在每个平台上执行完整的测试。
交叉构建矩阵包括主要 CI 未覆盖的平台
aix (Power 架构)solaris, illumos (SPARC/x86)dragonfly, freebsd, openbsd, netbsd (BSD 系列)每个平台都使用特定于架构的配置,其中 AIX 默认使用 ppc64,其他则默认使用 amd64。
来源:.github/workflows/cross-build.yml22-73
linting 工作流结合了多种分析工具
来源:.github/workflows/lint.yml53-71
构建标签始终排除可选依赖项
nobadger: 排除 BadgerDB 存储后端nomysql: 排除 MySQL 数据库驱动程序nopgx: 排除 PostgreSQL 驱动程序这种方法保持了最小核心,同时允许通过自定义构建进行可选扩展。
来源:.github/workflows/ci.yml102 .goreleaser.yml84-87
发布后的工作流触发相关仓库的下游自动化
这确保了 Caddy 生态系统(包括分发包和容器镜像)的协调更新。