

























@@ -0,0 +1,228 @@
1+---
2+summary: "How OpenClaw validates update paths, package migrations, and plugin install/update behavior"
3+read_when:
4+ - Changing OpenClaw update, doctor, package acceptance, or plugin install behavior
5+ - Preparing or approving a release candidate
6+ - Debugging package update, plugin dependency cleanup, or plugin install regressions
7+title: "Testing: updates and plugins"
8+sidebarTitle: "Update and plugin tests"
9+---
10+11+This is the dedicated checklist for update and plugin validation. The goal is
12+simple: prove the installable package can update real user state, repair stale
13+legacy state through `doctor`, and still install, load, update, and uninstall
14+plugins from the supported sources.
15+16+For the broader test runner map, see [Testing](/help/testing). For live provider
17+keys and network-touching suites, see [Testing live](/help/testing-live).
18+19+## What we protect
20+21+Update and plugin tests protect these contracts:
22+23+- A package tarball is complete, has a valid `dist/postinstall-inventory.json`,
24+ and does not depend on unpacked repo files.
25+- A user can move from an older published package to the candidate package
26+ without losing config, agents, sessions, workspaces, plugin allowlists, or
27+ channel config.
28+- `openclaw doctor --fix --non-interactive` owns legacy cleanup and repair
29+ paths. Startup should not grow hidden compatibility migrations for stale
30+ plugin state.
31+- Plugin installs work from local directories, git repos, npm packages, and the
32+ ClawHub registry path.
33+- Plugin npm dependencies are installed in the managed npm root, scanned before
34+ trust, and removed through npm during uninstall so hoisted dependencies do not
35+ linger.
36+- Plugin update is stable when nothing changed: install records, resolved source,
37+ and enabled state stay intact.
38+39+## Local proof during development
40+41+Start narrow:
42+43+```bash
44+pnpm changed:lanes --json
45+pnpm check:changed
46+pnpm test:changed
47+```
48+49+For plugin install, uninstall, dependency, or package-inventory changes, also
50+run the focused tests that cover the edited seam:
51+52+```bash
53+pnpm test src/plugins/uninstall.test.ts src/infra/package-dist-inventory.test.ts test/scripts/package-acceptance-workflow.test.ts
54+```
55+56+Before any package Docker lane consumes a tarball, prove the package artifact:
57+58+```bash
59+pnpm release:check
60+```
61+62+`release:check` runs config/docs/API drift checks, writes the package dist
63+inventory, runs `npm pack --dry-run`, rejects forbidden packed files, installs
64+the tarball into a temp prefix, runs postinstall, and smokes bundled channel
65+entrypoints.
66+67+## Docker lanes
68+69+The Docker lanes are the product-level proof. They install or update a real
70+package inside Linux containers and assert behavior through CLI commands,
71+Gateway startup, HTTP probes, RPC status, and filesystem state.
72+73+Use focused lanes while iterating:
74+75+```bash
76+pnpm test:docker:plugins
77+pnpm test:docker:plugin-update
78+pnpm test:docker:upgrade-survivor
79+pnpm test:docker:published-upgrade-survivor
80+```
81+82+Important lanes:
83+84+- `test:docker:plugins` validates plugin install smoke, local folder installs,
85+ local folders with preinstalled dependencies, git installs with package
86+ dependencies, npm package dependency installs, local ClawHub fixture installs,
87+ marketplace update behavior, and Claude-bundle enable/inspect. Set
88+`OPENCLAW_PLUGINS_E2E_CLAWHUB=0` to keep the ClawHub block hermetic/offline.
89+- `test:docker:plugin-update` validates that an unchanged installed plugin does
90+ not reinstall or lose install metadata during `openclaw plugins update`.
91+- `test:docker:upgrade-survivor` installs the candidate tarball over a dirty
92+ old-user fixture, runs package update plus non-interactive doctor, then starts
93+ a loopback Gateway and checks state preservation.
94+- `test:docker:published-upgrade-survivor` first installs a published baseline,
95+ configures it through a baked `openclaw config set` recipe, updates it to the
96+ candidate tarball, runs doctor, checks legacy cleanup, starts the Gateway, and
97+ probes `/healthz`, `/readyz`, and RPC status.
98+99+Useful published-upgrade survivor variants:
100+101+```bash
102+OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC=openclaw@2026.4.23 \
103+OPENCLAW_UPGRADE_SURVIVOR_SCENARIO=versioned-runtime-deps \
104+pnpm test:docker:published-upgrade-survivor
105+106+OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC=openclaw@latest \
107+OPENCLAW_UPGRADE_SURVIVOR_SCENARIO=bootstrap-persona \
108+pnpm test:docker:published-upgrade-survivor
109+```
110+111+Available scenarios are `base`, `feishu-channel`, `bootstrap-persona`,
112+`tilde-log-path`, and `versioned-runtime-deps`. In aggregate runs,
113+`OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues` expands to all reported
114+issue-shaped scenarios.
115+116+## Package Acceptance
117+118+Package Acceptance is the GitHub-native package gate. It resolves one candidate
119+package into a `package-under-test` tarball, records version and SHA-256, then
120+runs reusable Docker E2E lanes against that exact tarball. The workflow harness
121+ref is separate from the package source ref, so current test logic can validate
122+older trusted releases.
123+124+Candidate sources:
125+126+- `source=npm`: validate `openclaw@beta`, `openclaw@latest`, or an exact
127+ published version.
128+- `source=ref`: pack a trusted branch, tag, or commit with the selected current
129+ harness.
130+- `source=url`: validate an HTTPS tarball with required `package_sha256`.
131+- `source=artifact`: reuse a tarball uploaded by another Actions run.
132+133+Release checks call Package Acceptance with the package/update/plugin set:
134+135+```text
136+doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update
137+```
138+139+They also pass:
140+141+```text
142+published_upgrade_survivor_baselines=release-history
143+published_upgrade_survivor_scenarios=reported-issues
144+telegram_mode=mock-openai
145+```
146+147+This keeps package migration, update channel switching, stale plugin dependency
148+cleanup, offline plugin coverage, plugin update behavior, and Telegram package
149+QA on the same resolved artifact.
150+151+Run a package profile manually when validating a candidate before release:
152+153+```bash
154+gh workflow run package-acceptance.yml \
155+ --ref main \
156+ -f workflow_ref=main \
157+ -f source=npm \
158+ -f package_spec=openclaw@beta \
159+ -f suite_profile=package \
160+ -f published_upgrade_survivor_baselines=release-history \
161+ -f published_upgrade_survivor_scenarios=reported-issues \
162+ -f telegram_mode=mock-openai
163+```
164+165+Use `suite_profile=product` when the release question includes MCP channels,
166+cron/subagent cleanup, OpenAI web search, or OpenWebUI. Use `suite_profile=full`
167+only when you need full Docker release-path coverage.
168+169+## Release default
170+171+For release candidates, the default proof stack is:
172+173+1. `pnpm check:changed` and `pnpm test:changed` for source-level regressions.
174+2. `pnpm release:check` for package artifact integrity.
175+3. Package Acceptance `package` profile or the release-check custom package
176+ lanes for install/update/plugin contracts.
177+4. Cross-OS release checks for OS-specific installer, onboarding, and platform
178+ behavior.
179+5. Live suites only when the changed surface touches provider or hosted-service
180+ behavior.
181+182+On maintainer machines, broad gates and Docker/package product proof should run
183+in Testbox unless explicitly doing local proof.
184+185+## Legacy compatibility
186+187+Compatibility leniency is narrow and time boxed:
188+189+- Packages through `2026.4.25`, including `2026.4.25-beta.*`, may tolerate
190+ already-shipped package metadata gaps in Package Acceptance.
191+- The published `2026.4.26` package may warn for local build metadata stamp
192+ files already shipped.
193+- Later packages must satisfy modern contracts. The same gaps fail instead of
194+ warning or skipping.
195+196+Do not add new startup migrations for these old shapes. Add or extend a doctor
197+repair, then prove it with `upgrade-survivor` or `published-upgrade-survivor`.
198+199+## Adding coverage
200+201+When changing update or plugin behavior, add coverage at the lowest layer that
202+can fail for the right reason:
203+204+- Pure path or metadata logic: unit test beside the source.
205+- Package inventory or packed-file behavior: `package-dist-inventory` or tarball
206+ checker test.
207+- CLI install/update behavior: Docker lane assertion or fixture.
208+- Published-release migration behavior: `published-upgrade-survivor` scenario.
209+- Registry/package source behavior: `test:docker:plugins` fixture or ClawHub
210+ fixture server.
211+212+Keep new Docker fixtures hermetic by default. Use local fixture registries and
213+fake packages unless the point of the test is live registry behavior.
214+215+## Failure triage
216+217+Start with the artifact identity:
218+219+- Package Acceptance `resolve_package` summary: source, version, SHA-256, and
220+ artifact name.
221+- Docker artifacts: `.artifacts/docker-tests/**/summary.json`,
222+`failures.json`, lane logs, and rerun commands.
223+- Upgrade survivor summary: `.artifacts/upgrade-survivor/summary.json`,
224+ including baseline version, candidate version, scenario, phase timings, and
225+ recipe steps.
226+227+Prefer rerunning the failed exact lane with the same package artifact over
228+rerunning the whole release umbrella.
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。