答案是:在 macOS 上构建本地 CI/CD 生产存储流水线,核心是可控、可复现、零外网依赖的闭环,涵盖代码提交、编译、签名、公证、DMG 打包及加密归档全流程。
在 macos 上搭建支持自动化构建的本地 ci/cd 生产存储流水线,关键不是追求“云端等效”,而是围绕可控、可复现、零外网依赖构建闭环。它不依赖 github actions 远程运行器或 jenkins 云节点,而是利用本地工具链完成从代码提交、编译、签名、公证、dmg 打包,到产物安全归档(即“生产存储”)的全流程——所有环节均发生在本机或可信局域网内。
核心组件选型与本地化部署
避免引入远程服务依赖,优先选用轻量、开源、macOS 原生友好的工具:
-
流水线驱动:用
act本地模拟 GitHub Actions 工作流(支持完整 YAML 语法),无需改写逻辑即可复用现有 .github/workflows/ 配置 -
构建执行:直接调用
xcodebuild(GUI 或 CLI 模式)或bazel(如 Protobuf 项目),跳过容器化构建层以降低开销 -
产物归档(生产存储):不走对象存储 API,改用本地加密卷 + 时间戳命名目录,例如挂载 APFS 加密卷
/Volumes/Prod-Archive,每次成功构建后自动复制 DMG、.zip、公证日志至/Volumes/Prod-Archive/v1.2.0-20260507-1522/ -
密钥与证书管理:Apple 开发者证书和私钥导入系统钥匙串(
login或system类别),通过security find-identity -v -p codesigning验证可用性,避免 Base64 密文硬编码
自动化构建与公证闭环
本地流水线必须覆盖 Apple 强制要求的公证(notarization)环节,且全程离线可重放:
- 构建阶段使用
xcodebuild -archive生成.xcarchive,再用xcodebuild -exportArchive导出已签名的.app - 公证前,用
spctl --assess --type execute YourApp.app本地验证签名有效性 - 调用
xcrun notarytool submit提交公证(需提前配置~/.notarytool/credentials.json,含 Apple ID 和专用密码) - 轮询状态用
xcrun notarytool log获取公证日志,成功后执行xcrun stapler staple嵌入票据 - 失败时自动终止流程并输出完整错误上下文(含
notarytool返回码和日志 ID),不静默跳过
生产级存储策略与校验机制
“生产存储”不只是保存文件,而是建立可审计、防篡改、带元数据的归档体系:
- 每次归档前,对 DMG 执行
shasum -a 256 YourApp-1.2.0.dmg > checksums.sha256,连同build-info.json(含 Git commit、Xcode 版本、公证时间戳、签名证书指纹)一并存入归档目录 - 启用 APFS 快照(
tmutil localsnapshot)为归档卷创建只读快照,防止误删或覆盖 - 设置 LaunchDaemon 定期扫描
/Volumes/Prod-Archive/下超过 90 天的旧版本,仅当对应 Git Tag 仍存在远程仓库时才允许清理 - 提供简易查询脚本
list-prod-releases.sh,按语义化版本排序列出所有归档,并高亮显示已公证、已签名、校验通过的状态
调试与复现性保障
本地流水线的价值在于快速迭代和精准排障,而非单纯“跑通”:
- 所有构建步骤封装为独立 shell 函数(如
build_app、notarize_and_staple),支持单步执行、环境变量注入、日志级别控制(VERBOSE=1) - 使用
create-dmg生成 DMG 时,强制指定--volname "YourApp v${VERSION}"和--app-drop-link 100 200等参数,确保 UI 一致性,避免图形配置漂移 - 将
act的运行日志完整保存至./logs/build-$(date +%Y%m%d-%H%M%S).log,失败时自动高亮最后 20 行关键错误 - 提供
replay-last-build.sh脚本,一键加载上次成功构建的环境变量与路径,用于对比调试


















