# patch-merge-system **Repository Path**: ecky88/patch-merge-system ## Basic Information - **Project Name**: patch-merge-system - **Description**: 这是一个patch-merge-system - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-30 - **Last Updated**: 2026-09-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Patch 合并系统一体化镜像 这是 Patch 合并系统的可运行脚手架。单个 Debian 13(Trixie)镜像包含 Python/FastAPI、Vue.js、PostgreSQL、Codex CLI,以及用于管理非官方模型供应商配置的 CC Switch CLI。 | 组件 | 固定版本 | |---|---:| | Debian | 13 / Trixie(基础镜像滚动补丁已固定 digest) | | Python | 3.14.6 | | FastAPI | 0.139.2 | | Uvicorn | 0.51.0 | | Vue | 3.5.40 | | Vite | 8.1.5 | | Node.js | 26.5.0 | | npm | 12.0.1 | | PostgreSQL | 18.4 | | Codex CLI (`@openai/codex`) | 0.145.0 | | CC Switch CLI | 5.9.3 | 版本于 **2026-07-24** 从官方 PyPI、npm、Docker Hub/PostgreSQL 发布信息和 CC Switch CLI 文档核实。基础镜像同时固定了 tag 和 digest,避免同名 tag 漂移。 ## 端口规划 | 模块 | 容器端口 | Compose 默认宿主机绑定 | |---|---:|---| | FastAPI 后端 | `5555` | `127.0.0.1:5555` | | Vue 前端静态服务 | `5556` | `127.0.0.1:5556` | | PostgreSQL 数据库 | `5557` | `127.0.0.1:5557` | 前端页面从 `5556` 加载,浏览器请求 `5555` 上的后端 API;后端连接容器内 `127.0.0.1:5557` 的 PostgreSQL。CC Switch 是命令行工具,不启动 Web 服务,也不暴露额外端口。 ## 为什么这样组织 用户要求 Python FastAPI、Vue.js、PostgreSQL、Codex CLI 四套环境进入一个 image;Codex CLI 配置需要支持非官方模型供应商 key。因此镜像内同时保留上述运行时,并安装 `cc-switch` CLI 用于配置/切换供应商。 生产环境通常更推荐 PostgreSQL 独立容器/托管数据库,本镜像当前更适合作为开发、验证和封闭部署基线。 Codex CLI 和 CC Switch CLI 安装在镜像中;MVP 的 Web API 只在工单演练时检查 `codex --version` 并生成占位报告,**不会**接收任意 Codex prompt 或执行真实合并命令。API Key、登录凭据、供应商密钥也不会写进镜像。 ## 构建 ```bash docker build -t patch-merge-system:0.2.0 . ``` 网络受限时可以指定包镜像、基础镜像代理或 CC Switch CLI 版本: ```bash docker build -t patch-merge-system:0.2.0 \ --build-arg PIP_INDEX_URL=https://pypi.org/simple \ --build-arg NPM_REGISTRY=https://registry.npmjs.org \ --build-arg CC_SWITCH_CLI_VERSION=5.9.3 \ --build-arg PYTHON_IMAGE=python:3.14.6-slim-trixie@sha256:cea0e6040540fb2b965b6e7fb5ffa00871e632eef63719f0ea54bca189ce14a6 \ --build-arg NODE_IMAGE=node:26.5.0-trixie-slim@sha256:715e55e4b84e4bb0ff48e49b398a848f08e55daed8eb6a0ea1839ae53bc57583 \ --build-arg POSTGRES_IMAGE=postgres:18.4-trixie@sha256:3a82e1f56c8f0f5616a11103ac3d47e632c3938698946a7ad26da0df1334744a \ . ``` 说明:`cc-switch` 使用 `SaladDay/cc-switch-cli` 的 Linux x64 musl release 包安装到 `/usr/local/bin/cc-switch`。它是 CLI/TUI 工具,不是 Web 服务。 ## 启动 ### 本机 Windows 一键启动 推荐双击或在 cmd 中执行显式 Windows 脚本: ```cmd start-patch-merge-system-windows.cmd ``` 兼容旧入口仍可用: ```cmd start-patch-merge-system.cmd ``` 如需强制重新构建镜像,可执行: ```cmd powershell -NoProfile -ExecutionPolicy Bypass -File start-patch-merge-system-windows.ps1 -ForceBuild ``` Windows 脚本会自动完成: 1. 检查 Docker Desktop 是否就绪。 2. 如不存在 `.env`,自动生成本地 PostgreSQL 密码。 3. 构建 `patch-merge-system:0.2.0` 镜像;如果 Docker Hub 网络不可达,会自动尝试基于本机已有的 `patch-merge-system:0.1.2` 做离线升级构建。 4. 创建宿主机工作区目录:`D:\Program Files\QwenPaw\data\workspaces\patch-merge-dev-agent\patch-merge-system-workspace`。 5. 创建 Docker 命名卷 `patch-merge-workspace`,并绑定到上述目录,容器内挂载为 `/workspace`。 6. 在 `patch-merge-workspace` 下自动创建运行子目录:`postgres-data`、`codex-home`、`cc-switch-home`、`repo`、`patches`、`reports`、`runs`。 7. 启动服务并自动打开前端后台。 ### 远程 Ubuntu 服务器一键启动 远程部署服务器使用: ```bash chmod +x start-patch-merge-system-ubuntu.sh ./start-patch-merge-system-ubuntu.sh ``` Ubuntu 脚本默认创建/使用宿主机工作区: ```text /home/gitlab-idata/diskc/services/patch-auto-service/workspace ``` 并创建 external Docker 命名卷: ```text patch-merge-workspace -> /home/gitlab-idata/diskc/services/patch-auto-service/workspace ``` 容器内统一挂载为 `/workspace`。所有运行数据仍位于该工作区的子目录下:`postgres-data`、`codex-home`、`cc-switch-home`、`repo`、`patches`、`reports`、`runs`。 Ubuntu 脚本默认把前端和后端绑定到 `0.0.0.0`,便于远程访问;PostgreSQL 默认只绑定到服务器本机 `127.0.0.1:5557`,不对外暴露数据库。若需要指定公网域名/IP 或额外 CORS 来源,可在启动前设置: ```bash export PATCH_MERGE_PUBLIC_HOST=your.server.domain.or.ip export PATCH_MERGE_EXTRA_CORS_ORIGINS=http://your.server.domain.or.ip:5556 ./start-patch-merge-system-ubuntu.sh ``` 离线部署时,可先在有镜像的机器导出: ```bash docker save patch-merge-system:0.2.0 -o patch-merge-system_0.2.0.tar ``` 上传到服务器后加载并启动: ```bash ./start-patch-merge-system-ubuntu.sh --image-tar ./patch-merge-system_0.2.0.tar ``` 如需手动启动,先在项目目录创建不提交 Git 的 `.env`,至少写入一条强随机密码: ```dotenv POSTGRES_PASSWORD=请替换为强随机密码 ``` 然后确保 `patch-merge-workspace` 命名卷已创建,再启动: ```bash docker compose up -d --build ``` `.gitignore` 已排除 `.env`。不要把真实密码提交到 Git。 访问: - 前端页面: - 后端健康检查: - 后端组件版本: - Swagger UI: - PostgreSQL:`127.0.0.1:5557` 前端管理后台包含: - 信息概览:展示邮箱监听、需求/工单数量、资源关系、执行流水线和最近运行事件。 - 运行看板:查看当前需求清单、编辑人工确认单、转为 Patch 合并工单、执行 Codex CLI dry-run 演练并生成报告。 - 资源调度:维护产品、基线、Gerrit manifest 入口和可编译服务器关系,例如 `ssh://source.idata.com/project/manifests -b MT8791_V_GMS -m custom/MT8791_V_GMS_AGN.xml`。 - 智能体设置:配置需求确认单生成、合并执行、报告生成三个 Codex CLI 参与环节。 - 信使服务:预置企业微信群、企业微信智能机器人、邮件通知三个通道的配置入口。 - 系统设置:配置 Codex CLI 路径、Token Key(不回显)、Patch 工作区、邮箱监听参数。 后端 API 会在首次启动时自动初始化 PostgreSQL 表结构和默认配置。MVP 阶段的邮箱扫描、Codex 合并执行、通知发送先做成可配置入口和状态流转;真实 IMAP 解析、patch 安全校验、隔离工作区 git apply/commit 会在下一迭代补齐。 本地连接数据库示例: ```bash psql -h 127.0.0.1 -p 5557 -U patchmerge -d patchmerge ``` 容器内连接数据库示例: ```bash docker compose exec patch-merge-system psql -h 127.0.0.1 -p 5557 -U patchmerge -d patchmerge ``` ## Codex CLI 与 CC Switch CLI 检查版本: ```bash docker run --rm patch-merge-system:0.2.0 codex --version docker run --rm patch-merge-system:0.2.0 cc-switch --version ``` CC Switch CLI 和 Codex 的持久化目录不再使用独立命名卷,统一放在 `patch-merge-workspace` 下: - CC Switch 配置库:`patch-merge-workspace/cc-switch-home` → 容器内 `CC_SWITCH_CONFIG_DIR=/workspace/cc-switch-home` - Codex live 配置:`patch-merge-workspace/codex-home` → 容器内 `CODEX_HOME=/workspace/codex-home` 查看 Codex 供应商: ```bash docker compose exec --user patchmerge patch-merge-system cc-switch --app codex provider list ``` 进入 CC Switch TUI: ```bash docker compose exec --user patchmerge patch-merge-system cc-switch ``` 切换供应商示例: ```bash docker compose exec --user patchmerge patch-merge-system cc-switch --app codex provider switch ``` 也可以用 CC Switch 临时启动 Codex,不切换全局供应商: ```bash docker compose exec --user patchmerge patch-merge-system cc-switch start codex ``` 不要在 Dockerfile、Compose 文件或 Git 中写入 `OPENAI_API_KEY` 或第三方供应商 key。如果自动化环境必须注入密钥,请使用 Docker/Kubernetes secret。 ## 数据与停止 所有 Patch 合并系统持久化数据只使用一个 Docker 命名卷: - `patch-merge-workspace` external named volume → `D:\Program Files\QwenPaw\data\workspaces\patch-merge-dev-agent\patch-merge-system-workspace` - PostgreSQL 数据:`/workspace/postgres-data/18/docker` - Codex 配置:`/workspace/codex-home` - CC Switch CLI 配置:`/workspace/cc-switch-home` - Patch 隔离工作区/仓库:`/workspace/repo` - Patch、报告、运行产物预留目录:`/workspace/patches`、`/workspace/reports`、`/workspace/runs` - 停止服务:`docker compose down` - `docker compose down -v` 会尝试删除 Compose 管理的 volume;当前 `patch-merge-workspace` 是 external volume,不会被 Compose 自动删除。删除命名卷或宿主机工作区目录都属于破坏性操作,执行前先备份并确认。 ## 当前范围 这一版已经具备 Patch 合并平台的业务骨架:邮箱监听配置入口、模拟 patch 邮件导入、Codex 需求确认单生成占位、人工审核转工单、工单执行演练、报告生成、运行事件、智能体设置、信使服务和系统设置。 仍待后续迭代实现的真实能力包括:IMAP 邮件监听与附件解析、patch 文件持久化与安全校验、隔离工作区/临时分支、`git apply --check`、`git apply --3way`、冲突处理、真实 commit/push、通知实际发送、权限控制、任务队列和回滚。