You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
8.1 KiB
8.1 KiB
AI开发规范
核心原则
- 优先最小改动
- 优先兼容现有架构
- 优先复用已有能力
- 禁止主动重构
- 禁止引入新基础设施
- 所有改动必须支持回滚
- 所有接口必须向后兼容
- 所有设计必须可灰度发布
- 所有方案必须考虑监控与告警
- 输出必须包含风险分析
技术栈限制
- 不允许新增核心框架
- 不允许替换现有 ORM
- 不允许修改微服务通信协议
- 不允许引入实验性技术
- 优先复用现有组件和基础设施
- 新增依赖必须说明必要性
- 能使用现有 SDK 时禁止重新封装
架构约束
- 本次需求默认属于增量迭代
- 禁止进行系统级重构
- 禁止拆分新微服务
- 禁止引入事件驱动重构
- 禁止新增中间件
- 优先兼容现有DDD边界
- 优先遵循现有模块分层
- 除非需求明确要求,否则不允许进行架构升级
数据库限制
- 禁止删除字段
- 禁止修改历史字段语义
- 禁止破坏向后兼容
- 数据迁移必须可回滚
- 大表禁止全表扫描方案
- 新增索引必须说明影响
- 默认兼容灰度发布
- 不允许跨库事务设计
API设计规范
- API优先向后兼容
- 不允许删除已有字段
- 新增字段必须可选
- 错误码遵循统一规范
- 分页参数统一
- 时间统一使用UTC
- ID统一使用string
- 禁止返回数据库内部字段。
前端约束
- 优先复用现有组件
- 不允许替换UI框架
- 不允许新增全局状态管理
- 禁止重构路由体系
- 样式遵循现有Design System
- 默认兼容移动端
- 不允许引入大型图表库
安全要求
- 所有接口必须鉴权
- 禁止绕过RBAC
- 禁止明文存储敏感信息
- 禁止日志打印token
- 禁止拼接SQL
- 输入必须校验
- 输出必须脱敏
- 新增外部依赖必须经过安全评审
性能要求
- 禁止N+1查询
- 默认分页查询
- 默认异步处理耗时任务
- 禁止循环调用远程接口
- 缓存优先复用现有方案
- 大批量任务必须支持限流
- 接口P99响应时间目标 < 500ms
禁止事项
禁止:
- 大规模重构
- 修改基础框架
- 修改CI/CD
- 修改认证体系
- 修改网关
- 修改数据库主键策略
- 引入新消息队列
- 引入新缓存系统
- 修改公共协议
AI行为约束
- 不要主动重构
- 不要主动升级依赖
- 不要主动优化无关代码
- 不要修改未涉及模块
- 不要假设不存在的问题
- 不要引入未来需求设计
设计方案输出要求
方案必须包含:
- 需求理解
- 影响范围
- 模块改动点
- 数据结构变更
- API变更
- 风险分析
- 回滚方案
- 测试方案
- 灰度方案
- 工时评估
禁止输出纯理论架构设计。
代码生成规则
- 优先修改已有代码
- 禁止重复造轮子
- 优先复用现有service
- 单函数不超过100行
- 禁止过度抽象
- 禁止生成未使用代码
- 必须补充单元测试
设计优先级
优先级从高到低:
- 不破坏线上稳定性
- 向后兼容
- 最小改动
- 复用现有能力
- 快速上线
- 易于回滚
- 可维护性
- 理论最佳实践
Git 提交管理规范
核心原则
AI Agent 可以协助管理 Git 提交,但必须遵守以下原则:
- 不允许自动提交未确认的改动
- 不允许自动 push
- 不允许修改远程分支
- 不允许执行 force push
- 每次提交必须是最小语义单元
- 提交前必须展示 diff 摘要
- 提交信息必须清晰、可追踪
- 禁止把无关改动混入同一次提交
提交流程
- 执行
git status --short,说明改动范围。 - 只处理本次相关 tracked diff,不提交 logs、截图、bundle、临时文件或无关改动。
- 执行本次改动相关的最小必要测试。
- 建议提交拆分方案
- 创建干净 commit进行提交,要求commit message必须清晰、可追踪
但执行 git commit 前,必须确认:
- 改动范围正确
- 没有敏感信息
- 没有调试代码
- 测试已通过或已说明未执行原因
测试服发布规则
测试服发布必须严格遵循:少假设、小发布、强验证、可回滚。
测试服SSH
部署架构
/opt/popiart-canvas ├── current -> 当前线上版本 ├── releases/ │ ├── 20260521104810-6b5c645/ │ ├── 20260520102122-1f2e3d4/ ├── shared/ │ ├── .env │ ├── uploads/ │ ├── logs/
设计原则:
current 永远是软链接 release 永远不可修改 部署必须原子切换 环境变量必须外置 build 必须隔离执行
部署流程
Codex 执行发布时主要流程如下,通过脚本执行:
第一阶段:Build Release
- 测试服只部署指定 commit SHA。
- 部署前记录测试服旧 SHA: "$OLD"。
- 本地针对指定部署 commit SHA代码进行打包,并上传测试服务器
- 测试服创建release:格式为YYYYMMDDHHMMSS-<short_commit>
- 解压源码包到新SHA的release目录
- 复用node_modules,从旧 SHA复制依赖
- 注入环境变量
- 写入版本信息
- Docker隔离build
- Build 成功标记
第二阶段:Smoke Test
- 创建Smoke容器
- 注册Cleanup
- 启动 Smoke 容器
- Smoke Health Check
- 检查日志
- Smoke 成功标记
第三阶段:正式发布
- 从current获取当前版本
- 原子软链接切换
- 重启正式容器
- 正式健康检查
发布后验证
- 当前版本
- 容器版本
特别注意
失败立即回滚旧 SHA。
输出测试服发布报告:
- 发布 SHA:
- 旧 SHA / 回滚点:
- 变更范围:
- 本地测试结果:
- 构建结果:
- 测试服部署结果:
- Smoke test 结果:
- 日志检查结果:
- 未验证项:
- 剩余风险:
- 回滚方式:
部署脚本
完整部署流程通过脚本执行,可根据具体情况调整:
#!/usr/bin/env bash
set -euo pipefail
APP="/opt/popiart-canvas"
IMAGE="docker.m.daocloud.io/library/node:23-alpine"
REV="${1:?Usage: ./deploy-popiart-canvas.sh <git-revision>}"
SHORT="${REV:0:7}"
SRC="/tmp/popiart-canvas-${SHORT}-src.tgz"
OLD="$(readlink -f "$APP/current")"
RELEASE="$APP/releases/$(date +%Y%m%d%H%M%S)-$SHORT"
RELEASE_FILE="/tmp/popiart-canvas-new-release.txt"
SMOKE="popiart-canvas-smoke-$(date +%H%M%S)"
cleanup() {
docker stop "$SMOKE" >/dev/null 2>&1 || true
}
trap cleanup EXIT
echo "Deploy Info:"
echo "- Revision: $REV"
echo "- Old Release: $OLD"
echo "- New Release: $RELEASE"
echo "- Docker Image: $IMAGE"
echo "==> Build release"
test -s "$SRC"
mkdir -p "$RELEASE"
tar -xzf "$SRC" -C "$RELEASE"
cp -al "$OLD/node_modules" "$RELEASE/node_modules"
cp "$APP/shared/.env" "$RELEASE/.env.local"
printf '%s\n' "$REV" > "$RELEASE/REVISION"
docker run --rm \
-v "$RELEASE:/app" \
-w /app \
--env-file "$APP/shared/.env" \
"$IMAGE" \
sh -lc 'npm run build'
echo "$RELEASE" > "$RELEASE_FILE"
echo "BUILD_OK"
echo "==> Smoke test"
docker rm -f "$SMOKE" >/dev/null 2>&1 || true
docker run -d --rm \
--name "$SMOKE" \
-p 127.0.0.1:3101:3000 \
-v "$RELEASE:/app:ro" \
-w /app \
--env-file "$APP/shared/.env" \
"$IMAGE" \
node server.js
sleep 8
curl -fsSI --max-time 10 http://127.0.0.1:3101/ | sed -n '1,8p'
docker logs --tail 20 "$SMOKE"
echo "SMOKE_OK"
echo "==> Switch release"
ln -s "$RELEASE" "$APP/current.new"
mv -Tf "$APP/current.new" "$APP/current"
docker restart popiart-canvas
sleep 8
if curl -fsS --max-time 10 http://127.0.0.1:3100/ > /tmp/popiart-canvas-health.html; then
echo "DEPLOY_HEALTH_OK"
else
echo "DEPLOY_HEALTH_FAILED_ROLLING_BACK"
ln -s "$OLD" "$APP/current.rollback"
mv -Tf "$APP/current.rollback" "$APP/current"
docker restart popiart-canvas
exit 1
fi
echo "==> Verify"
readlink -f "$APP/current"
docker exec popiart-canvas sh -lc '
cat /app/REVISION
test ! -f /app/.env.local && echo NO_ENV_LOCAL_IN_RELEASE || true
'
docker ps \
--filter name=popiart-canvas \
--format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
curl -fsSI --max-time 15 https://wwwtestcanvas.popi.art/ | sed -n '1,8p'
echo "DEPLOY_DONE"
使用方式:
chmod +x deploy-popiart-canvas.sh
./deploy-popiart-canvas.sh "指定发布的 commit SHA"