从 AGENTS.md 提取的明细。AGENTS.md 给快速开始,本文给完整命令、开发到发布流程与故障 Runbook。
仓库使用 vendored Grill Skills 与本地 Markdown 事实源,无需安装仓库专用 CLI 或启动 MCP。入口见 docs/agents/workflow.md。
make install # uv sync 安装依赖
make migrate # makemigrations + migrate + 建缓存表
make dev # Uvicorn 启动于 :8011(--reload)
make test # pytest
make test-unit # 仅 unit marker
make test-bdd # 仅 bdd marker
make test-fast # 跳过 slow
make test-app # 指定 app 测试
make celery # Celery worker
make celery-beat # Beat 调度
make start-nats # NATS 监听
make shell # IPython shell_plus
make setup-dev-user # 建 admin/password 超管
make server-init # batch_init 初始化
make collect-static # 收集静态文件
make init-buckets # 初始化 MinIO bucketCMDB 异步导入导出直接使用现有 make celery Worker 的默认队列,另由
make celery-beat 驱动每分钟补发和每日清理;不需要单独的 CMDB Worker。
API、Worker 和 Beat 必须使用相同的数据库、Broker 和对象存储环境配置。
修改任务代码后重启现有 Worker;修改 Beat 配置后也重启 Beat。
持续排队时可运行 uv run celery -A apps.core.celery inspect active_queues --timeout=3,
确认在线 Worker 消费默认队列(默认名为 celery);再检查 inspect registered 中是否包含
apps.cmdb.tasks.transfer.execute_transfer。旧版本投递到 cmdb_transfer 的未超时排队记录,
由每分钟维护补发到默认队列,复用原任务 ID,无需重新提交。不要清空 Broker 队列。
若消费和任务注册正常,再检查全局执行占用(最多 2 个)和同模型导入互斥;中断任务须按
异步导入导出设计 核对执行停止与副作用后解除占用。
默认 threads 池不提供单任务强制终止;15 分钟预算由数据库截止时间、心跳和执行令牌协作检查。
运营分析目录父链发布前检查:
cd server
python manage.py audit_directory_cycles该命令只读列出循环节点,不自动修改存量数据。若发现循环,先备份数据库,再人工把
循环中的一个目录 parent 置空并复跑检查。代码回滚使用 git revert;该修复不含
数据库迁移,回滚代码不会恢复已经拒绝的非法写入。
单测运行:
cd server
uv run pytest apps/monitor/tests/test_x.py -v
uv run pytest apps/monitor/tests/test_x.py::TestClass::test_method -v
uv run pytest -m unit # 按 marker
uv run pytest -m "not slow"编排中心 MVP 后端验证使用独立覆盖率门禁,只统计该 app 生产代码,不把迁移和测试文件算入分母:
cd server
scripts/test_workflow_orchestration.sh该命令覆盖编排中心的 TDD 与 BDD 测试,并强制生产代码行覆盖率不低于 80%。
本地页面验收需要保留数据时,先确认页面查看用户已属于目标团队,再显式写入带 [TDD/BDD] 标记的幂等演示记录:
cd server
uv run python manage.py seed_workflow_orchestration_demo \
--team-id 1 --username admin --domain domain.com --confirm该命令不是 pytest fixture,不会被测试数据库回滚;它会先将当前原子和流程定义注册到 Conductor,成功后才替换同一组演示数据。重复执行只更新同一组流程(含 Word/Excel 巡检)、11 条执行记录和对应操作日志。
本地真实闭环(不伪造成功)需先启动 Conductor 与 Worker,再执行:
CONDUCTOR_BASE_URL=http://127.0.0.1:8091/api \
uv run python manage.py run_workflow_worker
CONDUCTOR_BASE_URL=http://127.0.0.1:8091/api \
uv run python manage.py run_workflow_orchestration_live_acceptance \
--team-id 1 --username admin --domain domain.com \
--report-path ../outputs/workflow-live-acceptance.json依赖缺失(例如作业平台无 responders、通知渠道未配置)时场景会标记 FAILED 并保留原始错误,命令以非零退出码结束。
Wiki Markdown/OKF 导入 ZIP 上限 200MB、解压合计 400MB。反向代理(Nginx client_max_body_size、Next /api/proxy 等)须放行 ≥200MB 请求体,否则浏览器到 Django 的上传会在应用校验前被截断。
pnpm install # 强制 pnpm(only-allow)
pnpm dev # :3000(--turbo)
pnpm build # 生产构建
pnpm lint # ESLint
pnpm type-check
pnpm storybook # :6006cd deploy/apm
make up # 启动契约验证用 Collector/NATS/VictoriaTraces(非生产编排)
make ps # 查看状态
make logs # 跟随日志
make down # 停止夹具
make test # Collector 单元测试
make validate # Compose 与 Collector 配置校验
make contract # 真实 SDK 全链路容器契约生产 Stream/VT/系统 Collector 与流水线由运维落地;验收约束见 deploy/apm/ACCEPTANCE.md。
pnpm dev # :3001
pnpm dev:tauri # Tauri 桌面
pnpm test # Node 核心流程 + Rust 单测
pnpm test:node # 登录、会话与 Tauri 流契约
pnpm test:rust # Tauri Rust 单测
pnpm build # Web 产物
pnpm build:android # Android release
pnpm build:aab # AABcd webchat && npm install && npm run dev|build|test
cd agents/stargazer && make install && make run # Sanic :8083;make lint / make build
cd algorithms/<svc> && make install && make serving # BentoML :3000;uv run pytest- dev
make dev→uvicorn ... --port 8011启动成功 - test
make test→ pytest 退出码 0 - build
docker build -t bklite/server -f support-files/release/Dockerfile .(在server/) - release 容器执行
support-files/release/startup.sh(migrate/createcachetable/collectstatic/supervisord) - 常见失败:
.env缺 DB/NATS/Redis;迁移冲突;依赖安装失败 - 回滚:
git revert/manage.py migrate <app> <target>/ 回退镜像 tag - 本地验证 APM 告警中心事件副本时,
INSTALL_APPS必须同时包含apm、system_mgmt、alerts,并分别启动 API、Celery Worker、Celery Beat 和 NATS Listener。一个本地环境只运行一组 Worker/Beat/Listener;重复进程会造成任务重复领取或 responder 归属不明确,先用pgrep -af 'celery|nats_listener'对账后再排查业务逻辑。
- dev
pnpm dev(:3000)/ testpnpm lint && pnpm type-check/ buildpnpm build(单次准备构建资源后执行next build --turbopack,静默期间每 10 秒输出心跳)/ release 镜像pnpm run start - 常见失败:非 pnpm 被拦;
NEXTAPI_URL配错;Node 版本不一致 - 回滚:
git revert/pnpm clean && pnpm install && pnpm build/ 回退镜像
- dev
pnpm dev/pnpm dev:tauri;buildpnpm build:android/pnpm build:aab;release 由scripts/android-build.mjs+src-tauri/tauri.conf.json生成 - 常见失败:缺
keystore.properties/keystore;Android SDK/NDK/Java 异常;3001 端口冲突
- release:手工触发
.github/workflows/webchat-tests.yml并显式启用publish输入;需NPM_TOKEN/NODE_AUTH_TOKEN - 常见失败:token 缺失/权限不足;Node matrix 18/20 不满足
- dev
make run(sanic ... --port=8083);testmake lint(pre-commit);buildmake build - 常见失败:Server/Worker Redis 配置不一致;
.env缺 NATS/Redis。先起 Worker 再起 Server
- dev
make up→ 本地契约夹具就绪(非生产编排) - test
make test && make validate;全链路契约make contract(需 Docker) - release 运维按 deploy/apm/ACCEPTANCE.md 验收;容量下界见
CAPACITY.md;Server 运行期变量模板见server/support-files/env/.env.apm.example - 常见失败:镜像 tag 不存在;NATS ACL/Stream 漂移;4318 对非受信网络开放;把本地 Compose 参数直接当生产容量
- 回滚:只回退本次上线的区域/系统 Collector、Stream/Consumer 与 VT;不恢复 Edge/APM VM/spanmetrics;编排回退由运维流水线执行
- release:
kubectl apply -f bk-lite-metric-collector.yaml/bk-lite-log-collector.yaml - 验证:
kubectl get pods/ds/deploy -n bk-lite-collector健康 - 常见失败:
secret.env/ca.crt未注入或 NATS 参数错
3. Algorithms 设计约定(补充,真相源 algorithms/DESIGN_GUIDE.md)
- 每个算法服务遵循 classifier 模式 +
ModelRegistry装饰器注册。 - 训练配置由
TrainingConfig驱动;MLflow 做实验追踪。 - 传统 ML(anomaly/timeseries/log/text):最终训练前 合并 train+val。
- 深度学习(image/object_detection):train/val 分离(YOLO 要求)。
| 变量 | 说明 |
|---|---|
DB_ENGINE |
postgresql(默认)/ mysql / sqlite / dameng / gaussdb / goldendb / oceanbase |
DB_NAME/USER/PASSWORD/HOST/PORT |
数据库连接 |
INSTALL_APPS |
逗号分隔的加载 app(空=全加载) |
NEXTAPI_URL |
前端访问后端的 API 地址 |
模板:server/envs/.env.example、server/support-files/env/*.example(APM 使用 .env.apm.example)、web/.env.example、agents/stargazer/.env.example、K8s secret.*.template。
新增 env 走
os.getenv默认值,不改.env.example(易冲突,见团队约定)。
Celery Beat 静态任务对账使用 CELERY_BEAT_SCHEDULE_RECONCILE_MODE,代码默认 shadow(只报告);
确认 shadow 明细后可切为 enforce,仅禁用带有效所有权指纹且退出完整配置快照的任务。回退代码前先切
restore 并重复运行至恢复明细清空。首次上线不会接管无指纹历史任务;确认历史静态名称基线后,先将精确名称
以逗号分隔写入 CELERY_BEAT_SCHEDULE_LEGACY_MANAGED_NAMES 并保持 shadow,再把日志输出的
名称@行指纹 原样写回该配置并切 enforce,仅在行身份未漂移时原子导入并禁用。回滚该次存量导入时保留
同一份 名称@行指纹 清单并切 restore,任务恢复后会释放导入的机器所有权标记。
git pull --ff-only失败 → 先解决分叉/未提交变更。make dev启动失败 → 核对.env的 DB/NATS/Redis。make test因迁移失败 → 先make migrate,再查server/scripts/check_migrate/。web pnpm install被拒 → 必须用 pnpm(only-allow)。web build内存不足 → 参考web/Dockerfile的NODE_OPTIONS,降并发。mobile dev:tauri连不上后端 → 确认tauri.conf.jsondevUrl=3001且后端可达。mobile build:android签名报错 → 补src-tauri/gen/android/keystore.properties与 keystore。webchat publish失败 → 检查NPM_TOKEN、npm 权限与版本冲突。stargazer不接纳采集 → 检查 Redis/NATS 与/api/health/ready;Stargazer 已无独立 ARQ Worker。- K8s 采集器无数据 → 检查
secret.env的CLUSTER_NAME/NATS_*与ca.crt。 - CMDB 推监控「成功但无实例 / ignored」→ 若
.env的NATS_SERVERS指向远端共享集群,本地nats_listener与远端消费者抢同一 queue,请求常被远端旧代码接走并ignored。本地 monorepo 开发在.env设IS_LOCAL_RPC=1(模块间走本进程AppClient),改完后重启make dev(环境变量不随--reload热更新)。