Testing
الاختبار: التحديثات وPlugins
هذه هي قائمة التحقق المخصصة للتحقق من التحديثات وPlugin. الهدف
بسيط: إثبات أن الحزمة القابلة للتثبيت يمكنها تحديث حالة المستخدم الحقيقية، وإصلاح
الحالة القديمة المتقادمة عبر doctor، وما زالت تستطيع تثبيت وتحميل وتحديث وإلغاء تثبيت
plugins من المصادر المدعومة.
لخريطة مشغل الاختبارات الأوسع، راجع الاختبار. لمفاتيح المزوّد الحية والحزم التي تلامس الشبكة، راجع الاختبار الحي.
ما نحميه
تحمي اختبارات التحديث وPlugin هذه العقود:
- ملف tarball الخاص بالحزمة مكتمل، ويحتوي على
dist/postinstall-inventory.jsonصالح، ولا يعتمد على ملفات مستودع غير مفكوكة. - يمكن للمستخدم الانتقال من حزمة منشورة أقدم إلى الحزمة المرشحة من دون فقدان الإعدادات أو الوكلاء أو الجلسات أو مساحات العمل أو قوائم السماح الخاصة بـPlugin أو إعدادات القنوات.
- يملك
openclaw doctor --fix --non-interactiveمسارات التنظيف والإصلاح القديمة. يجب ألا يضيف بدء التشغيل ترحيلات توافق مخفية لحالة Plugin المتقادمة. - تعمل عمليات تثبيت Plugin من الأدلة المحلية، ومستودعات git، وحزم npm، ومسار سجل ClawHub.
- تُثبّت اعتماديات npm الخاصة بـPlugin في جذر npm المُدار، وتُفحص قبل الثقة، وتُزال عبر npm أثناء إلغاء التثبيت حتى لا تبقى الاعتماديات المرفوعة.
- يكون تحديث Plugin مستقراً عندما لا يتغير شيء: تظل سجلات التثبيت، والمصدر المحلول، وتخطيط الاعتماديات المثبتة، وحالة التفعيل سليمة.
الإثبات المحلي أثناء التطوير
ابدأ بنطاق ضيق:
pnpm changed:lanes --json
pnpm check:changed
pnpm 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 خاص بالحزمة ملف tarball، أثبت أثر الحزمة:
pnpm release:check
يشغّل release:check فحوصات انجراف الإعدادات/الوثائق/API، ويكتب مخزون توزيع الحزمة،
ويشغّل npm pack --dry-run، ويرفض الملفات الممنوعة داخل الحزمة، ويثبّت
ملف tarball في بادئة مؤقتة، ويشغّل postinstall، ويفحص مداخل القنوات المضمّنة.
مسارات Docker
مسارات Docker هي الإثبات على مستوى المنتج. فهي تثبّت أو تحدّث حزمة حقيقية داخل حاويات Linux وتتحقق من السلوك عبر أوامر CLI، وبدء تشغيل Gateway، وفحوصات HTTP، وحالة RPC، وحالة نظام الملفات.
استخدم المسارات المركزة أثناء التكرار:
pnpm test:docker:plugins
pnpm test:docker:plugin-lifecycle-matrix
pnpm test:docker:plugin-update
pnpm test:docker:upgrade-survivor
pnpm test:docker:published-upgrade-survivor
pnpm test:docker:update-restart-auth
pnpm test:docker:update-migration
المسارات المهمة:
- يتحقق
test:docker:pluginsمن فحص تثبيت Plugin، وتثبيت المجلدات المحلية، وسلوك تخطي تحديث المجلد المحلي، والمجلدات المحلية ذات الاعتماديات المثبتة مسبقاً، وتثبيت حزمfile:، وتثبيتات git مع تنفيذ CLI، وتحديثات المراجع المتحركة في git، وتثبيتات سجل npm مع اعتماديات انتقالية مرفوعة، وعمليات تحديث npm التي لا تغيّر شيئاً، وتثبيتات تجهيزات ClawHub المحلية وعمليات التحديث التي لا تغيّر شيئاً، وسلوك تحديث السوق، وتمكين/فحص حزمة Claude. اضبطOPENCLAW_PLUGINS_E2E_CLAWHUB=0لإبقاء كتلة ClawHub محكمة/دون اتصال. - يثبّت
test:docker:plugin-lifecycle-matrixالحزمة المرشحة في حاوية فارغة، ويشغّل Plugin من npm عبر التثبيت، والفحص، والتعطيل، والتمكين، والترقية الصريحة، والرجوع الصريح، وإلغاء التثبيت بعد حذف كود Plugin. ويسجل مقاييس RSS وCPU لكل مرحلة. - يتحقق
test:docker:plugin-updateمن أن Plugin مثبتاً غير متغير لا يُعاد تثبيته ولا يفقد بيانات التثبيت الوصفية أثناءopenclaw plugins update. - يثبّت
test:docker:upgrade-survivorملف tarball المرشح فوق تجهيز مستخدم قديم متسخ، ويشغّل تحديث الحزمة بالإضافة إلى doctor غير تفاعلي، ثم يبدأ Gateway على local loopback ويفحص حفظ الحالة. - يثبّت
test:docker:published-upgrade-survivorأولاً خط أساس منشوراً، ويعدّه عبر وصفةopenclaw config setمخبوزة، ويحدّثه إلى ملف tarball المرشح، ويشغّل doctor، ويفحص التنظيف القديم، ويبدأ Gateway، ويفحص/healthzو/readyzوحالة RPC. - يثبّت
test:docker:update-restart-authالحزمة المرشحة، ويبدأ Gateway مداراً بمصادقة الرمز، ويلغي تعيين متغيرات بيئة مصادقة Gateway للمتصل من أجلopenclaw update --yes --json، ويتطلب من أمر تحديث المرشح إعادة تشغيل Gateway قبل الفحوصات العادية. test:docker:update-migrationهو مسار تحديث منشور كثيف التنظيف. يبدأ من حالة مستخدم معدة بنمط Discord/Telegram، ويشغّل doctor لخط الأساس حتى تتاح لاعتماديات Plugin المهيأة فرصة التحقق، ويزرع بقايا اعتماديات Plugin قديمة لـPlugin حزمة مهيأة، ويحدّث إلى ملف tarball المرشح، ويتطلب من doctor بعد التحديث إزالة جذور الاعتماديات القديمة.
متغيرات مفيدة لمسار published-upgrade survivor:
[email protected] \
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 إلى كل السيناريوهات
ذات شكل المشكلات المبلغ عنها، بما في ذلك ترحيل تثبيت Plugin المهيأ.
يبقى ترحيل التحديث الكامل منفصلاً عمداً عن Full Release CI. استخدم سير العمل
اليدوي 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-cleanup
Package Acceptance
Package Acceptance هي بوابة الحزمة الأصلية في GitHub. فهي تحل حزمة مرشحة واحدة
إلى ملف tarball باسم package-under-test، وتسجل الإصدار وSHA-256، ثم
تشغّل مسارات Docker E2E القابلة لإعادة الاستخدام على ملف tarball ذلك بالضبط. يكون مرجع
حاضنة سير العمل منفصلاً عن مرجع مصدر الحزمة، بحيث يمكن لمنطق الاختبار الحالي التحقق من
الإصدارات الموثوقة الأقدم.
مصادر المرشحين:
source=npm: التحقق منopenclaw@betaأوopenclaw@latestأو إصدار منشور محدد بدقة.source=ref: حزم فرع أو وسم أو commit موثوق باستخدام الحاضنة الحالية المختارة.source=url: التحقق من ملف tarball عبر HTTPS معpackage_sha256المطلوب.source=artifact: إعادة استخدام ملف tarball مرفوع بواسطة تشغيل Actions آخر.
تستخدم Full Release Validation source=artifact افتراضياً، مبنياً من
SHA الإصدار المحلول. لإثبات ما بعد النشر، مرّر
[email protected] حتى تستهدف مصفوفة الترقية نفسها
حزمة npm المشحونة بدلاً من ذلك.
تستدعي فحوصات الإصدار Package Acceptance بمجموعة الحزمة/التحديث/إعادة التشغيل/Plugin:
doctor-switch update-channel-switch update-corrupt-plugin upgrade-survivor published-upgrade-survivor update-restart-auth plugins-offline plugin-update
عند تمكين نقع الإصدار، تمرر أيضاً:
published_upgrade_survivor_baselines=last-stable-4 2026.4.23 2026.5.2 2026.4.15
published_upgrade_survivor_scenarios=reported-issues
telegram_mode=mock-openai
يبقي هذا ترحيل الحزمة، وتبديل قناة التحديث، وتحمل Plugin مُدار تالف، وتنظيف اعتماديات Plugin المتقادمة، وتغطية Plugin دون اتصال، وسلوك تحديث Plugin، وضمان جودة حزمة Telegram على الأثر المحلول نفسه من دون جعل بوابة حزمة الإصدار الافتراضية تمر على كل إصدار منشور.
يُحل last-stable-4 إلى أحدث أربعة إصدارات مستقرة من OpenClaw منشورة على npm.
تثبت Package Acceptance الخاصة بالإصدار 2026.4.23 كأول حد توافق لتحديث Plugin،
و2026.5.2 كحد اضطراب في بنية Plugin، و2026.4.15 كخط أساس تحديث منشور
أقدم من سلسلة 2026.4.1x؛ ويزيل المحلل تكرار التثبيتات الموجودة أصلاً ضمن أحدث أربعة. لتغطية
ترحيل التحديث المنشور بشكل شامل، استخدم all-since-2026.4.23 في سير عمل Update
Migration المنفصل بدلاً من Full Release CI. يظل release-history
متاحاً لأخذ عينات يدوية أوسع عندما تريد أيضاً مرساة التاريخ القديم السابق.
عند اختيار عدة خطوط أساس لمسار published-upgrade survivor، يقسم سير عمل Docker القابل لإعادة الاستخدام كل خط أساس إلى مهمة مشغّل مستهدفة خاصة به. لا يزال كل جزء من خط الأساس يشغّل مجموعة السيناريوهات المختارة، لكن السجلات والآثار تبقى لكل خط أساس ويكون زمن الجدار محدوداً بأبطأ جزء بدلاً من مهمة تسلسلية كبيرة واحدة.
شغّل ملف تعريف حزمة يدوياً عند التحقق من مرشح قبل الإصدار:
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.
الإعداد الافتراضي للإصدار
بالنسبة لمرشحي الإصدار، تكون مكدسة الإثبات الافتراضية:
pnpm check:changedوpnpm test:changedلاكتشاف تراجعات مستوى المصدر.pnpm release:checkللتحقق من سلامة أثر الحزمة.- ملف تعريف Package Acceptance
packageأو مسارات الحزمة المخصصة لفحص الإصدار لعقود التثبيت/التحديث/إعادة التشغيل/Plugin. - فحوصات الإصدار عبر أنظمة التشغيل لسلوك المثبت والإعداد والمنصة الخاص بكل نظام تشغيل.
- الحزم الحية فقط عندما يلامس السطح المتغير سلوك المزوّد أو الخدمة المستضافة.
على أجهزة المشرفين، يجب تشغيل البوابات الواسعة وإثبات المنتج الخاص بـDocker/الحزمة في Testbox ما لم يكن الإثبات المحلي مطلوباً صراحة.
التوافق القديم
التساهل في التوافق ضيق ومحدد زمنياً:
- يمكن للحزم حتى
2026.4.25، بما في ذلك2026.4.25-beta.*، تحمل فجوات بيانات وصفية للحزمة مشحونة بالفعل في Package Acceptance. - قد تحذر حزمة
2026.4.26المنشورة بشأن ملفات ختم بيانات وصفية للبناء المحلي شُحنت بالفعل. - يجب أن تستوفي الحزم اللاحقة العقود الحديثة. تفشل الفجوات نفسها بدلاً من التحذير أو التخطي.
لا تضف ترحيلات بدء تشغيل جديدة لهذه الأشكال القديمة. أضف أو وسّع إصلاح doctor،
ثم أثبته باستخدام upgrade-survivor أو published-upgrade-survivor أو
update-restart-auth عندما يملك أمر التحديث إعادة التشغيل.
إضافة التغطية
عند تغيير سلوك التحديث أو Plugin، أضف التغطية في أدنى طبقة يمكن أن تفشل للسبب الصحيح:
- منطق المسار أو البيانات الوصفية البحت: اختبار وحدة بجانب المصدر.
- سلوك مخزون الحزمة أو الملفات المعبأة: اختبار
package-dist-inventoryأو أداة فحص tarball. - سلوك تثبيت/تحديث CLI: تأكيد أو تجهيز في مسار Docker.
- سلوك ترحيل إصدار منشور: سيناريو
published-upgrade-survivor. - سلوك إعادة التشغيل المملوك للتحديث:
update-restart-auth. - سلوك مصدر السجل/الحزمة: تجهيز
test:docker:pluginsأو خادم تجهيز ClawHub. - سلوك تخطيط الاعتماديات أو التنظيف: تحقق من تنفيذ وقت التشغيل وحدود
نظام الملفات معاً. قد تُرفع اعتماديات npm تحت جذر npm
المُدار، لذلك يجب أن تثبت الاختبارات أن الجذر يُفحص/يُنظف بدلاً من افتراض شجرة
node_modulesمحلية للحزمة.
أبقِ تجهيزات Docker الجديدة محكمة افتراضياً. استخدم سجلات تجهيز محلية وحزماً وهمية ما لم يكن الهدف من الاختبار هو سلوك السجل الحي.
فرز الفشل
ابدأ بهوية الأثر:
- ملخص قبول الحزمة
resolve_package: المصدر، والإصدار، وSHA-256، واسم المُخرج. - مخرجات Docker:
.artifacts/docker-tests/**/summary.json، وfailures.json، وسجلات المسارات، وأوامر إعادة التشغيل. - ملخص الناجي من الترقية:
.artifacts/upgrade-survivor/summary.json، بما في ذلك إصدار خط الأساس، والإصدار المرشح، والسيناريو، وتوقيتات المراحل، و خطوات الوصفة.
فضّل إعادة تشغيل المسار المحدد الفاشل بالمُخرج نفسه للحزمة على إعادة تشغيل مظلة الإصدار كاملة.