Skip to content

Presto 组织的 CI/CD 全部基于 GitHub Actions, 覆盖构建、测试、安全扫描、发布、跨仓库同步。

组织级全景

跨仓库触发链

仓库 CI 覆盖度

仓库工作流触发方式说明
Prestorelease.ymltag v*主应用多平台构建 + 发布
Prestobuild-showcase.ymlpush main (showcase 路径)构建 Showcase 静态文件
Prestosecurity-scan.yml每周一 / PR / 手动Go vulncheck + npm audit
presto-official-templatesrelease.ymltag v*智能增量构建官方模板
presto-template-starter-gorelease.ymltag v*Go 模板 6 平台构建
presto-template-starter-rustrelease.ymltag v*Rust 模板 6 平台构建
presto-template-starter-typescriptrelease.ymltag v*TS 模板 6 平台构建
template-registryupdate-registry.yml每日 08:00 UTC / 手动发现 + 编译 + 部署模板
template-registrycheck-versions.yml每日 08:30 UTC / 手动检测 verified 模板新版本
template-registrybuild-verified.ymlpush main (verified-templates.json)编译 verified 模板
Presto-homepagesync-release.ymlrepository_dispatch / 手动同步 Presto 发布到官网
Presto-homepagesync-showcase.ymlrepository_dispatch / 手动同步 Showcase 到官网
create-presto-templateCLI 脚手架工具,无构建产物
registry-deploy纯静态部署仓库,由 registry CI 推送
Presto-doc文档项目,无需 CI

Presto 主应用发布流水线

Job 流程图

release.yml 由 tag v* 推送触发,包含以下 Job:

构建矩阵

平台架构Runner打包格式备注
macOSarm64macos-latestDMG原生编译
macOSamd64macos-latestDMG交叉编译
Windowsamd64windows-latestZIPMSYS2 MinGW gcc
Windowsarm64windows-latestZIPllvm-mingw 交叉编译
Linuxamd64ubuntu-22.04tar.gz原生编译
Linuxarm64ubuntu-22.04-armtar.gzARM 原生 Runner
Dockeramd64ubuntu-latestOCI 镜像推送 ghcr.io
Dockerarm64ubuntu-24.04-armOCI 镜像推送 ghcr.io

所有桌面构建产物包含 Presto 主程序和 Typst CLI(v0.14.2)。 Docker 镜像推送到 ghcr.io/presto-io/presto, 通过 merge-docker Job 合并为多架构 manifest。

macOS 代码签名与公证

签名流程由 packaging/macos/codesign.sh 实现,由内而外签名:

  1. 签名嵌入的 Typst 二进制(Contents/Resources/typst
  2. 签名主程序(Contents/MacOS/Presto
  3. 签名整个 .app
  4. 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-vulncheckgovulncheckGo 依赖漏洞每周一 / PR 修改 go.mod
npm-auditnpm 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)共享相同的发布模式:

  1. tag v* 推送触发
  2. 构建 6 平台二进制(3 OS × 2 架构)
  3. 生成 SHA256SUMS 校验文件
  4. 通过 softprops/action-gh-release 创建 GitHub Release

模板名从 manifest.jsonname 字段读取, 产物命名格式:presto-template-{name}-{os}-{arch}

构建差异

Starter语言构建方式交叉编译方案
GoGogo build -trimpathGOOS/GOARCH 环境变量
RustRustcargo build --releasecross(Linux arm64、Windows arm64)
TypeScriptBunbun 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 包含增量检测逻辑:

  1. changes Job 比较当前 tag 与上一个 tag 之间的文件变更
  2. 仅变更目录下的模板进入构建矩阵
  3. 共享文件(go.mod.github/internal/)变更时重建全部
  4. 首次发布或无法检测时 fallback 为全量构建

构建矩阵:{模板} × {darwin,linux,windows} × {amd64,arm64}, 全部使用 CGO_ENABLED=0 交叉编译,无需原生 Runner。

安全测试

所有模板 Starter 和官方模板均通过 make test 执行安全检测, 验证二进制不包含禁止的 import(netos/execplugin 等)。 此测试在本地开发阶段运行,CI 中不单独设置安全扫描工作流。

注册中心 CI

模板注册中心(template-registry)的 CI 流水线包含三个工作流, 采用双 Job 安全隔离架构。详见 注册中心架构

Homepage 同步机制

sync-release.yml

由 Presto 仓库 release.yml 最后一步通过 repository_dispatch(事件类型 release-published)触发。

工作流程:

  1. 从 Presto 仓库获取 Release 元数据和资产文件
  2. 在 Homepage 仓库创建同名 Release(镜像分发)
  3. 更新源码中的版本号(Download.astroHero.astro
  4. 自动提交并推送版本号变更

sync-showcase.yml

由 Presto 仓库 build-showcase.yml 通过 repository_dispatch(事件类型 showcase-updated)触发。

工作流程:

  1. 清理 public/_apppublic/showcase 旧文件
  2. 使用 dawidd6/action-download-artifact 从 Presto 仓库 下载 showcase-static artifact
  3. 自动提交并推送到 Homepage 仓库

两个同步工作流均支持 workflow_dispatch 手动触发。

工作流速查表

Presto(主应用)

工作流文件触发产物
Releaserelease.ymltag v*DMG / ZIP / tar.gz / Docker 镜像
Build Showcasebuild-showcase.ymlpush mainshowcase-static artifact
Security Scansecurity-scan.ymlcron / PR / 手动扫描报告

presto-official-templates

工作流文件触发产物
Releaserelease.ymltag v*增量模板二进制 + SHA256SUMS

presto-template-starter-go

工作流文件触发产物
Releaserelease.ymltag v*6 平台二进制 + SHA256SUMS

presto-template-starter-rust

工作流文件触发产物
Releaserelease.ymltag v*6 平台二进制 + SHA256SUMS

presto-template-starter-typescript

工作流文件触发产物
Releaserelease.ymltag v*6 平台二进制 + SHA256SUMS

template-registry

工作流文件触发产物
Update Registryupdate-registry.ymlcron 每日 / 手动registry.json + SVG 预览
Check Versionscheck-versions.ymlcron 每日 / 手动自动 PR
Build Verifiedbuild-verified.ymlpush mainverified 模板编译产物

Presto-homepage

工作流文件触发产物
Sync Releasesync-release.ymldispatch / 手动镜像 Release + 版本号更新
Sync Showcasesync-showcase.ymldispatch / 手动静态文件同步

共性模式

commit SHA 固定 Actions 版本

所有工作流中的第三方 Action 均使用完整 commit SHA 引用, 而非 tag 引用,防止供应链攻击。示例:

yaml
# 正确:SHA 固定
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4

# 避免:tag 引用(可被篡改)
# - uses: actions/checkout@v4

SHA256 校验

所有外部下载的二进制均验证 SHA256 校验和:

  • Typst CLI:CI 矩阵中内联 typst_sha256 字段
  • llvm-mingw 工具链:硬编码 EXPECTED_HASH 并用 sha256sum -c 验证
  • 发布产物:sha256sum 生成 checksums.txtSHA256SUMS

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 矩阵直接管理, 保持对构建过程的完全控制。

Presto — Markdown to PDF