name: 部署到预发布环境 description: 当需要跨relay、relay-dashboard和relay-cloud仓库部署变更到预发布环境时使用 - 使用git worktrees协调多仓库分支同步,通过GitHub Actions自动触发预发布部署
部署到预发布环境
概述
预发布环境部署是一个协调的多仓库流程,同步三个仓库(relay、relay-dashboard、relay-cloud)的代码,并通过GitHub Actions自动触发部署。预发布部署确保在生产环境前进行功能验证,同时在开发期间保持主分支的清洁。
何时使用
- 跨仓库集成功能 - 多个组件依赖于不同仓库的变更
- 一起测试功能分支 - 验证功能分支变更不会破坏集成
- 将主分支提升到预发布 - 标准同步以保持预发布环境与最新主分支同步
- 验证部署就绪性 - 测试基础设施变更或部署工作流
- 跨团队协调 - 共享功能分支进行集成测试
何时不使用:
- 紧急热修复(改用生产部署)
- 仅单仓库变更(如果不阻塞其他仓库,直接推送)
- 无部署意图的测试(改用本地环境)
架构
预发布部署系统包括:
三个仓库(relay、relay-dashboard、relay-cloud)
↓
预发布分支(通过git push同步)
↓
relay-cloud预发布推送触发GitHub Actions
↓
部署预发布工作流(deploy-staging.yml)
↓
Fly.io预发布环境(agent-relay-staging)
↓
自动健康检查验证
关键细节:
- 每个仓库都有独立的预发布分支
- relay-cloud预发布分支推送触发自动部署
- 工作流接受可选的relay/dashboard分支覆盖
- 如果指定分支不存在,则回退到主分支
- 工作空间镜像构建与API部署并行进行
快速参考
标准工作流(所有仓库)
# 1. 为预发布工作创建git worktree(最佳实践)
cd /data/repos/relay
git worktree add .worktrees/staging-push main
cd .worktrees/staging-push
# 2. 推送最新主分支到预发布(获取最新)
git fetch origin main:main
git push origin main:staging
# 3. 或将当前功能分支推送到预发布(如果需要)
git fetch origin feature/your-branch:feature/your-branch
git push origin feature/your-branch:staging
# 4. 清理worktree
cd /data/repos/relay
git worktree remove .worktrees/staging-push
Relay-Dashboard
cd /data/repos/relay-dashboard
git worktree add .worktrees/staging-push main
cd .worktrees/staging-push
git fetch origin main:main
git push origin main:staging
cd /data/repos/relay-dashboard
git worktree remove .worktrees/staging-push
Relay-Cloud(触发部署)
cd /data/repos/relay-cloud
git worktree add .worktrees/staging-push main
cd .worktrees/staging-push
git fetch origin main:main
git push origin main:staging
# ⚠️ 此推送触发deploy-staging.yml工作流
cd /data/repos/relay-cloud
git worktree remove .worktrees/staging-push
实现
为什么使用Git Worktrees?
Git worktrees为预发布工作流提供了几个好处:
- 隔离性 - 在不改变主工作目录状态的情况下处理预发布
- 安全性 - 在worktree中检出的功能分支不会影响当前工作
- 清洁性 - 推送后没有残留的状态变更
- 最佳实践 - 多分支操作的标准DevOps方法
分步部署流程
先决条件
- 对所有三个仓库具有推送权限的访问权限
- 当前工作目录:其中一个仓库
- 没有未提交的变更阻止worktree创建
在所有仓库中执行预发布推送
步骤1:Relay
cd /data/repos/relay
git worktree add .worktrees/staging-push main
cd .worktrees/staging-push
git fetch origin main:main
git push origin main:staging
cd /data/repos/relay
git worktree remove .worktrees/staging-push
预期输出:
Updated 'main' to 'origin/main'
remote: Create pull request for staging...
To github.com:AgentWorkforce/relay.git
[new branch] main -> staging
or
* [up-to-date] main -> staging
步骤2:Relay-Dashboard
cd /data/repos/relay-dashboard
git worktree add .worktrees/staging-push main
cd .worktrees/staging-push
git fetch origin main:main
git push origin main:staging
cd /data/repos/relay-dashboard
git worktree remove .worktrees/staging-push
步骤3:Relay-Cloud(触发部署)
cd /data/repos/relay-cloud
git worktree add .worktrees/staging-push main
cd .worktrees/staging-push
git fetch origin main:main
git push origin main:staging
# 部署自动开始!
cd /data/repos/relay-cloud
git worktree remove .worktrees/staging-push
验证部署
推送relay-cloud后,GitHub Actions自动开始:
-
监视工作流进度:
- 前往:https://github.com/AgentWorkforce/relay-cloud/actions
- 找到“Deploy (Staging)”工作流运行
- 检查两个作业是否通过:
- “Deploy to Staging”(Fly.io部署)
- “Build Staging Workspace”(Docker镜像构建)
-
验证健康检查:
- 工作流运行
curl https://agent-relay-staging.fly.dev/health - 预期:150秒内收到200响应
- 以5秒间隔重试30次
- 工作流运行
-
检查部署摘要:
- 点击工作流运行
- 查看步骤摘要中的“Deployment Summary”
- 确认部署到agent-relay-staging
推送功能分支到预发布
代替主分支,推送特定的功能分支:
cd /data/repos/relay
git worktree add .worktrees/staging-push main
cd .worktrees/staging-push
git fetch origin feature/your-feature:feature/your-feature
git push origin feature/your-feature:staging
cd /data/repos/relay
git worktree remove .worktrees/staging-push
对于具有自定义relay/dashboard分支的relay-cloud:
deploy-staging.yml工作流接受可选输入以指定确切分支:
# 推送relay-cloud预发布(将使用输入触发GitHub Actions)
cd /data/repos/relay-cloud
git worktree add .worktrees/staging-push main
cd .worktrees/staging-push
git fetch origin feature/custom-branch:feature/custom-branch
git push origin feature/custom-branch:staging
cd /data/repos/relay-cloud
git worktree remove .worktrees/staging-push
然后手动触发指定分支:
- 前往:https://github.com/AgentWorkforce/relay-cloud/actions/workflows/deploy-staging.yml
- 点击“Run workflow”
- 输入:
relay_branch和dashboard_branch(可选) - 确认运行开始
常见错误
| 错误 | 问题 | 修复 |
|---|---|---|
| 从脏工作树推送 | Worktree创建失败并报错 | 在创建worktree之前提交或暂存变更 |
| 忘记移除worktree | 积累worktree目录 | 推送后始终运行 git worktree remove .worktrees/staging-push |
| 推送预发布而没有relay/dashboard | 部署使用过时的relay/dashboard | 协调所有三个仓库或使用GitHub Actions输入覆盖 |
| 未获取最新引用 | 推送过时的本地分支状态 | 推送前始终 git fetch origin branch:branch |
| 混淆预发布分支方向 | 推送main→staging,而不是staging→main | 记住:功能工作 → 预发布分支,用于提升/测试 |
| 假设所有仓库自动同步 | relay/dashboard变更不会自动触发 | 只有relay-cloud预发布推送触发部署 |
| 未检查健康状态 | 部署可能静默失败 | 始终验证工作流完成且健康检查通过 |
| 在错误目录中创建worktrees | 多个仓库的路径混淆 | 每个仓库是独立的;在该仓库的.worktrees/内创建worktrees |
工作流详情
deploy-staging.yml行为
触发器:
- 手动推送到预发布分支(自动)
- GitHub Actions workflow_dispatch(手动,带可选输入)
可选工作流输入:
relay_branch- 覆盖要部署的relay分支(默认为当前预发布分支)dashboard_branch- 覆盖要部署的relay-dashboard分支(默认为当前预发布分支)- 如果指定分支在远程不存在,则回退到主分支
部署步骤:
- 检出relay-cloud仓库
- 确定relay分支(输入或当前,回退到主分支)
- 确定dashboard分支(输入或当前,回退到主分支)
- 设置Fly CLI
- 使用
flyctl deploy部署到Fly.io - 验证健康检查端点
- 创建部署摘要
环境: staging(需要GitHub Actions环境密钥)
部署成功标准
✅ 所有检查通过:
- [ ] “Deploy to Staging”作业完成
- [ ] “Build Staging Workspace”作业完成
- [ ] 健康检查成功(来自/health端点的HTTP 200)
- [ ] 部署摘要显示所有预期值
❌ 部署失败:
- 工作流运行显示红色X
- 检查工作流日志中失败的步骤
- 常见失败:身份验证(密钥)、健康检查超时、Docker构建错误
实际工作流
场景: 跨所有三个仓库的功能准备进行集成测试
# 1. 确保本地主分支是最新的
cd /data/repos/relay
git fetch origin main
cd /data/repos/relay-dashboard
git fetch origin main
cd /data/repos/relay-cloud
git fetch origin main
# 2. 推送relay主分支到预发布(使用worktree)
cd /data/repos/relay
git worktree add .worktrees/staging-push main
cd .worktrees/staging-push
git push origin main:staging
cd ..
git worktree remove .worktrees/staging-push
# 3. 推送relay-dashboard主分支到预发布
cd /data/repos/relay-dashboard
git worktree add .worktrees/staging-push main
cd .worktrees/staging-push
git push origin main:staging
cd ..
git worktree remove .worktrees/staging-push
# 4. 推送relay-cloud主分支到预发布(触发部署)
cd /data/repos/relay-cloud
git worktree add .worktrees/staging-push main
cd .worktrees/staging-push
git push origin main:staging
cd ..
git worktree remove .worktrees/staging-push
# 5. 监控部署
echo "检查:https://github.com/AgentWorkforce/relay-cloud/actions"
# 等待“Deploy (Staging)”工作流完成
# 验证健康检查通过
# 访问预发布环境:https://agent-relay-staging.fly.dev
故障排除
Worktree错误
错误:“fatal: ‘main’ already exists”
解决方案:git worktree remove .worktrees/staging-push
(如果先前运行的worktree仍然存在)
错误:“fatal: cannot checkout branch into locked working tree”
解决方案:确保主分支未在主要工作树中检出
git status(确认检出的是不同分支)
部署失败
健康检查150秒后超时
问题:预发布环境花费太长时间才变得健康
解决方案:- 检查Fly.io日志:flyctl logs --app agent-relay-staging
- 重启应用:flyctl restart --app agent-relay-staging
- 检查工作流日志中的构建错误
- 查找部署步骤中的启动错误
Docker构建失败
问题:“Build Staging Workspace”作业失败
解决方案:- 检查docker-staging.yml工作流日志
- 验证Dockerfile存在且有效
- 检查资源/依赖问题
- 本地重建以验证docker配置
分支未找到回退到主分支
问题:工作流说“using main”表示您的自定义分支
原因:指定分支在relay/relay-dashboard中不存在
解决方案:- 验证分支名称完全匹配(区分大小写)
- 确保分支存在于远程(git ls-remote origin)
- 使用GitHub Actions workflow_dispatch并输入正确的输入
依赖项与要求
Git: Worktree功能(Git 2.5+,所有现代系统标准)
权限: 对所有三个仓库的推送访问权限:
- github.com:AgentWorkforce/relay
- github.com:AgentWorkforce/relay-dashboard
- github.com:AgentWorkforce/relay-cloud
GitHub密钥(relay-cloud):
CROSS_REPO_TOKEN- 具有跨所有三个仓库访问权限的PATFLY_API_TOKEN或FLY_API_TOKEN_STAGING- Fly.io部署令牌
环境: staging(在relay-cloud中配置)
关键原则: 使用git worktrees进行清洁、隔离的分支操作。跨仓库推送协调,relay-cloud预发布推送触发自动部署。