Testing
Тестирование: обновления и plugins
Это специализированный контрольный список для проверки обновлений и Plugin. Цель
простая: доказать, что устанавливаемый пакет может обновлять реальное состояние
пользователя, исправлять устаревшее legacy-состояние через doctor и по-прежнему
устанавливать, загружать, обновлять и удалять Plugin из поддерживаемых источников.
Для более общей карты средств запуска тестов см. Тестирование. Для ключей live-провайдеров и наборов тестов, обращающихся к сети, см. Live-тестирование.
Что мы защищаем
Тесты обновлений и Plugin защищают эти контракты:
- Архив пакета полон, содержит допустимый
dist/postinstall-inventory.jsonи не зависит от распакованных файлов репозитория. - Пользователь может перейти со старого опубликованного пакета на пакет-кандидат без потери конфигурации, агентов, сеансов, рабочих пространств, allowlist-списков Plugin или конфигурации каналов.
openclaw doctor --fix --non-interactiveвладеет путями очистки и исправления legacy-состояния. Запуск не должен обрастать скрытыми миграциями совместимости для устаревшего состояния Plugin.- Установки Plugin работают из локальных каталогов, git-репозиториев, npm-пакетов и пути реестра ClawHub.
- npm-зависимости Plugin устанавливаются в один управляемый npm-проект на Plugin, сканируются до доверия и удаляются через npm при удалении, чтобы поднятые зависимости не оставались.
- Обновление Plugin стабильно, когда ничего не изменилось: записи установки, разрешенный источник, схема установленных зависимостей и включенное состояние остаются неизменными.
Локальное доказательство во время разработки
Начинайте узко:
pnpm changed:lanes --jsonpnpm check:changedpnpm test:changedДля изменений установки, удаления, зависимостей или инвентаря пакета Plugin также запустите сфокусированные тесты, покрывающие отредактированный шов:
pnpm test src/plugins/uninstall.test.ts src/infra/package-dist-inventory.test.ts test/scripts/package-acceptance-workflow.test.tsПеред тем как любой Docker-канал пакета использует архив, докажите артефакт пакета:
pnpm release:checkrelease:check запускает проверки расхождения конфигурации/документации/API, записывает dist-инвентарь
пакета, запускает npm pack --dry-run, отклоняет запрещенные упакованные файлы, устанавливает
архив во временный префикс, запускает postinstall и проверяет smoke-тестами entrypoint-ы
встроенных каналов.
Docker-каналы
Docker-каналы являются доказательством на уровне продукта. Они устанавливают или обновляют реальный пакет внутри Linux-контейнеров и проверяют поведение через команды CLI, запуск Gateway, HTTP-зонды, статус RPC и состояние файловой системы.
Используйте сфокусированные каналы во время итераций:
pnpm test:docker:pluginspnpm test:docker:plugin-lifecycle-matrixpnpm test:docker:plugin-updatepnpm test:docker:upgrade-survivorpnpm test:docker:published-upgrade-survivorpnpm test:docker:update-restart-authpnpm test:docker:update-migrationВажные каналы:
test:docker:pluginsпроверяет smoke-тест установки Plugin, установки из локальной папки, поведение пропуска обновления локальной папки, локальные папки с предварительно установленными зависимостями, установки пакетовfile:, git-установки с выполнением CLI, обновления движущейся git-ссылки, установки из npm-реестра с поднятыми транзитивными зависимостями, no-op обновления npm, отклонение некорректных метаданных npm-пакета, установки из локальной фикстуры ClawHub и no-op обновления, поведение обновления marketplace, а также включение/инспекцию Claude-бандла. УстановитеOPENCLAW_PLUGINS_E2E_CLAWHUB=0, чтобы держать блок ClawHub герметичным/офлайн.test:docker:plugin-lifecycle-matrixустанавливает пакет-кандидат в пустой контейнер, прогоняет npm Plugin через установку, инспекцию, отключение, включение, явное обновление, явный откат версии и удаление после удаления кода Plugin. Он логирует метрики RSS и CPU для каждой фазы.test:docker:plugin-updateпроверяет, что неизмененный установленный Plugin не переустанавливается и не теряет метаданные установки во времяopenclaw plugins update.test:docker:upgrade-survivorустанавливает архив-кандидат поверх загрязненной фикстуры старого пользователя, запускает обновление пакета плюс неинтерактивный doctor, затем запускает loopback Gateway и проверяет сохранение состояния.test:docker:published-upgrade-survivorсначала устанавливает опубликованную базовую версию, настраивает ее через встроенный рецептopenclaw config set, обновляет ее до архива-кандидата, запускает doctor, проверяет legacy-очистку, запускает Gateway и зондирует/healthz,/readyzи статус RPC.test:docker:update-restart-authустанавливает пакет-кандидат, запускает управляемый Gateway с token-auth, снимает env аутентификации gateway вызывающей стороны дляopenclaw update --yes --jsonи требует, чтобы команда обновления кандидата перезапустила Gateway перед обычными зондами.test:docker:update-migration— опубликованный update-канал с большим объемом очистки. Он начинает с настроенного пользовательского состояния в стиле Discord/Telegram, запускает baseline doctor, чтобы настроенные зависимости Plugin получили шанс материализоваться, подсевает legacy-мусор зависимостей Plugin для настроенного упакованного Plugin, обновляет до архива-кандидата и требует, чтобы post-update doctor удалил legacy корни зависимостей.
Полезные варианты published-upgrade survivor:
OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC=openclaw@2026.4.23 \OPENCLAW_UPGRADE_SURVIVOR_SCENARIO=versioned-runtime-deps \pnpm test:docker:published-upgrade-survivor OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC=openclaw@latest \OPENCLAW_UPGRADE_SURVIVOR_SCENARIO=bootstrap-persona \pnpm test:docker:published-upgrade-survivorДоступные сценарии: base, feishu-channel, bootstrap-persona,
plugin-deps-cleanup, configured-plugin-installs,
stale-source-plugin-shadow, tilde-log-path и versioned-runtime-deps. В агрегированных запусках
OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues раскрывается во все сценарии
по форме зарегистрированных issues, включая миграцию установки configured-plugin.
Полная миграция обновления намеренно отделена от Full Release CI. Используйте
ручной workflow Update Migration, когда релизный вопрос звучит так: «может ли каждый
опубликованный стабильный релиз начиная с 2026.4.23 обновиться до этого кандидата и
очистить мусор зависимостей Plugin?»:
gh workflow run update-migration.yml \ --ref main \ -f workflow_ref=main \ -f package_ref=main \ -f baselines=all-since-2026.4.23 \ -f scenarios=plugin-deps-cleanupPackage Acceptance
Package Acceptance — это нативный для GitHub пакетный gate. Он разрешает один пакет-кандидат
в архив package-under-test, записывает версию и SHA-256, затем
запускает переиспользуемые Docker E2E-каналы против именно этого архива. Ref harness
отделен от ref источника пакета, поэтому текущая тестовая логика может проверять
более старые доверенные релизы.
Источники кандидатов:
source=npm: проверитьopenclaw@beta,openclaw@latestили точную опубликованную версию.source=ref: упаковать доверенную ветку, тег или коммит с выбранным текущим harness.source=url: проверить публичный HTTPS-архив с обязательнымpackage_sha256. Этот путь отклоняет учетные данные URL, нестандартные HTTPS-порты, частные/внутренние имена хостов или DNS/IP-результаты, IP-пространство special-use и небезопасные redirects.source=trusted-url: проверить HTTPS-архив с обязательнымиpackage_sha256иtrusted_source_idпо maintainer-owned политике в.github/package-trusted-sources.json. Используйте это для enterprise/private зеркал вместо ослабленияsource=urlчерез input-level allow-private switch. Bearer auth, когда настроен политикой, использует фиксированный секретOPENCLAW_TRUSTED_PACKAGE_TOKEN.source=artifact: переиспользовать архив, загруженный другим запуском Actions.
Full Release Validation по умолчанию использует source=artifact, построенный из
разрешенного release SHA. Для доказательства после публикации передайте
package_acceptance_package_spec=openclaw@YYYY.M.PATCH, чтобы та же матрица обновлений
целилась вместо этого в отгруженный npm-пакет.
Release checks вызывают Package Acceptance с набором package/update/restart/plugin:
doctor-switch update-channel-switch update-corrupt-plugin upgrade-survivor published-upgrade-survivor update-restart-auth plugins-offline plugin-updateКогда включен release soak, они также передают:
published_upgrade_survivor_baselines=last-stable-4 2026.4.23 2026.5.2 2026.4.15published_upgrade_survivor_scenarios=reported-issuestelegram_mode=mock-openaiЭто удерживает миграцию пакета, переключение канала обновления, устойчивость к поврежденному managed-plugin, очистку устаревших зависимостей Plugin, офлайн-покрытие Plugin, поведение обновления Plugin и пакетную QA Telegram на одном разрешенном артефакте, не заставляя стандартный пакетный gate релиза проходить каждый опубликованный релиз.
last-stable-4 разрешается в четыре последних стабильных npm-опубликованных релиза OpenClaw.
Release package acceptance закрепляет 2026.4.23 как первую границу совместимости plugin-update,
2026.5.2 как границу churn архитектуры Plugin, а
2026.4.15 как более старую baseline-версию published-update из 2026.4.1x; resolver
дедуплицирует pins, которые уже входят в последние четыре. Для исчерпывающего покрытия
миграции опубликованных обновлений используйте all-since-2026.4.23 в отдельном workflow Update
Migration вместо Full Release CI. release-history остается
доступным для ручной более широкой выборки, когда вам также нужна legacy-якорная дата
до этой границы.
Когда выбрано несколько baseline-версий published-upgrade survivor, переиспользуемый Docker workflow шардирует каждую baseline-версию в отдельную целевую runner job. Каждый baseline shard все еще запускает выбранный набор сценариев, но логи и артефакты остаются по baseline, а wall time ограничивается самым медленным shard вместо одной большой последовательной job.
Запустите профиль пакета вручную при проверке кандидата перед релизом:
gh workflow run package-acceptance.yml \ --ref main \ -f workflow_ref=main \ -f source=npm \ -f package_spec=openclaw@beta \ -f suite_profile=package \ -f published_upgrade_survivor_baselines="last-stable-4 2026.4.23 2026.5.2 2026.4.15" \ -f published_upgrade_survivor_scenarios=reported-issues \ -f telegram_mode=mock-openaiИспользуйте suite_profile=product, когда релизный вопрос включает MCP-каналы,
очистку cron/subagent, веб-поиск OpenAI или OpenWebUI. Используйте suite_profile=full
только когда вам нужно полное Docker-покрытие release-path.
Стандарт релиза
Для релиз-кандидатов стандартный стек доказательств таков:
pnpm check:changedиpnpm test:changedдля регрессий на уровне исходного кода.pnpm release:checkдля целостности артефакта пакета.- Профиль Package Acceptance
packageили пользовательские package-каналы release-check для контрактов install/update/restart/plugin. - Кросс-OS release checks для OS-специфичного установщика, onboarding и поведения платформы.
- Live-наборы только когда измененная поверхность затрагивает поведение провайдера или hosted-service.
На машинах maintainer широкие gates и Docker/package доказательство продукта должны запускаться в Testbox, если явно не выполняется локальное доказательство.
Legacy-совместимость
Послабления совместимости узкие и ограничены по времени:
- Пакеты до
2026.4.25включительно, включая2026.4.25-beta.*, могут терпимо относиться к уже отгруженным пробелам в метаданных пакета в Package Acceptance. - Опубликованный пакет
2026.4.26может предупреждать о локальных build metadata stamp файлах, которые уже были отгружены. - Более поздние пакеты должны удовлетворять современным контрактам. Те же пробелы приводят к сбою вместо предупреждения или пропуска.
Не добавляйте новые startup migrations для этих старых форм. Добавьте или расширьте исправление doctor,
затем докажите его с помощью upgrade-survivor, published-upgrade-survivor или
update-restart-auth, когда команда обновления владеет перезапуском.
Добавление покрытия
При изменении поведения обновления или Plugin добавляйте покрытие на самом низком слое, который может отказать по правильной причине:
- Чистая логика путей или метаданных: модульный тест рядом с исходным кодом.
- Поведение инвентаря пакета или упакованных файлов: тест
package-dist-inventoryили проверка tarball. - Поведение установки/обновления CLI: проверка Docker lane или фикстура.
- Поведение миграции опубликованного релиза: сценарий
published-upgrade-survivor. - Поведение перезапуска, принадлежащее обновлению:
update-restart-auth. - Поведение источника реестра/пакета: фикстура
test:docker:pluginsили сервер фикстур ClawHub. - Поведение компоновки зависимостей или очистки: проверяйте как выполнение в runtime, так и границу файловой системы. npm-зависимости могут быть подняты внутрь управляемого npm-проекта Plugin, поэтому тесты должны доказывать, что сканируется/очищается именно этот проект, а не предполагать только дерево
node_modules, локальное для пакета Plugin.
По умолчанию держите новые Docker-фикстуры герметичными. Используйте локальные реестры фикстур и поддельные пакеты, если только цель теста не состоит в проверке поведения живого реестра.
Разбор сбоев
Начните с идентичности артефакта:
- Сводка Package Acceptance
resolve_package: источник, версия, SHA-256 и имя артефакта. - Docker-артефакты:
.artifacts/docker-tests/**/summary.json,failures.json, логи lane и команды повторного запуска. - Сводка upgrade survivor:
.artifacts/upgrade-survivor/summary.json, включая базовую версию, версию-кандидат, сценарий, тайминги фаз и шаги рецепта.
Предпочитайте повторный запуск той же самой упавшей lane с тем же артефактом пакета, а не повторный запуск всего релизного зонта.