如何用Openship API+CI编写完整发布流程:自动化运维脚本实战指南
【免费下载链接】openshipSelf-hosted deployment platform项目地址: https://gitcode.com/GitHub_Trending/ope/openship
Openship是一个开源的自托管部署平台(Self-hosted deployment platform),内置 CI/CD 能力:指向一个代码仓库,它就能自动构建、发布、路由并处理 TLS 证书。本文带你用Openship API + CI编写一套完整的自动化发布流程,从触发部署、轮询状态到失败自动回滚,全部通过运维脚本实现,适合新手快速上手自动化运维。
一、快速了解 Openship:一条命令启动部署平台
Openship 支持三种运行方式,本文的 CI 场景推荐自托管服务器模式(团队 / 需要 push-to-deploy 时使用):
curl -fsSL https://get.openship.io | sh # 安装 CLI(自带 API + 仪表盘) openship up # 以后台服务方式安装并启动在 Linux + Docker 环境下会自动进入Compose 模式,一键拉起 Postgres、Redis、API、仪表盘和 OpenResty 边缘代理(:80/:443),并自动完成域名与 Let's Encrypt TLS。核心概念与安装细节可参考官方文档目录:docs/installation.md。
二、API 鉴权:为 CI 脚本签发 Token
CI 脚本调用 API 的第一步是获得身份凭证。Openship 的 API 挂载在/api路径下,每个路由都声明了权限标签并由安全路由器统一强制执行,你可以直接阅读路由定义了解权限模型:
- 部署路由定义:apps/api/src/modules/deployments/deployment.routes.ts
- Token 模块源码:apps/api/src/modules/tokens/
在 CI 中只需:
- 在仪表盘创建一枚Personal Access Token(PAT);
- 将其存入 CI 的加密变量(如
OPENSHIP_TOKEN); - 脚本中通过
Authorization: Bearer <token>头携带凭证。
💡小贴士:支持项目级作用域的 Token 更适合 CI——只授予目标项目的
deployment:write权限即可,权限最小化是自动化运维的安全底线。
三、核心 API 端点清单:发布流程的“动词”表
编写发布脚本前,先认识这几个关键端点(前缀均为https://<你的Openship地址>/api):
| 用途 | 方法 + 路径 | 说明 |
|---|---|---|
| 🚀 触发部署 | POST /deployments | 传入projectId/branch/commitSha,立即返回deployment_id |
| 📡 实时状态流 | GET /deployments/:id/stream | SSE 推送构建进度与日志 |
| 🔍 查询构建状态 | GET /deployments/:id/build | 当前步骤、各服务状态、是否被阻塞等待决策 |
| ⏸️ 处理阻塞项 | GET /deployments/:id/pending | 端口冲突等阻塞点会列出可执行动作(如free_port) |
| 📝 拉取日志 | GET /deployments/:id/logs | 构建/运行日志 |
| ⏪ 回滚 | POST /deployments/:id/rollback | 回退到指定部署的镜像或提交 |
| 🗑️ 取消 | POST /deployments/:id/cancel | 取消进行中的部署 |
| 💓 健康检查 | GET /api/health | 用于 CI 前置检查平台可用性 |
这些端点的完整实现(含 MCP 描述与权限标注)见:deployment.routes.ts。
四、CI 发布脚本实战:触发 → 轮询 → 回滚
下面是一个最小但完整的生产发布脚本思路(bash + curl),核心是三步状态机:
第 1 步:触发部署
curl -s -X POST "$OPENSHIP_URL/api/deployments" \ -H "Authorization: Bearer $OPENSHIP_TOKEN" \ -H "Content-Type: application/json" \ -d '{"projectId":"<项目ID>","branch":"main"}' # 响应 202:{ "data": { "deployment_id": "xxx", "project_id": "yyy" } }第 2 步:轮询直到终态
每隔几秒调用GET /deployments/:id/build,读取状态与pendingPrompt字段:
pendingPrompt非空 → 部署被阻塞(如端口占用),脚本可从actions[].id读出可选动作并自动应答,避免人工值守;- 状态变为成功 → 发布完成,可继续执行冒烟测试;
- 状态变为失败 → 进入第 3 步。
第 3 步:失败自动回滚
curl -s -X POST "$OPENSHIP_URL/api/deployments/$GOOD_DEPLOY_ID/rollback" \ -H "Authorization: Bearer $OPENSHIP_TOKEN"回滚会优先使用保留的历史镜像(秒级生效),否则从历史提交重建——这个策略可通过GET /:id/restore-plan提前查询:回滚窗口实现。
⚠️注意:不要猜
pendingPrompt的 action id,务必从状态接口返回值中读取,否则部署会在超时后自动放弃。
CLI 也可以直接驱动同一套 API——openship api命令就像gh api一样提供任意路由的鉴权直连,调试脚本时非常好用:
openship api /deployments -X POST -d '{"projectId":"<项目ID>"}'实现见:apps/cli/src/commands/api.ts。
五、进阶:让发布流程更聪明
- 智能路由(Smart Route):只重建自上次部署以来发生变化的服务,后端改动不会重启有状态的前端服务。CLI 侧对应
--smart-route参数:deploy.ts。 - 预览环境:触发部署时传
environment: "preview",分支代码可发布到独立预览环境验证后再进生产。 - Webhook 通知:结合 incoming-webhooks 模块,部署完成后可自动推送通知到你的 IM / 邮件,实现"发布状态零人工查询"。
- 监控与告警:发布脚本建议同时调用 health 模块 做发布前体检,确认平台、边缘代理与数据库均在线再开始发布。
六、总结:你的第一条自动化发布流水线
| 步骤 | 关键动作 | 对应能力 |
|---|---|---|
| 1️⃣ | openship up启动自托管平台 | Compose 模式,自动域名 + TLS |
| 2️⃣ | 仪表盘签发项目级 Token | 权限最小化 |
| 3️⃣ | POST /api/deployments触发发布 | 秒级返回部署 ID |
| 4️⃣ | 轮询/:id/build+ 处理pendingPrompt | 无人值守自动决策 |
| 5️⃣ | 失败时POST /:id/rollback | 镜像秒级回滚 |
| 6️⃣ | Webhook 推送发布结果 | 状态同步到团队 |
这套"触发 → 观察 → 决策 → 回滚"的闭环,就是基于Openship API + CI的完整发布流程。相比自建流水线,你不需要自己维护构建机、镜像仓库和证书续期——把仓库指给它,剩下的交给脚本。想深入了解架构细节,可以阅读 docs/oblien-edge-routing-requirements.md 与监控指南 docs/monitoring.md。
【免费下载链接】openshipSelf-hosted deployment platform项目地址: https://gitcode.com/GitHub_Trending/ope/openship
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考