macOS 下可构建稳定可控的本地 CI 流程:用 launchd + shell 替代 Jenkins 实现 Git 变更自动触发,Apache 或 Python 服务分发产物,钥匙串管理签名,Brewfile 锁定环境。
macos 环境下的持续集成(ci)不需要依赖公有云服务,也能构建出稳定、可审计、端到端可控的自动化流程。关键在于选对轻量工具链、打通触发—构建—分发闭环,并规避系统级干扰。
用 launchd + shell 脚本替代 Jenkins
不装 Jenkins 也能实现 Git 变更自动触发构建:
- 编写统一构建脚本(如
ci/build.sh),封装拉取代码、清理缓存、运行测试、生成产物等步骤 - 用
launchd监听.git/refs/heads/main文件变化,检测到更新即执行脚本 - 支持多分支:脚本中通过
git rev-parse --abbrev-ref HEAD获取当前分支,动态切换构建配置(如Debugfordev,Releaseformain) - 避免误触发:关闭 Spotlight 对工作目录索引(
sudo mdutil -i off /path/to/project)
构建产物本地网络分发
构建成功后,让团队成员或测试设备快速获取最新包:
- 启用 macOS 内置 Apache:
sudo apachectl start,把dist/目录软链到/Library/WebServer/Documents/builds/,设好读权限 - 临时调试可用 Python HTTP 服务:
cd dist && python3 -m http.server 8000,局域网内直接访问http://mac-ip:8000 - 产物命名建议带 Git 提交短哈希和时间戳(如
MyApp-1.2.0-abc123-20260618.zip),方便追溯
签名与证书的本地化管理
涉及上架或内部分发时,签名必须可靠且可复现:
- 将开发者证书和私钥导入登录钥匙串,设置为“始终信任”
- 在构建脚本中显式指定证书名:
CODE_SIGN_IDENTITY="Apple Development: name@email.com" - 禁用自动管理签名(
CODE_SIGN_STYLE=Manual),避免 Xcode 自作主张导致签名失败 - 敏感信息(如证书密码)不硬编码,改用
security find-generic-password从钥匙串安全读取
跨项目统一环境的关键实践
防止“在我机器上能跑”的陷阱,靠声明式环境定义:
- 用 Homebrew +
Brewfile锁定 CLI 工具版本(brew bundle dump --file=Brewfile) - Go 项目确保
go version ≥ 1.16,Node 项目用pnpm并锁定engines字段 - Xcode 命令行工具需主动接受许可:
xcodebuild -license accept - 所有构建脚本开头校验必要工具是否存在,缺失则报错退出,不静默降级


















