feat: initialize XAS test console with native execution
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
# ADR 0001:内网免登录入口与固定操作权限
|
||||
|
||||
日期:2026-10-13。状态:已实施。
|
||||
|
||||
用户选择公司内网少数人使用、暂不设置账号。采用 Nginx 来源网段限制和固定操作身份,保留 Rundeck 服务端授权。任务维护继续通过受控源码和服务器维护流程完成。
|
||||
|
||||
仅不发布后端端口,宿主机仍可连接容器 IP 并伪造预认证角色。实际将后端与代理放入同一本项目网络命名空间,后端只监听其回环;代理覆盖所有受信身份头。宿主机 root / Docker 管理者处于信任边界内。
|
||||
|
||||
共享 xas-intranet 身份的代价是无法确定具体操作人。日志只保留来源 IP、方法、路径、状态与大小,不记录查询参数或会话信息。允许网段来自现场网络配置,不开放整个私有地址空间。
|
||||
|
||||
以后需要逐人权限或审计时,再将固定身份替换为真实认证;当前不提前建设账号系统。
|
||||
|
||||
依据:[Rundeck 预认证](https://docs.rundeck.com/docs/administration/security/authentication.html#preauthenticated-mode-using-headers)、[Docker 端口边界](https://docs.docker.com/engine/network/port-publishing/)、[Nginx 访问控制](https://nginx.org/en/docs/http/ngx_http_access_module.html)。
|
||||
@@ -0,0 +1,21 @@
|
||||
# ADR 0002:使用专用脚本管理控制台
|
||||
|
||||
日期:2026-10-13;状态:按用户确认方案实施,替代 Rundeck 作为日常入口。
|
||||
|
||||
## 原因
|
||||
|
||||
用户需要直接上传脚本、查看只读代码、上传新版本、配置执行参数,并在同一页面看到日志、结果和历史。Rundeck 的任务编辑/导入模型与这里的脚本文件管理存在额外映射,继续叠加集成会增加维护成本。
|
||||
|
||||
## 决策
|
||||
|
||||
网页/API 使用 FastAPI,SQLite 保存元数据与状态,文件系统保存不可变上传版本、日志和结果。数据库 `user_version=1` 为新控制台独立结构,不改写旧 H2。Git 保留应用源代码,不作为每次运行的自动拉取来源。
|
||||
|
||||
共享队列单并发,独立宿主 worker 拥有 Docker 管理能力,但没有网络监听入口。网页和任务容器没有 Docker socket、GPU、宿主 PID 或设备。网页需读取原目录的 root/0700 文件,使用容器 UID 0、移除全部 capabilities、只读根文件系统和来源挂载;不改变原目录属主或权限。网页仅绑定内网 IP,通过真实 peer IP、Host、Origin 和自定义请求头限制访问,不信任转发身份/IP头。
|
||||
|
||||
上传代码仍是不可信输入。任务放入受限容器;临时结果目录是宿主项目路径下的 128 MiB tmpfs,归档后卸载。允许的原输出目录可写,原文件不清理;其增长采用运行时软限制,不能当成文件系统硬配额。特定旧脚本认证仅存在专用代理进程内存中,stdin 注入,不修改原脚本或复制认证文件。
|
||||
|
||||
## 兼容和退出条件
|
||||
|
||||
旧容器、H2、日志和备份保留,但旧记录不转换或混入 SQLite。14440 上 `/project/xas-test-library/*` 的浏览器书签跳转到新脚本库;仅为已经发给用户的公开页面链接保留,在团队更新书签后可以移除。没有保留旧 API 或双写路径。
|
||||
|
||||
后续接入 GPU、服务管理脚本、额外依赖、更多输出目录或鉴权,需要单独明确资源和权限范围。当前服务不自动安装依赖,也不从任务容器停止其他维护者服务。
|
||||
@@ -0,0 +1,29 @@
|
||||
# ADR 0003:按实际测试行为组织目录
|
||||
|
||||
日期:2026-10-13。依据用户明确要求:一个测试为一项,一套测试的内部文件不再平铺。
|
||||
|
||||
## 调整原因与领域边界
|
||||
|
||||
原目录将递归发现的 .py/.sh 文件当成测试项目,307 个原位置文件中含辅助模块、套件自身验证、服务管理和历史场景脚本。扩展名只能识别源码文件,不能证明它是一项独立测试。
|
||||
|
||||
现在分为“文件清单”和“测试入口清单”:文件清单保留源码定位、摘要及版本;`catalog/test-definitions.json` 根据实际 README、脚本用途和调用关系,登记测试名称、执行入口、套件/单项类型及相关文件。公开目录和首页数量均来自测试入口清单;扫描新文件不会自动新增测试项目。用户主动上传的单入口脚本仍作为新测试登记。
|
||||
|
||||
本次整理 22 个现有测试入口,加上已接入的轻量模型检查,共 23 项业务测试;其中 8 项套件、15 项单项测试。两个本控制台验收样例默认隐藏,可通过“项目用途 → 验收示例”查看。公司 GPU 套件的 224 个文件归到统一入口,其 148 个内部验证文件不再进入主列表。同类测试的不同来源实现归入相关文件,不因为源文件数量增加重复卡片。
|
||||
|
||||
同一个文件既可以是套件的组成部分,也可以在确有独立测试用途时作为单项入口;这体现不同的测试行为,不为每个辅助文件建立入口。总入口与相应完整测试流程维持原样,不在本轮拼接、改写或实际运行测试链。
|
||||
|
||||
## 数据与执行不变量
|
||||
|
||||
- 原 SQLite schema v1、脚本/版本/运行 ID、历史名称和结果文件均保留。本轮不做数据库结构迁移、回填或历史重写。
|
||||
- 目录是对现有记录的只读整理。第一次显示使用清单中的业务名称;用户保存后的名称/说明优先。后续运行记录保存对应测试名称,执行仍只有原始入口文件。
|
||||
- 详情增加相关文件只读查看;内部文件不能通过旧详情链接或直接 API 被配置/启用/运行。现有记录查询、日志、结果下载与取消仍按原运行 ID 工作。
|
||||
- 未开启 GPU 或服务管理能力;未就绪项目保持待配置。清单不是执行授权,不能据此运行历史脚本中的启停或整机测试步骤。
|
||||
- 所有上传版本和原文件仍按原路径保存,没有批量复制、合并或删除。
|
||||
|
||||
## API 与维护方式
|
||||
|
||||
`GET /api/scripts` 现返回业务测试入口,`include_examples=true` 包含验收示例。原路径保留,条目增加 is_test/test_kind/category/file_count;`GET /api/scripts/{id}/files` 提供只读相关文件。`GET /api/scripts/{id}` 仍可读取内部文件,但 is_test=false;这类文件的修改/运行 API 明确拒绝。summary.scripts/ready 统计业务测试,新增 source_files/examples 说明其他数量。
|
||||
|
||||
维护者新增已有套件时,应先核对真实执行入口与测试目的,再编辑测试入口清单和相关文件映射。不能按目录名、所有 .py 文件或自动 import 扫描结果直接推断测试项目。新来源和新执行环境仍沿用原有权限与部署流程。
|
||||
|
||||
升级采用新镜像替换网页容器,私有 worker 与模型服务不重启。更新前备份原源码、镜像信息、SQLite,并记录历史/源文件摘要;验证失败恢复原网页容器,不回写备份数据库。旧版本可继续读取原 schema v1,应用回退无需数据恢复;数据快照恢复仍须单独确认并保留快照后记录。
|
||||
@@ -0,0 +1,25 @@
|
||||
# ADR 0004:可信原入口复用原环境,上传脚本保持隔离
|
||||
|
||||
日期:2026-10-13;状态:按用户明确授权实施。补充 ADR 0002 的执行边界。
|
||||
|
||||
## 目标与决策
|
||||
|
||||
现有测试依赖宿主 Python、原模型配置、Docker 和交互菜单,统一放进轻量容器无法保持原行为。网页登记固定原入口,参数只允许方案声明的类型和范围;不改原脚本、原配置或素材。`catalog/native-profiles.json` 是管理员维护的可信方案,上传代码不能使用宿主模式。
|
||||
|
||||
网页只负责展示、参数配置、逐次影响确认和记录。宿主 worker 通过私有 0600 Unix socket 校验入口、来源摘要、参数、计划摘要与确认,创建 `adamwen-native-<run_id>.service`。网页没有 Docker socket 或任意命令入口,既有 LAN 访问范围与无账号安排不变。
|
||||
|
||||
服务独立于 HTTP 连接和 worker 生命周期。worker 重启后关联同一服务;未确认结束时保留队列占位,不自动补跑。超时/取消等待本次 cgroup 收尾后释放占位。Docker daemon 或 tmux 分离任务需要另行核对;前后资源快照只是变化证据,不能据此自动删容器或声明恢复模型。当前控制台单并发不能阻止维护者在控制台之外同时运行任务。
|
||||
|
||||
菜单以有控制终端的 PTY 运行,关闭回显,只接收数字选项/列表、y/n/q、空行。禁止控制键和任意命令,避免菜单通道变成宿主终端。需要其他输入的高级维护操作不在本控制台范围内。
|
||||
|
||||
秘密仅在宿主内存读取;标准输出、文件日志及文本归档按已知秘密流式脱敏。输出保留在原处,平台归档新增/变更文件;固定文件名会覆盖历史的容量/成本方案先做本项目私有备份。保留采集/归档上限并显示未归档原因,不把归档当成整个原工作区备份。
|
||||
|
||||
## 数据迁移与恢复
|
||||
|
||||
SQLite 保持 schema v1,仅增加 JSON 配置和运行快照字段。`deploy/native_profiles.py` 对已有 22 个入口做单事务配置迁移,保留 ID、versions 和 runs;拒绝活动任务或并发配置变化。先备份 SQLite 和旧源码,再执行;逐条 before/after 保存在私有迁移清单。隔离生产库副本已验证迁移、幂等及精确配置恢复,历史记录不改变。
|
||||
|
||||
回退必须先停止接单并确认无排队/运行中的 native 服务,再停止 worker,按迁移清单恢复配置以及匹配的旧 worker 源码和网页镜像。若配置有后续修改,恢复工具拒绝覆盖,须人工核对。新运行历史和结果继续保留;应用回退不恢复旧数据库。不可让旧 worker 处理仍活动的新模式任务。
|
||||
|
||||
## 验证范围
|
||||
|
||||
方案接入、只读预检、参数/权限边界、模拟及真实短进程生命周期已验证。原项目的 GPU、长稳和模型切换业务不在本轮实际运行,页面如实提示。后续只有在用户实际发起并确认相应影响时才执行原项目测试。
|
||||
Reference in New Issue
Block a user