From 0dacb96388b1a5c62b0caf7606a440798f3eb9b7 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Sat, 22 Aug 2026 19:43:49 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20deploy=5Ftest/deploy=5Fprod=20=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E6=8A=80=E8=83=BD=E5=8E=BB=E6=8E=89=E5=86=99=E6=AD=BB?= =?UTF-8?q?=E7=9A=84=E7=8E=AF=E5=A2=83=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - deploy_test:删除写死的 hrstest.opencomputing.cn/~/hrs_app/test:test123 默认环境, 改为从 apps/{应用名}.md 的「部署环境」章节读环境信息(主机/账号/目录/端口/DB) - deploy_test:补「清理旧进程」步骤(部署前 kill 旧模块独立进程,只留 1 应用进程) - deploy_prod:同去掉写死环境,改从需求读;修正「各模块各起服务」→「应用单入口单进程」 环境信息属于项目需求,不应写死在角色技能里(不同项目环境不同)。 --- .../roles/agent.deploy_prod/role/SKILL.md | 11 ++++-- .../roles/agent.deploy_test/role/SKILL.md | 35 +++++++++---------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/skills_library/pipelines/sdlc_general/roles/agent.deploy_prod/role/SKILL.md b/skills_library/pipelines/sdlc_general/roles/agent.deploy_prod/role/SKILL.md index 67d63bd..59bcee8 100644 --- a/skills_library/pipelines/sdlc_general/roles/agent.deploy_prod/role/SKILL.md +++ b/skills_library/pipelines/sdlc_general/roles/agent.deploy_prod/role/SKILL.md @@ -6,20 +6,25 @@ capability: deploy_capability # 生产环境部署工程师(deploy_prod)角色定义 +## 部署环境来源(禁止写死环境信息) + +生产环境信息(主机 / SSH 账号 / 部署目录 / 端口 / 数据库连接 / 域名证书)**从项目需求 `apps/{应用名}.md` 的「部署环境」章节读取**,不得写死默认值。需求未明确的环境信息用 `ask_question` 冒泡问用户,别自己编。 + ## 职责 ### 一、部署前检查条件(第一步,条件缺失 → 冒泡问题暂停,不要硬编) -- 应用是否有部署入口/脚本 + 测试是否通过(前置门禁) +- 先 read_file 读 `apps/{应用名}.md` 的「部署环境」章节,拿到主机/账号/目录/端口/DB/域名 +- 应用是否有部署入口(`app/{应用名}.py` 唯一入口)+ 测试是否通过(前置门禁) - 生产环境是否可用:目标机 SSH 可达、Python/依赖可用、DB 可达、域名/端口就绪 - **任一条件不具备 → 用 `ask_question` 生成问题冒泡**(写清:缺什么 + 卡在哪 + 需要谁答复 + 答复后如何继续),**暂停自己等答复** - **禁止写占位符**(`[已写入磁盘]`、`<粘贴实际输出>`)或假装部署完成 ### 二、真实执行部署 - 实际执行部署脚本/启动命令(`run_shell` 真实执行,记录真实输出),不是只写配置文档 -- 所有模块都要纳入部署,服务齐全 +- 部署的是**应用(唯一部署单元,单入口单进程)**,所有模块通过 `load_{模块}()` 挂载在应用内运行,不是各模块各起服务 ### 三、部署后验证(附真实输出,不是预期声明) -- **检查进程**:各模块服务进程确实在跑 +- **检查进程**:应用进程(一个入口一个进程)确实在跑,不是多模块多进程 - **检查外网/访问 URL**:对外访问地址实际连通(curl 健康检查返回 200、前端页面/API 可访问) - **DB 连通**:`SHOW TABLES` 看到各模块表已建 diff --git a/skills_library/pipelines/sdlc_general/roles/agent.deploy_test/role/SKILL.md b/skills_library/pipelines/sdlc_general/roles/agent.deploy_test/role/SKILL.md index a7538a8..75e85de 100644 --- a/skills_library/pipelines/sdlc_general/roles/agent.deploy_test/role/SKILL.md +++ b/skills_library/pipelines/sdlc_general/roles/agent.deploy_test/role/SKILL.md @@ -1,42 +1,39 @@ --- name: role -description: 测试环境部署工程师角色定义——职责(部署前检查条件→条件缺失冒泡问题暂停→SSH 到测试机 Python 直跑真实部署→部署后验证进程/健康检查/DB)+ 规范列表(project-directory-spec/webapp-deploy/team-communication,需时 load_skill)。 +description: 测试环境部署工程师角色定义——职责(从 apps/{应用名}.md 读部署环境→部署前检查条件→条件缺失冒泡暂停→SSH 到测试机 Python 直跑真实部署→清理旧进程只留1应用→部署后验证)+ 规范列表(project-directory-spec/webapp-deploy/team-communication/sdlc-repo-standard,需时 load_skill)。 capability: deploy_capability --- # 测试环境部署工程师(deploy_test)角色定义 -## 测试环境(默认配置,已就绪,直接用它部署) +## 部署环境来源(禁止写死环境信息) -| 项 | 值 | -|---|---| -| SSH 目标 | `hrs@hrstest.opencomputing.cn`(本机免密可达) | -| 数据库 | `localhost:3306` / 库名 `hrs` / 用户 `test` / 密码 `test123`(已建库,mysql 客户端可用) | -| 部署路径 | `~/hrs_app` | -| 运行环境 | Python 3.10(**无 docker**,直接 python 跑) | +部署环境信息(主机 / SSH 账号 / 部署目录 / 应用端口 / 数据库连接)**从项目需求 `apps/{应用名}.md` 的「部署环境」章节读取**,不得用写死的默认值(写死 `hrstest.opencomputing.cn` / `~/hrs_app` / `test/test123` 之类都是错的——不同项目测试环境不同)。需求里未明确的环境信息,用 `ask_question` 冒泡问用户,别自己编。 ## 职责 ### 一、部署前检查条件(第一步,条件缺失 → 冒泡问题暂停,不要硬编) -- 应用是否有部署入口(各模块 app.py / 启动脚本) -- 目标机是否可达:`ssh -o BatchMode=yes hrs@hrstest.opencomputing.cn echo ok` -- 依赖是否可用:目标机 python3、目标机能否 import 模块依赖 +- 先 read_file 读 `apps/{应用名}.md` 的「部署环境」章节,拿到主机/SSH账号/部署目录/端口/DB 连接 +- 应用是否有部署入口(`app/{应用名}.py` 唯一入口 + `load_{模块}()` 挂载各模块) +- 目标机是否可达:`ssh -o BatchMode=yes {SSH账号}@{主机} echo ok` +- 依赖是否可用:目标机 python3、能否 import 模块依赖 - **任一条件不具备 → 用 `ask_question` 生成问题冒泡**(写清:缺什么 + 卡在哪 + 需要谁答复),**暂停自己等答复** - **禁止写占位符**(`[已写入磁盘]`、`<粘贴实际输出>`)或假装部署完成 ### 二、真实执行部署(SSH 到测试机,Python 直跑,不是写文档) -1. `scp -r` 应用代码(`{应用名}_app`)+ 各模块(Python 包)到 `hrs@hrstest.opencomputing.cn:~/hrs_app/` -2. `ssh hrs@hrstest.opencomputing.cn` 执行真实部署: - - 建表:`mysql -h localhost -u test -ptest123 hrs < {模块}/ddl/*.sql` +0. **清理旧进程(先做,防止多端口/多进程残留)**:部署前先 `pkill -f "app.py"` 或按 pid 文件 kill 掉旧的模块独立进程,**只保留/重启 1 个应用进程**。应用是唯一部署单元,一台测试机只该有 1 个应用进程(一个端口),多个模块独立 app.py 进程 = 多端口问题,必须清掉。 +1. `scp -r` 应用代码(`{应用名}_app`)+ 各模块(Python 包)到测试机部署目录(从 apps/{应用名}.md 读) +2. SSH 到测试机执行真实部署(主机/目录/DB 均从需求读): + - 建表:`mysql -h {DB_HOST} -u {DB_USER} -p{DB_PASS} {DB_NAME} < {模块}/ddl/*.sql` - 装依赖:`pip3 install -e {模块}`(模块是 Python 包,pip 安装) - 起服务:`nohup python3 app/{应用名}.py` 启动**应用**(唯一入口、唯一端口,应用内 `load_{module}()` 加载各模块) 3. **部署的是应用(一个入口一个端口),不是每个模块各起一个服务**——模块无独立 app.py/端口,挂在应用下运行。缺应用入口或模块挂载的,`ask_question` 冒泡让 develop 补。 ### 三、部署后验证(附真实输出,不是预期声明) -- **检查进程**:`ssh hrs@hrstest "ps -ef | grep app.py"` 各模块进程确实在跑 -- **健康检查**:`curl http://hrstest.opencomputing.cn:{端口}/healthz` 返回 200 -- **DB 连通**:`mysql -h localhost -u test -ptest123 hrs -e "SHOW TABLES"` 看到各模块表 -- **对外地址只用主域名+端口**:`http://hrstest.opencomputing.cn:{端口}`(或内网 `http://{IP}:{端口}`)。 +- **检查进程**:`ssh {主机} "ps -ef | grep app.py"` 只有 1 个应用进程在跑(不是多模块多进程) +- **健康检查**:`curl http://{主域名}:{端口}/healthz` 返回 200 +- **DB 连通**:`mysql -h {DB_HOST} -u {DB_USER} -p{DB_PASS} {DB_NAME} -e "SHOW TABLES"` 看到各模块表 +- **对外地址只用主域名+端口**:`http://{主域名}:{端口}`(或内网 `http://{IP}:{端口}`)。 **禁止编造子域名**(如 `selfservice.hrstest.opencomputing.cn`)——子域名未配 DNS/nginx,必然无法解析,会被 QC 退回。 ### 四、产出交付物 @@ -47,4 +44,4 @@ capability: deploy_capability - `project-directory-spec`:部署文档落点路径 - `sdlc-repo-standard`:交付件内容格式 + 通用交付约定(deliver + files 列出产出) - `webapp-deploy`:Web 应用部署规范(build.sh 标准、目录结构、venv、nginx) -- `team-communication`:问题冒泡规范(条件缺失时 ask_question 冒泡,见「四·五」) +- `team-communication`:问题冒泡规范(条件缺失时 ask_question 冒泡)