




















@@ -38,6 +38,19 @@ function requireFirstLane(plan: ReturnType<typeof planFor>) {
3838return lane;
3939}
404041+function summarizeLane(lane: ReturnType<typeof planFor>["lanes"][number]) {
42+return {
43+command: lane.command,
44+imageKind: lane.imageKind,
45+live: lane.live,
46+name: lane.name,
47+resources: lane.resources,
48+ ...(lane.stateScenario ? { stateScenario: lane.stateScenario } : {}),
49+ ...(lane.timeoutMs !== undefined ? { timeoutMs: lane.timeoutMs } : {}),
50+weight: lane.weight,
51+};
52+}
53+4154describe("scripts/lib/docker-e2e-plan", () => {
4255it("plans the full release path against package-backed e2e images", () => {
4356const plan = planFor({
@@ -156,68 +169,117 @@ describe("scripts/lib/docker-e2e-plan", () => {
156169expect(packageInstallAnthropic.lanes.map((lane) => lane.name)).toEqual([
157170"install-e2e-anthropic",
158171]);
159-expect(packageUpdateCore.lanes.map((lane) => lane.name)).toEqual([
160-"npm-onboard-channel-agent",
161-"npm-onboard-discord-channel-agent",
162-"npm-onboard-slack-channel-agent",
163-"doctor-switch",
164-"update-channel-switch",
165-"upgrade-survivor",
166-"published-upgrade-survivor",
167-"update-restart-auth",
172+expect(packageUpdateCore.lanes.map(summarizeLane)).toEqual([
173+{
174+command: "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:npm-onboard-channel-agent",
175+imageKind: "bare",
176+live: false,
177+name: "npm-onboard-channel-agent",
178+resources: ["docker", "npm", "service"],
179+stateScenario: "empty",
180+weight: 3,
181+},
182+{
183+command:
184+"OPENCLAW_NPM_ONBOARD_CHANNEL=discord OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:npm-onboard-channel-agent",
185+imageKind: "bare",
186+live: false,
187+name: "npm-onboard-discord-channel-agent",
188+resources: ["docker", "npm", "service"],
189+stateScenario: "empty",
190+weight: 3,
191+},
192+{
193+command:
194+"OPENCLAW_NPM_ONBOARD_CHANNEL=slack OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:npm-onboard-channel-agent",
195+imageKind: "bare",
196+live: false,
197+name: "npm-onboard-slack-channel-agent",
198+resources: ["docker", "npm", "service"],
199+stateScenario: "empty",
200+weight: 3,
201+},
202+{
203+command: "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:doctor-switch",
204+imageKind: "bare",
205+live: false,
206+name: "doctor-switch",
207+resources: ["docker", "npm"],
208+stateScenario: "empty",
209+weight: 3,
210+},
211+{
212+command: "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:update-channel-switch",
213+imageKind: "bare",
214+live: false,
215+name: "update-channel-switch",
216+resources: ["docker", "npm"],
217+stateScenario: "update-stable",
218+timeoutMs: 1_800_000,
219+weight: 3,
220+},
221+{
222+command: "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:upgrade-survivor",
223+imageKind: "bare",
224+live: false,
225+name: "upgrade-survivor",
226+resources: ["docker", "npm"],
227+stateScenario: "upgrade-survivor",
228+timeoutMs: 1_200_000,
229+weight: 3,
230+},
231+{
232+command: "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:published-upgrade-survivor",
233+imageKind: "bare",
234+live: false,
235+name: "published-upgrade-survivor",
236+resources: ["docker", "npm"],
237+stateScenario: "upgrade-survivor",
238+timeoutMs: 1_500_000,
239+weight: 3,
240+},
241+{
242+command: "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:update-restart-auth",
243+imageKind: "bare",
244+live: false,
245+name: "update-restart-auth",
246+resources: ["docker", "npm"],
247+stateScenario: "upgrade-survivor",
248+timeoutMs: 1_500_000,
249+weight: 3,
250+},
168251]);
169-expect(packageUpdateCore.lanes).toEqual(
170-expect.arrayContaining([
171-expect.objectContaining({
172-name: "npm-onboard-channel-agent",
173-stateScenario: "empty",
174-}),
175-expect.objectContaining({
176-name: "npm-onboard-discord-channel-agent",
177-stateScenario: "empty",
178-}),
179-expect.objectContaining({
180-name: "npm-onboard-slack-channel-agent",
181-stateScenario: "empty",
182-}),
183-expect.objectContaining({
184-name: "doctor-switch",
185-stateScenario: "empty",
186-}),
187-expect.objectContaining({
188-name: "update-channel-switch",
189-stateScenario: "update-stable",
190-}),
191-expect.objectContaining({
192-name: "upgrade-survivor",
193-command: "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:upgrade-survivor",
194-stateScenario: "upgrade-survivor",
195-}),
196-expect.objectContaining({
197-name: "published-upgrade-survivor",
198-stateScenario: "upgrade-survivor",
199-}),
200-expect.objectContaining({
201-name: "update-restart-auth",
202-command: "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:update-restart-auth",
203-stateScenario: "upgrade-survivor",
204-}),
205-]),
206-);
207252expect(pluginsRuntimePlugins.lanes.map((lane) => lane.name)).toEqual(["plugins"]);
208-expect(pluginsRuntimeServices.lanes.map((lane) => lane.name)).toEqual([
209-"cron-mcp-cleanup",
210-"openai-web-search-minimal",
211-"openwebui",
253+expect(pluginsRuntimeServices.lanes.map(summarizeLane)).toEqual([
254+{
255+command: "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:cron-mcp-cleanup",
256+imageKind: "functional",
257+live: false,
258+name: "cron-mcp-cleanup",
259+resources: ["docker", "service", "npm"],
260+stateScenario: "empty",
261+weight: 3,
262+},
263+{
264+command: "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:openai-web-search-minimal",
265+imageKind: "functional",
266+live: false,
267+name: "openai-web-search-minimal",
268+resources: ["docker", "service"],
269+stateScenario: "empty",
270+timeoutMs: 480_000,
271+weight: 2,
272+},
273+{
274+command: "OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:openwebui",
275+imageKind: "functional",
276+live: true,
277+name: "openwebui",
278+resources: ["docker", "live", "live:openai", "service"],
279+timeoutMs: 1_200_000,
280+weight: 5,
281+},
212282]);
213-expect(pluginsRuntimeServices.lanes).toEqual(
214-expect.arrayContaining([
215-expect.objectContaining({
216-name: "cron-mcp-cleanup",
217-stateScenario: "empty",
218-}),
219-]),
220-);
221283expect(pluginsRuntimePlugins.lanes.map((lane) => lane.name)).not.toContain(
222284"bundled-plugin-install-uninstall-0",
223285);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。