跳转至

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-switch openclaw 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/gifgrep fixture,安装版本 1.0.1,并验证其已审查的 SKILL.md 字节以及 .clawhub 来源/锁定元数据中的精确所有者/版本。安全拒绝是终止性的;冒烟测试不会运行该技能或安装其可选工具。任何非空覆盖都会保留自定义选择和现有经过安全检查的回退行为,而不使用受维护的 fixture 固定。
  • 更新频道切换冒烟测试:pnpm test:docker:update-channel-switch 在 Docker 中全局安装打包的 OpenClaw tarball,从包 stable 切换到 git dev,验证持久化的频道和插件在更新后正常工作,然后切换回包 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 缓存。更新冒烟测试默认使用 npm latest 作为升级候选 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/.openclaw
  • OPENCLAW_WORKSPACE_DIR=...(默认:~/.openclaw/workspace)挂载到 /home/node/.openclaw/workspace
  • OPENCLAW_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=...:用于在容器内过滤 provider
  • OPENCLAW_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 检查 prompt
  • OPENWEBUI_IMAGE=...:用于覆盖固定的 Open WebUI 镜像标签

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw