Presto 组织的 CI/CD 全部基于 GitHub Actions, 覆盖构建、测试、安全扫描、发布、跨仓库同步。
组织级全景
跨仓库触发链
仓库 CI 覆盖度
| 仓库 | 工作流 | 触发方式 | 说明 |
|---|---|---|---|
| Presto | release.yml | tag v* | 主应用多平台构建 + 发布 |
| Presto | build-showcase.yml | push main (showcase 路径) | 构建 Showcase 静态文件 |
| Presto | security-scan.yml | 每周一 / PR / 手动 | Go vulncheck + npm audit |
| presto-official-templates | release.yml | tag v* | 智能增量构建官方模板 |
| presto-template-starter-go | release.yml | tag v* | Go 模板 6 平台构建 |
| presto-template-starter-rust | release.yml | tag v* | Rust 模板 6 平台构建 |
| presto-template-starter-typescript | release.yml | tag v* | TS 模板 6 平台构建 |
| template-registry | update-registry.yml | 每日 08:00 UTC / 手动 | 发现 + 编译 + 部署模板 |
| template-registry | check-versions.yml | 每日 08:30 UTC / 手动 | 检测 verified 模板新版本 |
| template-registry | build-verified.yml | push main (verified-templates.json) | 编译 verified 模板 |
| Presto-homepage | sync-release.yml | repository_dispatch / 手动 | 同步 Presto 发布到官网 |
| Presto-homepage | sync-showcase.yml | repository_dispatch / 手动 | 同步 Showcase 到官网 |
| create-presto-template | 无 | — | CLI 脚手架工具,无构建产物 |
| registry-deploy | 无 | — | 纯静态部署仓库,由 registry CI 推送 |
| Presto-doc | 无 | — | 文档项目,无需 CI |
Presto 主应用发布流水线
Job 流程图
release.yml 由 tag v* 推送触发,包含以下 Job:
构建矩阵
| 平台 | 架构 | Runner | 打包格式 | 备注 |
|---|---|---|---|---|
| macOS | arm64 | macos-latest | DMG | 原生编译 |
| macOS | amd64 | macos-latest | DMG | 交叉编译 |
| Windows | amd64 | windows-latest | ZIP | MSYS2 MinGW gcc |
| Windows | arm64 | windows-latest | ZIP | llvm-mingw 交叉编译 |
| Linux | amd64 | ubuntu-22.04 | tar.gz | 原生编译 |
| Linux | arm64 | ubuntu-22.04-arm | tar.gz | ARM 原生 Runner |
| Docker | amd64 | ubuntu-latest | OCI 镜像 | 推送 ghcr.io |
| Docker | arm64 | ubuntu-24.04-arm | OCI 镜像 | 推送 ghcr.io |
所有桌面构建产物包含 Presto 主程序和 Typst CLI(v0.14.2)。 Docker 镜像推送到 ghcr.io/presto-io/presto, 通过 merge-docker Job 合并为多架构 manifest。
macOS 代码签名与公证
签名流程由 packaging/macos/codesign.sh 实现,由内而外签名:
- 签名嵌入的 Typst 二进制(
Contents/Resources/typst) - 签名主程序(
Contents/MacOS/Presto) - 签名整个
.app包 codesign --verify --deep --strict验证
CI 中通过 Secrets 导入 P12 证书到临时 Keychain, 签名完成后提交 Apple 公证(xcrun notarytool submit), 通过后执行 xcrun stapler staple 装订票据。
当前状态:macOS 代码签名需要 Apple Developer Program($99/年)。 未配置签名 Secrets 时,CI 自动回退到 ad-hoc 签名(
-s -), 用户需执行xattr -cr Presto.app绕过 Gatekeeper。
Windows arm64 交叉编译
Windows arm64 构建使用 llvm-mingw 工具链 (aarch64-w64-mingw32-gcc)在 x64 Runner 上交叉编译。 工具链通过 actions/cache 缓存,首次下载后验证 SHA256 校验和。
安全扫描
security-scan.yml 包含两个独立 Job:
| Job | 工具 | 扫描范围 | 触发条件 |
|---|---|---|---|
| go-vulncheck | govulncheck | Go 依赖漏洞 | 每周一 / PR 修改 go.mod |
| npm-audit | npm audit | 前端依赖漏洞 | 每周一 / PR 修改 package-lock.json |
两个 Job 均可通过 workflow_dispatch 手动触发。
Showcase 构建
build-showcase.yml 在 push 到 main 且 showcase 相关路径变更时触发。 构建前端静态文件后提取 showcase/ 和 _app/ 目录, 上传为 artifact 并通过 repository_dispatch (事件类型 showcase-updated)通知 Homepage 仓库同步。
模板仓库发布流水线
三种语言 Starter 的统一模式
三个 Starter 仓库 (Go / Rust / TypeScript)共享相同的发布模式:
- tag
v*推送触发 - 构建 6 平台二进制(3 OS × 2 架构)
- 生成
SHA256SUMS校验文件 - 通过
softprops/action-gh-release创建 GitHub Release
模板名从 manifest.json 的 name 字段读取, 产物命名格式:presto-template-{name}-{os}-{arch}。
构建差异
| Starter | 语言 | 构建方式 | 交叉编译方案 |
|---|---|---|---|
| Go | Go | go build -trimpath | GOOS/GOARCH 环境变量 |
| Rust | Rust | cargo build --release | cross(Linux arm64、Windows arm64) |
| TypeScript | Bun | bun build --compile | --target 指定平台 |
Go Starter 全部在 ubuntu-latest 上交叉编译(CGO_ENABLED=0)。 Rust Starter 对 macOS 使用原生 Runner, Linux/Windows arm64 使用 cross 容器化交叉编译。 TypeScript Starter 使用 Bun 的 --compile --target 编译为独立二进制, macOS 在 macos-latest 构建,其余在 ubuntu-latest 构建。
presto-official-templates 智能增量构建
官方模板仓库(monorepo)的 release.yml 包含增量检测逻辑:
changesJob 比较当前 tag 与上一个 tag 之间的文件变更- 仅变更目录下的模板进入构建矩阵
- 共享文件(
go.mod、.github/、internal/)变更时重建全部 - 首次发布或无法检测时 fallback 为全量构建
构建矩阵:{模板} × {darwin,linux,windows} × {amd64,arm64}, 全部使用 CGO_ENABLED=0 交叉编译,无需原生 Runner。
安全测试
所有模板 Starter 和官方模板均通过 make test 执行安全检测, 验证二进制不包含禁止的 import(net、os/exec、plugin 等)。 此测试在本地开发阶段运行,CI 中不单独设置安全扫描工作流。
注册中心 CI
模板注册中心(template-registry)的 CI 流水线包含三个工作流, 采用双 Job 安全隔离架构。详见 注册中心架构。
Homepage 同步机制
sync-release.yml
由 Presto 仓库 release.yml 最后一步通过 repository_dispatch(事件类型 release-published)触发。
工作流程:
- 从 Presto 仓库获取 Release 元数据和资产文件
- 在 Homepage 仓库创建同名 Release(镜像分发)
- 更新源码中的版本号(
Download.astro、Hero.astro) - 自动提交并推送版本号变更
sync-showcase.yml
由 Presto 仓库 build-showcase.yml 通过 repository_dispatch(事件类型 showcase-updated)触发。
工作流程:
- 清理
public/_app和public/showcase旧文件 - 使用
dawidd6/action-download-artifact从 Presto 仓库 下载showcase-staticartifact - 自动提交并推送到 Homepage 仓库
两个同步工作流均支持 workflow_dispatch 手动触发。
工作流速查表
Presto(主应用)
| 工作流 | 文件 | 触发 | 产物 |
|---|---|---|---|
| Release | release.yml | tag v* | DMG / ZIP / tar.gz / Docker 镜像 |
| Build Showcase | build-showcase.yml | push main | showcase-static artifact |
| Security Scan | security-scan.yml | cron / PR / 手动 | 扫描报告 |
presto-official-templates
| 工作流 | 文件 | 触发 | 产物 |
|---|---|---|---|
| Release | release.yml | tag v* | 增量模板二进制 + SHA256SUMS |
presto-template-starter-go
| 工作流 | 文件 | 触发 | 产物 |
|---|---|---|---|
| Release | release.yml | tag v* | 6 平台二进制 + SHA256SUMS |
presto-template-starter-rust
| 工作流 | 文件 | 触发 | 产物 |
|---|---|---|---|
| Release | release.yml | tag v* | 6 平台二进制 + SHA256SUMS |
presto-template-starter-typescript
| 工作流 | 文件 | 触发 | 产物 |
|---|---|---|---|
| Release | release.yml | tag v* | 6 平台二进制 + SHA256SUMS |
template-registry
| 工作流 | 文件 | 触发 | 产物 |
|---|---|---|---|
| Update Registry | update-registry.yml | cron 每日 / 手动 | registry.json + SVG 预览 |
| Check Versions | check-versions.yml | cron 每日 / 手动 | 自动 PR |
| Build Verified | build-verified.yml | push main | verified 模板编译产物 |
Presto-homepage
| 工作流 | 文件 | 触发 | 产物 |
|---|---|---|---|
| Sync Release | sync-release.yml | dispatch / 手动 | 镜像 Release + 版本号更新 |
| Sync Showcase | sync-showcase.yml | dispatch / 手动 | 静态文件同步 |
共性模式
commit SHA 固定 Actions 版本
所有工作流中的第三方 Action 均使用完整 commit SHA 引用, 而非 tag 引用,防止供应链攻击。示例:
# 正确:SHA 固定
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
# 避免:tag 引用(可被篡改)
# - uses: actions/checkout@v4SHA256 校验
所有外部下载的二进制均验证 SHA256 校验和:
- Typst CLI:CI 矩阵中内联
typst_sha256字段 - llvm-mingw 工具链:硬编码
EXPECTED_HASH并用sha256sum -c验证 - 发布产物:
sha256sum生成checksums.txt或SHA256SUMS
softprops/action-gh-release
模板仓库(Starter + 官方模板)统一使用 softprops/action-gh-release(SHA 固定)创建 GitHub Release, 配合 generate_release_notes: true 自动生成变更日志。
Presto 主应用使用 gh release create CLI 命令, 支持 prerelease 标记(-rc、-beta、-alpha 后缀自动识别)。
无 goreleaser
Presto 组织不使用 goreleaser。 构建逻辑通过 Makefile + GitHub Actions 矩阵直接管理, 保持对构建过程的完全控制。
