Docker 测试运行器
Docker 运行器(可选“在 Linux 中可用”检查)¶
这些 Docker 运行器分为两类:
- 实时模型运行器:
test:docker:live-models和test:docker:live-gateway仅在仓库 Docker 镜像内运行与其 profile-key 匹配的 live 文件(src/agents/models.profiles.live.test.ts和src/gateway/gateway-models.profiles.live.test.ts),并挂载你的本地配置目录、工作区以及可选的 profile 环境变量文件。对应的本地入口是test:live:models-profiles和test:live:gateway-profiles。 - Docker 实时运行器在需要时保留自己的实用上限:
test:docker:live-models默认使用经过整理的受支持高信号集合,而test:docker:live-gateway默认为OPENCLAW_LIVE_GATEWAY_SMOKE=1、OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8、OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000以及OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000。当你明确想要更小的上限或更大的扫描范围时,请设置OPENCLAW_LIVE_MAX_MODELS或 gateway 环境变量。 test:docker:all通过test:docker:live-build构建一次 live Docker 镜像,通过scripts/package-openclaw-for-docker.mjs将 OpenClaw 打包一次为 npm tarball,然后构建/复用两个scripts/e2e/Dockerfile镜像。裸镜像仅作为 install/update/plugin-dependency 泳道的 Node/Git 运行器;这些泳道挂载预构建的 tarball。功能镜像将同一个 tarball 安装到/app,用于 built-app 功能泳道。Docker 泳道定义位于scripts/lib/docker-e2e-scenarios.mts;planner 逻辑位于scripts/lib/docker-e2e-plan.mts;scripts/test-docker-all.mjs执行所选计划。聚合使用加权本地调度器:OPENCLAW_DOCKER_ALL_PARALLELISM控制进程槽位,而资源上限可防止重量级 live、npm-install 和多服务泳道同时全部启动。如果单个泳道比当前上限更重,调度器仍可在池为空时启动它,然后让它单独运行,直到容量再次可用。默认值为 10 个槽位、OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9、OPENCLAW_DOCKER_ALL_NPM_LIMIT=5和OPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7;只有当 Docker 主机有更多余量时,才调整OPENCLAW_DOCKER_ALL_WEIGHT_LIMIT或OPENCLAW_DOCKER_ALL_DOCKER_LIMIT(以及其他OPENCLAW_DOCKER_ALL_<RESOURCE>_LIMIT覆盖项)。运行器默认执行 Docker 预检,删除陈旧的 OpenClaw E2E 容器,每 30 秒打印一次状态,将成功泳道的耗时存储在.artifacts/docker-tests/lane-timings.json中,并在后续运行中使用这些耗时优先启动更长的泳道。使用OPENCLAW_DOCKER_ALL_DRY_RUN=1可在不构建或运行 Docker 的情况下打印加权泳道清单,或使用node scripts/test-docker-all.mjs --plan-json打印所选泳道、package/image 需求和凭据的 CI 计划。Package Acceptance是 GitHub 原生的 package 门禁,用于回答“这个可安装 tarball 能否作为产品正常工作?”它会从source=npm、source=ref、source=url、source=trusted-url或source=artifact解析一个候选 package,将其上传为package-under-test,然后针对该确切 tarball 运行可复用的 Docker E2E 泳道,而不是重新打包所选 ref。Profiles 按广度排序:smoke、package、product和full(另有custom用于显式泳道列表)。有关 package/update/plugin 契约、published-upgrade survivor 矩阵、release 默认值和故障分诊,请参阅 测试更新和插件。- 构建和 release 检查会在 tsdown 之后运行
scripts/check-cli-bootstrap-imports.mts。该守卫从dist/entry.js和dist/cli/run-main.js遍历静态构建图,如果该 pre-dispatch bootstrap 图在命令分发之前静态导入了任何外部 package(Commander、prompt UI、undici、logging 以及类似的启动开销较大的依赖都算在内),则失败;它还将打包的 gateway run chunk 限制在 70 KB,并拒绝从该 chunk 静态导入已知的冷 gateway 路径(control-ui-assets、diagnostic-stability-bundle、onboard-helpers、process-respawn、restart-sentinel、server-close、server-reload-handlers)。当前构建通过 tsdown 输出的经哈希校验的元数据定位 gateway chunk,因此发现过程不会扫描dist下无关的 JavaScript。缺失或过期的元数据需要重新构建;受信任的 release 工具仅对早于该定位器的冻结目标保留 source 扫描。独立 worker 仍会接受独立的 JavaScript 依赖检查。scripts/release-check.ts会单独使用--help、onboard --help、doctor --help、status --json --timeout 1、config schema和models list --provider openai对打包后的 CLI 进行 smoke 测试。 - Package Acceptance 强制当前 package 元数据和持久化契约。2026 年 6 月之前的 warning 和 skip 路径已退役;请使用匹配的历史工具来复现那些旧候选的验收结果。
- 容器 smoke 运行器:
test:docker:openwebui、test:docker:onboard、test:docker:npm-onboard-channel-agent、test:docker:release-user-journey、test:docker:release-typed-onboarding、test:docker:release-media-memory、test:docker:release-upgrade-user-journey、test:docker:release-plugin-marketplace、test:docker:skill-install、test:docker:update-channel-switch、test:docker:upgrade-survivor、test:docker:published-upgrade-survivor、test:docker:session-runtime-context、test:docker:agents-delete-shared-workspace、test:docker:gateway-network、test:docker:browser-cdp-snapshot、test:docker:mcp-channels、test:docker:agent-bundle-mcp-tools、test:docker:cron-mcp-cleanup、test:docker:plugins、test:docker:plugin-update、test:docker:plugin-lifecycle-matrix和test:docker:config-reload会启动一个或多个真实容器,并验证更高层的集成路径。 - 通过
scripts/lib/openclaw-e2e-instance.sh安装打包 OpenClaw tarball 的 Docker/Bash E2E 泳道会将npm install限制在OPENCLAW_E2E_NPM_INSTALL_TIMEOUT(默认600s;设置0可禁用 wrapper 以便调试)。 update-channel-switch为其两次 channel-switchopenclaw update运行提供OPENCLAW_E2E_GIT_CHANNEL_TIMEOUT(默认900s),因为它们会在容器内安装依赖并替换 package;其他 CLI 调用保持OPENCLAW_E2E_COMMAND_TIMEOUT默认值300s。
live-model Docker 运行器也会仅绑定挂载所需的 CLI 认证主目录 (当运行未限定时,则挂载所有受支持的),然后在运行前将它们复制到 容器主目录,以便外部 CLI 的 OAuth 能够刷新 token, 而不会修改主机认证存储:
- 直接模型:
pnpm test:docker:live-models(脚本:scripts/test-live-models-docker.sh) - ACP 绑定冒烟测试:
pnpm test:docker:live-acp-bind(脚本:scripts/test-live-acp-bind-docker.sh;默认覆盖 Claude、Codex 和 Gemini,并通过pnpm test:docker:live-acp-bind:droid和pnpm test:docker:live-acp-bind:opencode提供严格的 Droid/OpenCode 覆盖) - CLI 后端冒烟测试:
pnpm test:docker:live-cli-backend(脚本:scripts/test-live-cli-backend-docker.sh) - Codex app-server 测试框架冒烟测试:
pnpm test:docker:live-codex-harness(脚本:scripts/test-live-codex-harness-docker.sh) - Gateway + 开发代理:
pnpm test:docker:live-gateway(脚本:scripts/test-live-gateway-models-docker.sh) - 可观测性冒烟测试:
pnpm qa:otel:smoke、pnpm qa:prometheus:smoke和pnpm qa:observability:smoke是私有 QA 源码检出通道。它们有意不属于包 Docker 发布通道,因为 npm tarball 不包含 QA Lab。 - Open WebUI 实时冒烟测试:
pnpm test:docker:openwebui(脚本:scripts/e2e/openwebui-docker.sh) - 入门向导(TTY、完整脚手架):
pnpm test:docker:onboard(脚本:scripts/e2e/onboard-docker.sh) -
Npm tarball 入门/频道/代理冒烟测试:
pnpm test:docker:npm-onboard-channel-agent在 Docker 中全局安装打包的 OpenClaw tarball,默认通过 env-ref 入门配置 OpenAI 并配置 Telegram,运行 doctor,并运行一次模拟的 OpenAI 代理轮次。使用OPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz复用预构建 tarball,使用OPENCLAW_NPM_ONBOARD_HOST_BUILD=0跳过主机重建,或使用OPENCLAW_NPM_ONBOARD_CHANNEL=discord或OPENCLAW_NPM_ONBOARD_CHANNEL=slack切换频道。 -
发布用户旅程冒烟测试:
pnpm test:docker:release-user-journey在干净的 Docker 主目录中全局安装打包的 OpenClaw tarball,运行入门,配置模拟的 OpenAI 提供商,运行一次代理轮次,安装/卸载外部插件,针对本地 fixture 配置 ClickClack,验证出站/入站消息,重启 Gateway,并运行 doctor。 - 发布类型化入门冒烟测试:
pnpm test:docker:release-typed-onboarding安装打包的 tarball,通过真实 TTY 驱动openclaw onboard,将 OpenAI 配置为 env-ref 提供商,验证没有原始密钥持久化,并运行一次模拟代理轮次。 - 发布媒体/内存冒烟测试:
pnpm test:docker:release-media-memory安装打包的 tarball,验证来自 PNG 附件的图像理解、OpenAI 兼容的图像生成输出、内存搜索召回,以及跨 Gateway 重启的召回存活。 - 发布升级用户旅程冒烟测试:
pnpm test:docker:release-upgrade-user-journey默认安装比候选 tarball 更旧的、最新的已发布稳定基线,在已发布包上运行入门并安装一个 CLI 插件,然后替换包并运行文档中的 Doctor 迁移步骤。它验证现有插件仍然可用,并为代理/频道旅程配置与候选兼容的模拟提供商/ClickClack 设置。如果不存在更旧的稳定基线,则仅当该版本已发布且稳定时复用候选版本;否则失败并要求显式基线。使用OPENCLAW_RELEASE_UPGRADE_BASELINE_SPEC=openclaw@<version>覆盖基线。 - 发布插件市场冒烟测试:
pnpm test:docker:release-plugin-marketplace从本地 fixture 市场安装,更新已安装的插件,卸载它,并验证插件 CLI 消失且安装元数据被清理。 - 技能安装冒烟测试:
pnpm test:docker:skill-install在 Docker 中全局安装打包的 OpenClaw tarball,并在配置中禁用上传的归档安装。在没有非空的OPENCLAW_SKILL_INSTALL_E2E_QUERY、OPENCLAW_SKILL_INSTALL_E2E_SLUG或OPENCLAW_SKILL_INSTALL_E2E_PREFERRED_SLUG覆盖时,它从实时搜索解析受维护的@steipete/gifgrepfixture,安装版本1.0.1,并验证其已审查的SKILL.md字节以及.clawhub来源/锁定元数据中的精确所有者/版本。安全拒绝是终止性的;冒烟测试不会运行该技能或安装其可选工具。任何非空覆盖都会保留自定义选择和现有经过安全检查的回退行为,而不使用受维护的 fixture 固定。 - 更新频道切换冒烟测试:
pnpm test:docker:update-channel-switch在 Docker 中全局安装打包的 OpenClaw tarball,从包stable切换到 gitdev,验证持久化的频道和插件在更新后正常工作,然后切换回包stable并检查更新状态。 - 升级幸存者冒烟测试:
pnpm test:docker:upgrade-survivor在一个包含代理、频道配置、插件允许列表、过期插件依赖状态以及现有工作区/会话文件的脏旧用户 fixture 上安装打包的 OpenClaw tarball。它在没有实时提供商或频道密钥的情况下运行包更新和非交互式 doctor,然后启动一个 loopback Gateway,并检查配置/状态保留以及启动/状态预算。 - 已发布升级幸存者冒烟测试:
pnpm test:docker:published-upgrade-survivor默认安装openclaw@latest,填充逼真的现有用户文件,使用内置命令配方配置该基线,验证生成的配置,将该已发布安装更新到候选 tarball,运行非交互式 doctor,写入.artifacts/upgrade-survivor/summary.json,然后启动一个 loopback Gateway,并检查已配置意图、状态保留、启动、/healthz、/readyz和 RPC 状态预算。使用OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC覆盖一个基线,使用OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS要求聚合调度器展开精确的本地基线,例如openclaw@2026.6.1 openclaw@2026.7.1 openclaw@2026.9.5,并使用OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS展开问题形态的 fixture,例如reported-issues;reported-issues 集合包含configured-plugin-installs,用于自动修复外部 OpenClaw 插件安装。Package Acceptance 将这些暴露为published_upgrade_survivor_baseline、published_upgrade_survivor_baselines和published_upgrade_survivor_scenarios,解析诸如last-stable-4或all-since-2026.6.1之类的元基线 token,并且 Full Release Validation 针对最新稳定基线运行所有reported-issues场景,在扇出前一次性解析为精确包。历史矩阵保持为显式手动覆盖。
Successful published-upgrade runs also include a host-redacted summary.json in the Docker artifacts. The receipt keeps the initial update output and its post-core observation separate from repair and recovery output. Missing initial post-core evidence stays unknown; a passed scenario can include capability-consent recovery.
当已发布的更新器支持无效配置准入时,手动 base 运行也会执行已移除的自定义插件路径。旧版驱动程序(包括 2026.7.2-beta.5 之前的版本和 7 月扩展稳定线)会保持该测试夹具未播种,并记录其未被执行的原因;常规更新、迁移、状态和就绪断言仍会运行。显式 missing-load-path 场景需要兼容的基线。浮动基线标签在测试夹具播种前会再次对照已安装版本进行检查。有关已发布驱动程序的局限性,参见 更新准入。
- 会话运行时上下文冒烟测试:
pnpm test:docker:session-runtime-context验证隐藏运行时上下文转录持久化、Doctor 对受影响重复 prompt-rewrite 分支的修复,以及通过运行已安装包的真实 Gateway 进行自动转录冷存储。小型、带日期的合成历史记录会验证维护 worker、在不重启 Gateway 的情况下更改session.maintenance.coldStorage.afterDays、精确转录恢复、针对缺失归档文件的显式错误、无需再水化的 Activity 列表,以及跨重启和可移植备份恢复的历史保留。 - Bun 全局安装和运行时冒烟测试:
bash scripts/e2e/bun-global-install-smoke.sh会打包当前代码树,在隔离的主目录中使用bun install -g --trust安装它,验证 OpenClaw 的生命周期脚本已运行,并使用 Bun 1.4 或更高版本执行已安装的包。它会检查代表性的 CLI 状态、捆绑的图像提供程序、模拟的本地 agent 回合、Gateway 就绪状态和健康状态,以及通过 Bun 托管 Gateway 的模拟 agent 回合。使用OPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz复用预构建的 tarball,使用OPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0跳过主机构建,或使用OPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local从已构建的 Docker 镜像复制dist/。 - 仅 Bun 运行时冒烟测试(Linux x64):使用
OPENCLAW_BUN_ONLY_SMOKE_PACKAGE_TGZ=/path/to/openclaw-candidate.tgz、BUN_BIN=/path/to/pinned-fork/bun(.github/actions/setup-test-bun/action.yml中固定的 fork)和OPENCLAW_BUN_ONLY_SMOKE_ARTIFACT_DIR=/path/to/artifacts运行bash scripts/e2e/bun-only-runtime-smoke.sh。设置OPENCLAW_BUN_ONLY_SMOKE_HIDE_SYSTEM_NODE=1可在冒烟测试的私有挂载命名空间内使用记录哨兵屏蔽系统 Node;这需要免密sudo、unshare和setpriv。它只影响冒烟测试的进程树,保持主机 Node 不变,并在运行 harness 之前降回调用用户。Node 必须在冒烟测试之前可用,以便准备 payload。然后 harness 会使用文档中记录的 Bun 启动器标记进行一次无 Node 安装尝试;安装失败会使该测试通道失败,而不会使用 Node 重试。如果没有该标志,当真实 Node 仍然可达时,运行时前置条件会失败。 - 安装程序 Docker 冒烟测试:
bash scripts/test-install-sh-docker.sh在其 root、update 和 direct-npm 容器之间共享一个 npm 缓存。更新冒烟测试默认使用 npmlatest作为升级候选 tarball 之前的稳定基线。本地可使用OPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.9.5覆盖,或在 GitHub 上使用 Install Smoke workflow 的update_baseline_version输入覆盖。非 root 安装程序检查会保持隔离的 npm 缓存,以免 root 拥有的缓存条目掩盖用户本地安装行为。设置OPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cache可在本地重复运行之间复用 root/update/direct-npm 缓存。 - Install Smoke CI 使用
OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1跳过重复的 direct-npm 全局更新;当需要直接npm install -g覆盖时,在本地不带该环境变量运行脚本。 - Agents 删除共享工作区 CLI 冒烟测试:
pnpm test:docker:agents-delete-shared-workspace(脚本:scripts/e2e/agents-delete-shared-workspace-docker.sh)默认构建 root Dockerfile 镜像,在隔离的容器主目录中播种两个 agent 和一个工作区,运行agents delete --json,并验证有效 JSON 以及保留工作区行为。使用OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1复用 install-smoke 镜像。 - Gateway 网络与主机生命周期:
pnpm test:docker:gateway-network(脚本:scripts/e2e/gateway-network-docker.sh)保留双容器 LAN WebSocket 认证/健康冒烟测试,然后使用 loopback Admin HTTP 证明 prepare 隔离、保留控制访问、恢复恢复以及已准备的同容器停止/启动。重启检查必须在原始租约过期之前完成,验证挂起状态是进程本地的,而持久化的 Gateway 配置和容器身份仍然存在,并输出机器可读的阶段计时 JSON。 - 浏览器 CDP 快照冒烟测试:
pnpm test:docker:browser-cdp-snapshot(脚本:scripts/e2e/browser-cdp-snapshot-docker.sh)构建源 E2E 镜像以及一个 Chromium 层,使用原始 CDP 启动 Chromium,运行browser doctor --deep,并验证 CDP 角色快照覆盖链接 URL、光标提升的可点击元素、iframe 引用和帧元数据。 - OpenAI Responses web_search 最小推理回归:
pnpm test:docker:openai-web-search-minimal(脚本:scripts/e2e/openai-web-search-minimal-docker.sh)通过 Gateway 运行模拟的 OpenAI 服务器,验证web_search将reasoning.effort从minimal提升到low,然后强制提供程序模式拒绝,并检查原始详细信息出现在 Gateway 日志中。 - OpenAI 聊天工具和归档历史召回:
pnpm test:docker:openai-chat-tools通过 chat-completions 端点验证外部工具调用,然后运行一个实时 agent 回合,其答案需要来自归档转录的 nonce。召回提示省略了 nonce,因此响应证明恢复的历史到达了提供程序。该测试通道需要一个 OpenAI API 密钥。 - MCP 通道桥接(已播种 Gateway + stdio 桥接 + 原始 Claude 通知帧冒烟测试):
pnpm test:docker:mcp-channels(脚本:scripts/e2e/mcp-channels-docker.sh) - OpenClaw 捆绑 MCP 工具(真实 stdio MCP 服务器 + 嵌入式 OpenClaw 配置允许/拒绝冒烟测试):
pnpm test:docker:agent-bundle-mcp-tools(脚本:scripts/e2e/agent-bundle-mcp-tools-docker.sh) - Cron/子 agent MCP 清理(真实 Gateway + 在隔离 cron 和一次性子 agent 运行后对 stdio MCP 子进程进行拆除):
pnpm test:docker:cron-mcp-cleanup(脚本:scripts/e2e/cron-mcp-cleanup-docker.sh) - 插件(针对本地路径、
file:、带有提升依赖的 npm 注册表、格式错误的 npm 包元数据、git 移动引用、ClawHub 测试夹具、市场更新以及 Claude 捆绑启用/检查的安装/更新冒烟测试):pnpm test:docker:plugins(脚本:scripts/e2e/plugins-docker.sh) 设置OPENCLAW_PLUGINS_E2E_CLAWHUB=0可跳过 ClawHub 块。默认情况下,即使设置了 ClawHub URL,它也会使用一个封闭的本地 ClawHub 测试夹具。 要测试实时 ClawHub 包,请设置OPENCLAW_PLUGINS_E2E_LIVE_CLAWHUB=1,并同时提供OPENCLAW_PLUGINS_E2E_CLAWHUB_SPEC(例如,clawhub:publisher/package)和OPENCLAW_PLUGINS_E2E_CLAWHUB_ID(该包的运行时插件 ID)。Kitchen Sink 已下架,不再是实时测试目标;如果实时模式设置缺少这两个值,则以状态 2 退出。 - 插件更新未变更冒烟测试:
pnpm test:docker:plugin-update(脚本:scripts/e2e/plugin-update-unchanged-docker.sh) - 插件生命周期矩阵冒烟测试:
pnpm test:docker:plugin-lifecycle-matrix在裸容器中安装打包的 OpenClaw tarball,安装一个 npm 插件,切换启用/禁用,通过本地 npm 注册表对其进行升级和降级,删除已安装的代码,然后验证卸载仍会移除陈旧状态,同时为每个生命周期阶段记录 RSS/CPU 指标。 - 配置重载元数据冒烟测试:
pnpm test:docker:config-reload(脚本:scripts/e2e/config-reload-source-docker.sh)
完整发布验证(Full Release Validation)在其 stable 与 full 两种 Docker 发布路径 profile 中均包含这两个冷存储用例:session-runtime-context 属于 core,openai-chat-tools 属于 package-update-openai。两者都使用安装于共享功能镜像中的候选包。这些有界用例用于补充存储单元测试,检查打包后的 worker、Gateway 配置与历史请求、文件系统恢复,以及一次真实的 provider 轮次;它们不会在每次发布时重复大规模数据库压力测试。
当更新的工具链验证一个明确授权的、早于冷存储的旧冻结目标时,兼容性预检会将这些冷存储子用例记录为不支持,相关通道会为其报告 NOT RUN。原始检查仍会运行,当前目标始终要求冷存储覆盖。
如需手动预构建并复用共享功能镜像:
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local pnpm test:docker:e2e-build
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:mcp-channels
套件级镜像覆盖变量(如 OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE)一旦设置仍然优先生效。当 OPENCLAW_SKIP_DOCKER_BUILD=1 指向远程共享镜像时,如果该镜像尚未在本地,脚本会拉取它。QR 和安装程序 Docker 测试保留自己的 Dockerfile,因为它们验证的是包/安装行为,而非共享的已构建应用运行时。
live-model Docker 运行器还会以只读方式绑定挂载当前检出(checkout),并将其暂存到容器内的临时工作目录中。这样既能保持运行时镜像精简,又能针对你本地确切的源代码/配置运行 Vitest。暂存步骤会跳过仅存在于本地的大型缓存和应用构建产物,例如 .pnpm-store、.worktrees、__openclaw_vitest__、应用本地的 .build 或 Gradle 输出目录,从而避免 Docker 实时运行花费数分钟复制与机器相关的构件。它们还会设置 OPENCLAW_SKIP_CHANNELS=1,这样 Gateway 实时探测便不会在容器内启动真实的 Telegram/Discord 等渠道 worker。test:docker:live-models 仍然会运行 pnpm test:live,因此当你需要缩小或排除该 Docker 通道中的 Gateway 实时覆盖范围时,也要透传 OPENCLAW_LIVE_GATEWAY_*。
test:docker:openwebui 是一个更高级别的兼容性冒烟测试:它启动一个启用了 OpenAI 兼容 HTTP 端点的 OpenClaw Gateway 容器,再针对该 Gateway 启动一个固定版本的 Open WebUI 容器,通过 Open WebUI 登录,验证 /api/models 暴露了 openclaw/default,然后通过 Open WebUI 的 /api/chat/completions 代理发送一个真实的聊天请求。对于发布路径上的 CI 检查,可设置 OPENWEBUI_SMOKE_MODE=models,使其在 Open WebUI 登录和模型发现之后停止,无需等待实时模型完成回答。首次运行可能会明显更慢,因为 Docker 可能需要拉取 Open WebUI 镜像,而 Open WebUI 也可能需要完成自身的冷启动设置。此通道需要一个可用的 live model 密钥,可通过进程环境、暂存的认证 profile 或显式的 OPENCLAW_PROFILE_FILE 提供。运行成功时会打印一小段 JSON 负载,例如 { "ok": true, "model": "openclaw/default", ... }。
test:docker:mcp-channels 特意保持确定性,且不需要真实的 Telegram、Discord 或 iMessage 账户。它会启动一个带预置数据的 Gateway 容器,再启动第二个容器,并在其中生成 openclaw mcp serve 进程,然后通过真实的 stdio MCP 桥接验证路由会话发现、对话记录读取、附件元数据、实时事件队列行为、出站发送路由,以及 Claude 风格的渠道与权限通知。通知检查会直接检查原始 stdio MCP 帧,因此该冒烟测试验证的是桥接实际发出的内容,而不仅仅是某个特定客户端 SDK 恰好暴露出来的内容。
test:docker:agent-bundle-mcp-tools 是确定性的,不需要 live model 密钥。它会构建仓库的 Docker 镜像,在容器内启动一个真实的 stdio MCP 探测服务器,通过内嵌的 OpenClaw bundle MCP 运行时将该服务器实例化,执行该工具,然后验证 coding 和 messaging 会保留 bundle-mcp 工具,而 minimal 与 tools.deny: ["bundle-mcp"] 会将其过滤掉。
test:docker:cron-mcp-cleanup 是确定性的,不需要 live model 密钥。它会启动一个带有真实 stdio MCP 探测服务器的预置 Gateway,运行一次隔离的 cron 轮次和一次 sessions_spawn 一次性子轮次,然后验证 MCP 子进程在每次运行后都会退出。
手动 ACP 自然语言线程冒烟测试(非 CI):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- 保留此脚本以供回归/调试工作流使用。它将来可能再次用于 ACP 线程路由验证,因此请勿删除。
有用的环境变量:
OPENCLAW_CONFIG_DIR=...(默认:~/.openclaw)挂载到/home/node/.openclawOPENCLAW_WORKSPACE_DIR=...(默认:~/.openclaw/workspace)挂载到/home/node/.openclaw/workspaceOPENCLAW_PROFILE_FILE=...在运行测试前挂载并加载(source)OPENCLAW_DOCKER_PROFILE_ENV_ONLY=1:仅验证从OPENCLAW_PROFILE_FILE加载的环境变量,使用临时 config/workspace 目录,且不挂载外部 CLI 认证OPENCLAW_DOCKER_CLI_TOOLS_DIR=...(默认:~/.cache/openclaw/docker-cli-tools,除非本次运行已使用 CI/托管绑定目录)挂载到/home/node/.npm-global,用于 Docker 内缓存的 CLI 安装$HOME下的外部 CLI 认证目录/文件会以只读方式挂载到/host-auth...,然后在测试开始前复制到/home/node/...- 默认目录(当运行未缩小到特定 provider 时使用):
.factory、.gemini、.minimax - 默认文件:
~/.codex/auth.json、~/.codex/config.toml、.claude.json、~/.claude/.credentials.json、~/.claude/settings.json、~/.claude/settings.local.json - 缩小范围的 provider 运行只会挂载从
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERS推断出的必要目录/文件 - 可通过
OPENCLAW_DOCKER_AUTH_DIRS=all、OPENCLAW_DOCKER_AUTH_DIRS=none或逗号分隔列表(如OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex)手动覆盖 OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=...:用于缩小运行范围OPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=...:用于在容器内过滤 providerOPENCLAW_SKIP_DOCKER_BUILD=1:用于在无需重建的重复运行时复用已有的openclaw:local-live镜像OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1:用于确保凭据来自 profile 存储(而非环境变量)OPENCLAW_OPENWEBUI_MODEL=...:用于选择 Gateway 为 Open WebUI 冒烟测试暴露的模型OPENCLAW_OPENWEBUI_PROMPT=...:用于覆盖 Open WebUI 冒烟测试使用的 nonce 检查 promptOPENWEBUI_IMAGE=...:用于覆盖固定的 Open WebUI 镜像标签
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw