菜单

构建和发布系统

相关源文件

本文档涵盖了 Caddy 的持续集成、构建自动化和发布管理基础设施。该系统处理跨多个平台的自动化测试、针对各种操作系统和架构的交叉编译、软件包生成以及通过多个渠道进行安全发布分发。

有关用于构建的 CLI 命令信息,请参阅命令。有关测试框架的详细信息,请参阅测试框架

概述

Caddy 的构建和发布系统通过 GitHub Actions 工作流实现,这些工作流协调测试、构建、打包和分发。该系统支持多种平台、架构和软件包格式,并通过密码签名和验证来维护安全性。

CI/CD 管道架构

来源:.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 系统在三个主要平台使用特定的操作系统标签和二进制路径进行测试

平台操作系统标签二进制路径成功值
Linuxubuntu-latest./cmd/caddy/caddy0
macOSmacos-14./cmd/caddy/caddy0
Windowswindows-latest./cmd/caddy/caddy.exe'True'

来源:.github/workflows/ci.yml42-55

构建流程

标准构建过程使用特定的构建标签和编译标志

此配置禁用 CGO 并排除可选的数据库驱动程序,同时应用大小和调试优化。

来源:.github/workflows/ci.yml97-102

专用测试环境

s390x 在 IBM Z 上的测试

CI 包含针对 IBM Z 架构的专用测试,使用基于 SSH 的远程执行

s390x 测试包括重试逻辑,对于不稳定测试场景最多可重试 3 次。

来源:.github/workflows/ci.yml143-194

GoReleaser 验证

CI 流水线包含 GoReleaser 配置验证,以确保发布构建能够成功

  • 使用 goreleaser check 进行配置语法检查
  • 使用 --single-target --snapshot 生成测试构建
  • xcaddy 集成以获得扩展构建能力

来源:.github/workflows/ci.yml195-221

发布管理

发布触发与验证

发布由匹配模式 v*.*.* 的 Git 标签触发。发布过程包括加密验证

验证过程确保只有正确签名的标签才能触发发布。

来源:.github/workflows/release.yml93-101

GoReleaser 构建配置

GoReleaser 配置通过使用单独的构建目录来实现复杂的构建策略,以避免在构建过程中修改 Git 仓库。

构建前准备

此过程在保留原始仓库状态的同时创建干净的构建环境。

来源:.goreleaser.yml3-31

多平台构建矩阵

构建配置支持广泛的平台覆盖

操作系统架构特殊说明
darwinamd64, arm64排除 arm, ppc64le, s390x, riscv64
linuxamd64, arm (v5,v6,v7), arm64, s390x, ppc64le, riscv64完整架构支持
windowsamd64, arm (v5,v6,v7), arm64排除 ppc64le, s390x, riscv64
freebsdamd64, arm64, arm (v6,v7)有限架构支持

来源:.goreleaser.yml39-87

包分发

Debian 软件包生成

系统生成包含全面系统集成的 .deb 软件包

软件包包括 systemd 服务文件、默认配置、文档和安装脚本。

来源:.goreleaser.yml154-194

分发渠道

分发策略将稳定版和实验版发布分离到不同的仓库中。

来源:.github/workflows/release.yml130-182

安全与验证

使用 Cosign 进行 Artifact 签名

所有发布 Artifact 都使用 Cosign 进行无密钥签名

这提供了 Artifact 真实性的密码验证,无需密钥管理。

来源:.goreleaser.yml89-94

软件物料清单 (SBOM)

系统使用 Syft 生成 SBOM,以实现供应链透明度

SBOM 为所有二进制 Artifact 生成,并遵循 CycloneDX JSON 格式。

来源:.goreleaser.yml96-108

跨平台构建测试

交叉构建工作流验证了包括 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 工作流结合了多种分析工具

  • golangci-lint:全面的 Go 代码分析,Windows 兼容性有 10 分钟超时
  • govulncheck:对已知依赖安全问题进行漏洞扫描

来源:.github/workflows/lint.yml53-71

依赖管理

构建标签始终排除可选依赖项

  • nobadger: 排除 BadgerDB 存储后端
  • nomysql: 排除 MySQL 数据库驱动程序
  • nopgx: 排除 PostgreSQL 驱动程序

这种方法保持了最小核心,同时允许通过自定义构建进行可选扩展。

来源:.github/workflows/ci.yml102 .goreleaser.yml84-87

发布后自动化

发布后的工作流触发相关仓库的下游自动化

这确保了 Caddy 生态系统(包括分发包和容器镜像)的协调更新。

来源:.github/workflows/release_published.yml20-34