本页内容

本页内容

测试和CI

Docker 测试运行者

Docker 运行器(可选的“在 Linux 上可用”检查)

这些 Docker 运行器分成两类:

  • Live-model 运行器: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 live 运行器会在需要时保留各自的实际限制: 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 构建一次实时 Docker 映像,通过 scripts/package-openclaw-for-docker.mjs 将 OpenClaw 打包为 npm tarball,然后将 builds/reuses 打包两次scripts/e2e/Dockerfile 图像。裸图仅是 install/update/plugin-dependency 通道的 Node/Git 跑步者;这些通道安装了预构建的 tarball。功能映像将相同的 tarball 安装到 /app 中,以用于内置应用程序功能通道。 Docker 车道定义位于 scripts/lib/docker-e2e-scenarios.mts 中;规划器逻辑位于 scripts/lib/docker-e2e-plan.mts 中; scripts/test-docker-all.mjs 执行选定的计划。聚合使用加权本地调度程序:OPENCLAW_DOCKER_ALL_PARALLELISM 控制进程槽,而资源上限保持重活,npm- 安装和多服务通道同时启动。如果单个通道比活动上限重,调度程序仍然可以在池空时启动它,然后保持它单独运行,直到容量再次可用。默认为 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 打印选定通道的 CI 计划、package/image 需求和凭证。
  • Package Acceptance 是 GitHub-native 包入口,用于“这个可安装的 tarball 可以作为产品使用吗?”它解析 source=npm、source=ref、source=url、source=trusted-url 或 source=artifact 中的一个候选包,将其上传为 package-under-test,然后针对该确切通道运行可重用的 Docker E2E 通道tarball 而不是重新打包选定的参考。配置文件按宽度排序:smoke、package、product 和 full(加上 custom 以获得显式通道列表)。请参阅 测试更新和插件,了解 package/update/plugin 合约、已发布的升级幸存者矩阵、发布默认值和故障分类。
  • Build 和发布检查在 tsdown 之后运行 scripts/check-cli-bootstrap-imports.mts。如果预调度引导图在命令调度之前静态导入任何外部包(Commander、提示符 UI、undici、日志记录和类似的启动繁重的 deps),则守卫会从 dist/entry.js 和 dist/cli/run-main.js 遍历静态构建的图,并且会失败;它还将捆绑网关运行块限制为 70 KB,并拒绝已知冷网关路径的静态导入(control-ui-assets、diagnostic-stability-bundle、onboard-helpers、process-respawn、restart-sentinel、server-close、 server-reload-handlers) 来自该块。当前版本通过 tsdown 发出的经过哈希检查的元数据来定位网关块,因此发现不会扫描 dist 下不相关的 JavaScript。丢失或陈旧的元数据需要重建;可信发布工具仅保留对定位器之前的冻结目标的源扫描。独立工作线程仍会收到独立的 JavaScript 依赖性检查。 scripts/release-check.ts分别对包装好的CLI和--help、onboard --help、doctor --help、status --json --timeout 1、config schema和models list --provider openai进行冒烟测试。
  • Package Acceptance 强制执行当前包元数据和持久性契约。 2026 年 6 月之前警告和跳过路径已停用;使用匹配的历史工具来重现那些旧候选人的接受结果。
  • 容器 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 会启动一个或多个真实容器,并验证更高层级的集成路径。
  • Docker/Bash E2E 通道,通过 scripts/lib/openclaw-e2e-instance.sh 帽 npm install 在 OPENCLAW_E2E_NPM_INSTALL_TIMEOUT 安装打包的 OpenClaw tarball(默认 600s;设置 0 以禁用用于调试的包装器)。
  • update-channel-switch 给它的两个通道切换 openclaw update 运行 OPENCLAW_E2E_GIT_CHANNEL_TIMEOUT (默认 900s),因为它们安装依赖项并交换容器内的包;其他 CLI 调用保留 OPENCLAW_E2E_COMMAND_TIMEOUT 默认值 300s。

实时模型 Docker 运行器还仅绑定安装所需的 CLI 身份验证主目录(或在运行未缩小范围时所有受支持的身份验证主目录),然后在运行之前将它们复制到容器主目录中,以便 external-CLI OAuth 可以刷新令牌而无需更改主机身份验证存储:

  • 直接模型: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 严格覆盖 Droid/OpenCode和 pnpm test:docker:live-acp-bind:opencode)

  • CLI 后端烟雾:pnpm test:docker:live-cli-backend(脚本:scripts/test-live-cli-backend-docker.sh)

  • Codex 应用程序服务器harness烟雾: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)

  • Observability 冒烟:pnpm qa:otel:smoke、pnpm qa:prometheus:smoke 和 pnpm qa:observability:smoke 是私有 QA 源结帐通道。它们故意不属于软件包 Docker 发布通道,因为 npm tarball 省略了 QA Lab。

  • 打开WebUI直播烟雾:pnpm test:docker:openwebui(脚本:scripts/e2e/openwebui-docker.sh)

  • 载入向导(TTY,完整工作区设置):pnpm test:docker:onboard(脚本:scripts/e2e/onboard-docker.sh)

  • Npm tarball onboarding/channel/agent Smoke:pnpm test:docker:npm-onboard-channel-agent 在 Docker 中全局安装打包的 OpenClaw tarball,通过 env-ref onboarding 加上默认的 Telegram 配置 OpenAI,运行 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提供程序,运行代理轮,installs/uninstalls外部插件,配置ClickClack 针对本地固定装置,验证 outbound/inbound 消息传递,重新启动网关并运行 doctor。

  • Release 输入的载入烟雾:pnpm test:docker:release-typed-onboarding 安装打包的 tarball,通过真正的 TTY 驱动 openclaw onboard,将 OpenAI 配置为 env-ref 提供程序,验证是否没有原始密钥持久性,并运行模拟代理轮次。

  • 发布media/memory烟雾:pnpm test:docker:release-media-memory安装打包的tarball,验证对PNG附件的图像理解,OpenAI-兼容的图像生成输出,内存搜索调用,以及在网关重新启动时调用生存。

  • 发布升级用户旅程烟雾:默认情况下,pnpm test:docker:release-upgrade-user-journey 安装早于候选 tarball 的最新发布的稳定基线,在已发布的软件包上加载并安装 CLI 插件,然后替换该软件包并运行记录的 Doctor 迁移步骤。它验证现有插件是否仍然有效,并为 agent/channel 旅程配置候选兼容的模拟 provider/ClickClack 设置。如果不存在较旧的稳定基线,则仅当候选版本已发布且稳定时,它才会重用该版本;否则它会失败并需要明确的基线。使用 OPENCLAW_RELEASE_UPGRADE_BASELINE_SPEC=openclaw@<version> 覆盖基线。

  • 发布插件市场烟雾:pnpm test:docker:release-plugin-marketplace从本地固定装置市场安装,更新已安装的插件,卸载它,并验证插件CLI消失并删除安装元数据。

  • Skill install Smoke: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 固定装置,安装版本 1.0.1,并验证其审查的 SKILL.md 字节以及确切的 owner/version .clawhub origin/lock 元数据。安全拒绝是终局;烟雾不运行技能或安装其可选工具。任何非空覆盖都会保留自定义选择和现有的安全检查后备行为,而无需维护固定装置引脚。

  • 更新通道切换烟雾:pnpm test:docker:update-channel-switch在Docker中全局安装打包的OpenClaw tarball,从包stable切换到git dev,验证持久通道和插件更新后工作,然后切换回包stable和检查更新状态。

  • 升级幸存者烟雾:pnpm test:docker:upgrade-survivor将打包的OpenClaw tarball安装在肮脏的旧用户固定装置上,其中包含代理、通道配置、插件白名单、过时的插件依赖状态和现有的workspace/session文件。它运行包更新以及没有实时提供商或频道密钥的非交互式医生,然后启动环回网关并检查 config/state 保留以及 startup/status 预算。

  • 发布的升级幸存者烟雾:pnpm test:docker:published-upgrade-survivor默认安装openclaw@latest,播种现实的现有用户文件,使用烘焙命令配方配置该基线,验证生成的配置,更新已发布的安装到候选tarball,运行非交互式医生,写入.artifacts/upgrade-survivor/summary.json,然后启动环回网关并检查配置的意图,状态保存,启动, /healthz、/readyz 和 RPC 状态预算。使用 OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC 覆盖一条基线,要求聚合调度程序使用 OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS 扩展精确的本地基线,例如 [email protected] [email protected] [email protected],并使用 OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS 扩展问题形状的固定装置,例如 reported-issues;报告的问题集包括用于自动外部 OpenClaw 插件安装修复的 configured-plugin-installs。包验收将这些内容公开为 published_upgrade_survivor_baseline、published_upgrade_survivor_baselines 和 published_upgrade_survivor_scenarios,解析元基线标记(例如 last-stable-4 或 all-since-2026.6.1),完整版本验证根据最新的稳定基线运行所有 reported-issues 场景,在扇出之前解析为精确的包。历史矩阵仍然是明确的手动覆盖。

    成功的已发布升级运行还包括 Docker 工件中的主机编辑的 summary.json。收据将初始更新输出及其核心后观察与修复和恢复输出分开。最初的岩心后证据缺失仍然未知;通过的场景可以包括能力同意恢复。

    当已发布的更新程序支持无效配置准入时,手动 base 运行还会执行已删除的自定义插件路径。较旧的驱动程序,包括 2026.7.2-beta.5 之前的版本和 7 月延长稳定线,保留该装置为非种子并记录其未执行的原因;正常的更新、迁移、状态和就绪断言仍然运行。显式 missing-load-path 场景需要兼容的基线。在夹具播种之前,会根据已安装的版本再次检查浮动基线标签。请参阅 更新准入 了解已发布的驱动程序限制。

  • Session 运行时上下文烟雾:pnpm test:docker:session-runtime-context 验证隐藏的运行时上下文副本持久性、受影响的重复提示重写分支的医生修复,以及通过运行已安装软件包的真实网关自动副本冷存储。小型、过时的综合历史记录需要维护人员的锻炼,无需重新启动网关即可对 session.maintenance.coldStorage.afterDays 进行更改,精确的转录恢复,丢失存档文件的显式错误,无需补水的活动列表,以及跨重新启动和便携式备份恢复的历史记录保存。

  • Bun全局安装和运行时烟雾:bash scripts/e2e/bun-global-install-smoke.sh打包当前树,安装它bun install -g --trust在一个孤立的家里,验证OpenClaw的生命周期脚本运行,并执行已安装的包Bun 1.4.3或更新的。它检查代表CLI状态、捆绑图像提供程序、模拟的本地代理轮转、网关准备情况和运行状况以及模拟的代理轮流Bun-托管网关。重用预构建的 tarballOPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz,跳过主机构建OPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0,或复制dist/从建成的Docker图像与OPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local。

  • Bun-only 运行时烟雾 (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 中的叉子)和 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 保持不变,并在运行该工具之前返回到调用用户。 Node必须在冒烟前做好有效载荷的准备。然后,该harness使用记录的 Bun 启动器标记进行一次 Node- 免费安装尝试;安装失败会导致通道失败,而无需使用 Node 重试。如果没有该标志,如果真实的 Node 仍然可达,则运行时前提条件将失败。

  • Installer Docker 烟雾:bash scripts/test-install-sh-docker.sh 在其根、更新和直接 npm 容器之间共享一个 npm 缓存。在升级到候选 tarball 之前,将 Smoke 默认更新为 npm latest 作为稳定基线。在本地使用 OPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.9.5 进行覆盖,或者使用 GitHub 上的安装烟雾工作流程的 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 重复的直接 npm 全局更新;当需要直接覆盖 npm install -g 时,在没有该环境的情况下在本地运行脚本。

  • Agents 删除共享工作区 CLI 烟雾:pnpm test:docker:agents-delete-shared-workspace(脚本:scripts/e2e/agents-delete-shared-workspace-docker.sh)默认构建根 Dockerfile 映像,在隔离的容器主目录中为两个代理和一个工作区播种,运行 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 映像。

  • 网关网络和主机生命周期:pnpm test:docker:gateway-network(脚本:scripts/e2e/gateway-network-docker.sh)保留两个容器LAN WebSocket auth/health烟雾,然后使用环回Admin HTTP来证明准备隔离,保留控制访问,恢复恢复和准备好的相同容器 stop/start. 重新启动检查必须在原始租约到期之前完成,验证挂起状态是进程本地的,同时持久网关配置和容器标识仍然存在,并发出机器可读的阶段计时 JSON。

  • Browser 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 响应 web_search 最小推理回归:pnpm test:docker:openai-web-search-minimal(脚本:scripts/e2e/openai-web-search-minimal-docker.sh)通过网关运行模拟的 OpenAI 服务器,验证 web_search 从 reasoning.effort 引发minimal 到 low,然后强制提供程序架构拒绝并检查网关日志中显示的原始详细信息。

  • OpenAI 聊天工具和存档历史记录调用:pnpm test:docker:openai-chat-tools 通过聊天完成端点验证外部工具调用,然后运行一个实时代理轮次,其答案需要来自存档记录的随机数。召回提示省略了随机数,因此响应证明恢复的历史记录到达了提供者。此通道需要 OpenAI API 密钥。

  • MCP 通道桥(种子网关 + stdio 桥 + 原始 Claude 通知帧烟雾):pnpm test:docker:mcp-channels(脚本:scripts/e2e/mcp-channels-docker.sh)

  • OpenClaw 捆绑包 MCP 工具(真实 stdio MCP 服务器 + 嵌入式 OpenClaw 配置文件 allow/deny 烟雾):pnpm test:docker:agent-bundle-mcp-tools(脚本:scripts/e2e/agent-bundle-mcp-tools-docker.sh)

  • Cron/subagent MCP 清理(独立 cron 和一次性子代理运行后真正的网关 + stdio MCP 子进程拆卸):pnpm test:docker:cron-mcp-cleanup(脚本:scripts/e2e/cron-mcp-cleanup-docker.sh)

  • Plugins(install/update 本地路径冒烟、file:、具有提升依赖项的 npm 注册表、格式错误的 npm 包元数据、git 移动引用、ClawHub 固定装置、市场更新以及Claude-bundle enable/inspect): pnpm test:docker:plugins (脚本: scripts/e2e/plugins-docker.sh) 设置 OPENCLAW_PLUGINS_E2E_CLAWHUB=0 以跳过 ClawHub 块。默认情况下,它使用密封本地 ClawHub 夹具,即使设置了 ClawHub URL 也是如此。要测试实时 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)

  • Plugin 生命周期矩阵烟雾:pnpm test:docker:plugin-lifecycle-matrix 在裸容器中安装打包的 OpenClaw tarball,安装 npm 插件,切换 enable/disable,通过本地 npm 注册表升级和降级,删除已安装的代码,然后验证卸载是否仍删除记录每个生命周期阶段的 RSS/CPU 指标时的过时状态。

  • Config 重新加载元数据烟雾:pnpm test:docker:config-reload(脚本:scripts/e2e/config-reload-source-docker.sh)

完整发布验证在其稳定和完整 Docker 发布路径配置文件中包括冷存储案例:session-runtime-context 属于 core,openai-chat-tools 属于 package-update-openai。两者都使用共享功能映像中安装的候选包。这些有界案例通过检查打包的工作人员、网关配置和历史请求、文件系统恢复以及真正的提供者转向来补充存储单元测试;他们不会在每个版本上重复大型数据库压力活动。

当较新的工具验证了冷存储之前的明确授权的较旧冻结目标时,兼容性预检会将冷子情况记录为不受支持,并且通道会为其报告 NOT RUN。原始检查仍在运行,当前目标始终需要冷存储覆盖。

要手动预构建和重用共享功能映像:

bash
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local pnpm test:docker:e2e-buildOPENCLAW_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,因为它们验证 package/install 行为而不是共享的内置应用程序运行时。

实时模型 Docker 运行程序还将当前结帐只读绑定挂载,并将其暂存到容器内的临时工作目录中。这可以使运行时映像保持苗条,同时仍然针对您的确切本地 source/config. 运行 Vitest 暂存步骤会跳过大型仅本地缓存和应用程序构建输出,例如 .pnpm-store、.worktrees、__openclaw_vitest__ 和应用程序本地 .build 或 Gradle 输出目录,因此 Docker 实时运行不会花费时间分钟复制机器特定的工件。他们还设置了 OPENCLAW_SKIP_CHANNELS=1,以便网关实时检查不会启动容器内真正的 Telegram/Discord/etc. 通道工作人员。 test:docker:live-models 仍运行 pnpm test:live,因此当您需要缩小或排除 Docker 通道中的网关实时覆盖范围时,也请通过 OPENCLAW_LIVE_GATEWAY_*。

test:docker:openwebui 是一个更高级别的兼容性烟雾:它启动一个 OpenClaw 网关容器,并启用 OpenAI- 兼容的 HTTP 端点,启动针对该网关的固定 Open WebUI 容器,通过 Open WebUI 登录,验证 /api/models 公开openclaw/default,然后通过打开WebUI的/api/chat/completions代理发送真实的聊天请求。为发布路径 CI 检查设置 OPENWEBUI_SMOKE_MODE=models,该检查应在 Open WebUI 登录和模型发现后停止,而无需等待实时模型完成。第一次运行可能会明显变慢,因为 Docker 可能需要拉取 Open WebUI 映像,而 Open WebUI 可能需要完成其自己的冷启动设置。该通道需要一个可用的实时模型密钥,通过流程环境、分阶段身份验证配置文件或显式 OPENCLAW_PROFILE_FILE 提供。成功的运行会打印一个小的 JSON 有效负载,例如 { "ok": true, "model": "openclaw/default", ... }。

test:docker:mcp-channels 使用固定响应,不需要真实的 Telegram、Discord 或 iMessage 帐户。它启动一个种子网关容器,启动第二个容器来生成 openclaw mcp serve,然后通过真实的 stdio MCP 桥验证路由对话发现、转录读取、附件元数据、实时事件队列行为、出站发送路由和 Claude-style 通道 + 权限通知。通知检查直接检查原始 stdio MCP 帧,以便烟雾验证桥实际发出的内容,而不仅仅是特定客户端 SDK 碰巧出现的内容。

test:docker:agent-bundle-mcp-tools 使用固定响应,不需要实时模型密钥。它构建存储库 Docker 映像,在容器内启动真正的 stdio MCP 检查服务器,通过嵌入式 OpenClaw 捆绑包 MCP 运行时具体化该服务器,执行该工具,然后验证 coding 和 messaging 保留 bundle-mcp 工具而 minimal 和 tools.deny: ["bundle-mcp"] 则对其进行过滤。

test:docker:cron-mcp-cleanup 使用固定响应,不需要实时模型密钥。它使用真实的 stdio MCP 检查服务器启动种子网关,运行隔离的 cron 轮次和 sessions_spawn 一次性子轮次,然后验证 MCP 子进程在每次运行后退出。

手动 ACP 纯语言线程 smoke(非 CI):

  • bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...
  • 为 regression/debug 工作流程保留此脚本。 ACP 线程路由验证可能会再次需要它,所以不要删除它。

有用的环境变量:

  • OPENCLAW_CONFIG_DIR=...(默认:~/.openclaw),挂载到 /home/node/.openclaw
  • OPENCLAW_WORKSPACE_DIR=...(默认:~/.openclaw/workspace),挂载到 /home/node/.openclaw/workspace
  • OPENCLAW_PROFILE_FILE=...,在运行测试前挂载并加载
  • OPENCLAW_DOCKER_PROFILE_ENV_ONLY=1 仅验证源自 OPENCLAW_PROFILE_FILE 的环境变量,使用临时 config/workspace 目录且无外部 CLI 身份验证安装
  • OPENCLAW_DOCKER_CLI_TOOLS_DIR=...(默认:~/.cache/openclaw/docker-cli-tools,除非运行已使用 CI/managed 绑定目录)安装到 /home/node/.npm-global,以便缓存的 CLI 安装在 Docker 内
  • 外部CLI auth $HOME下的dirs/files以只读方式安装在/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
    • Narrowed 提供程序仅运行安装从 OPENCLAW_LIVE_PROVIDERS / OPENCLAW_LIVE_GATEWAY_PROVIDERS 推断出的所需 dirs/files
    • 使用 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 要求凭据来自配置文件存储(不是 env)
  • OPENCLAW_OPENWEBUI_MODEL=...,用于选择由 gateway 暴露给 Open WebUI smoke 的模型
  • OPENCLAW_OPENWEBUI_PROMPT=...,用于覆盖 Open WebUI smoke 使用的 nonce 检查提示词
  • OPENWEBUI_IMAGE=...,用于覆盖固定版本的 Open WebUI 镜像标签
本页有帮助吗?