Release and CI
การทดสอบ
- ชุดเครื่องมือทดสอบฉบับเต็ม (ชุดทดสอบ, แบบใช้งานจริง, Docker): การทดสอบ
- การตรวจสอบการอัปเดตและแพ็กเกจ Plugin: การทดสอบการอัปเดตและ Plugin
ค่าเริ่มต้นสำหรับเอเจนต์
เซสชันของเอเจนต์รันการทดสอบและการตรวจสอบที่ใช้ทรัพยากรประมวลผลสูงจากระยะไกล ผ่าน Crabbox โดยโค้ดของผู้ดูแลที่เชื่อถือได้จะใช้ Blacksmith Testbox เป็นค่าเริ่มต้น เวิร์กโฟลว์ Testbox ที่กำหนดค่าไว้จะเติมข้อมูลประจำตัว ดังนั้นโค้ดจากผู้มีส่วนร่วมที่ ไม่น่าเชื่อถือหรือจากฟอร์กต้องใช้ CI ของฟอร์กที่ไม่มีข้อมูลลับ หรือใช้ AWS Crabbox โดยตรงที่ผ่านการปรับสภาพให้ปลอดภัยแทน
เมื่องานโค้ดที่เชื่อถือได้มีแนวโน้มต้องใช้การทดสอบหรือหลักฐานที่ใช้ทรัพยากรสูง ให้เริ่ม
อุ่นเครื่องล่วงหน้าทันทีในเซสชันคำสั่งเบื้องหลัง ทำงานต่อระหว่างที่ระบบเติมข้อมูล
นำรหัส tbx_... ที่ได้รับกลับมาใช้ซ้ำ ซิงค์เช็กเอาต์ปัจจุบันทุกครั้งที่รัน และ
หยุดระบบก่อนส่งมอบงาน:
node scripts/crabbox-wrapper.mjs warmup --provider blacksmith-testbox --keep --timing-jsonหลังจากนำกลับมาใช้ซ้ำสำเร็จครั้งแรก ตัวห่อหุ้มจะบันทึกลายนิ้วมือของฐานลีส
การขึ้นต่อกัน และเวิร์กโฟลว์ Testbox ไว้ภายใต้ .crabbox/testbox-leases/
การแก้ไขเฉพาะซอร์สจะยังคงใช้กล่องที่อุ่นเครื่องไว้ซ้ำต่อไป หากฐานการผสาน
ไฟล์ล็อก อินพุตของตัวจัดการแพ็กเกจ ตัวห่อหุ้ม หรือเวิร์กโฟลว์ Testbox เปลี่ยนแปลง
ระบบจะปิดโดยไม่ดำเนินการต่อและกำหนดให้ใช้ลีสใหม่ ทุกครั้งที่รันยังคงซิงค์
เช็กเอาต์ปัจจุบัน
OPENCLAW_TESTBOX_ALLOW_STALE=1 ใช้เฉพาะสำหรับการวินิจฉัยโดยตั้งใจเท่านั้น
ไม่ใช่สำหรับหลักฐานการเผยแพร่
คำสั่งทดสอบภายในเครื่องด้านล่างมีไว้สำหรับเวิร์กโฟลว์ของมนุษย์ หรือกรณีสำรอง ของเอเจนต์ที่ผู้ใช้ร้องขออย่างชัดเจน ต้องรายงานเมื่อผู้ให้บริการระยะไกลไม่พร้อมใช้งาน กรณีดังกล่าวไม่ใช่สิทธิ์ให้รันด่านตรวจสอบขนาดใหญ่ภายในเครื่องโดยไม่แจ้งให้ทราบ
สำหรับโค้ดที่ไม่น่าเชื่อถือ ให้อุ่นเครื่องล่วงหน้าด้วย --provider aws ทุกครั้งที่รัน
ต้องตั้งค่า CRABBOX_ENV_ALLOW=CI ส่ง --provider aws --no-hydrate และใช้
HOME ระยะไกลชั่วคราวใหม่ก่อนติดตั้งการขึ้นต่อกันหรือรันการทดสอบ ใช้ลีสที่เพิ่ง
อุ่นเครื่องใหม่และจัดสรรเฉพาะสำหรับซอร์สที่ไม่น่าเชื่อถือนั้น ห้ามใช้ลีสที่เชื่อถือได้
หรือลีสที่เคยเติมข้อมูลแล้วซ้ำ เปิดไบนารี Crabbox ที่ติดตั้งและเชื่อถือได้จากเช็กเอาต์
main ที่สะอาดและเชื่อถือได้ และดึงเฉพาะ PR ระยะไกลด้วย --fresh-pr เท่านั้น
ห้ามเรียกใช้ตัวห่อหุ้มหรือการกำหนดค่าของเช็กเอาต์ที่ไม่น่าเชื่อถือภายในเครื่อง
ยกเลิกการตั้งค่า CRABBOX_AWS_INSTANCE_PROFILE และปิดโดยไม่ดำเนินการต่อ
เว้นแต่ค่า aws.instanceProfile ที่ประมวลผลแล้วจะว่างเปล่า ก่อนติดตั้งหรือทดสอบใด ๆ
ให้ใช้เครื่องมือพาธสัมบูรณ์ที่เชื่อถือได้เพื่อบังคับให้ใช้โทเค็น IMDSv2 พิสูจน์ว่า
เอนด์พอยต์ข้อมูลประจำตัว IAM ส่งคืน 404 และตรวจสอบว่า git rev-parse HEAD
ระยะไกลตรงกับ SHA แบบเต็มของหัว PR ที่ตรวจสอบแล้ว ผูกลีสกับ SHA นั้นและ
หยุด/อุ่นเครื่องใหม่เมื่อหัวเปลี่ยนแปลง อัปโหลด
scripts/crabbox-untrusted-bootstrap.sh ที่เชื่อถือได้จาก main ที่สะอาด
พร้อมกับ --fresh-pr; สคริปต์นี้จะติดตั้ง Node/pnpm เวอร์ชันที่ตรึงไว้ ตรวจสอบ SHA
และเวอร์ชันที่ตรึงของตัวจัดการแพ็กเกจ แยก HOME ติดตั้งการขึ้นต่อกัน แล้วจึง
เรียกใช้การทดสอบที่ร้องขอ หากโบรกเกอร์ไม่สามารถพิสูจน์ได้ว่าไม่มีบทบาท หรือ
ไม่มี PR ระยะไกล ให้ใช้ CI ของฟอร์กที่ไม่มีข้อมูลลับ ห้ามใช้ hydrate-github,
--no-sync หรือเวิร์กโฟลว์ Testbox ที่เติมข้อมูลประจำตัวแล้ว
ยกเลิกการตั้งค่าการเขียนทับ CRABBOX_TAILSCALE* ทั้งหมด บังคับใช้ --network public --tailscale=false ล้างแฟล็กโหนดทางออก/LAN และกำหนดให้ crabbox inspect
รายงานเครือข่ายสาธารณะที่ไม่มีสถานะ Tailscale ก่อนอัปโหลดสคริปต์ใด ๆ
ลำดับการทำงานภายในเครื่องตามปกติ
pnpm test:changedสำหรับหลักฐาน Vitest ตามขอบเขตที่เปลี่ยนแปลงpnpm test <path-or-filter>สำหรับไฟล์ ไดเรกทอรี หรือเป้าหมายที่ระบุอย่างชัดเจนหนึ่งรายการpnpm testเฉพาะเมื่อคุณตั้งใจต้องใช้ชุดทดสอบ Vitest ภายในเครื่องทั้งหมด
ในเวิร์กทรี Codex หรือเช็กเอาต์แบบเชื่อมโยง/กระจัดกระจาย เอเจนต์จะหลีกเลี่ยงการรัน
pnpm test* / pnpm check* / pnpm crabbox:run โดยตรงภายในเครื่อง:
- กรณีสำรองภายในเครื่องสำหรับไฟล์ขนาดเล็กที่ผู้ใช้ร้องขออย่างชัดเจน:
node scripts/run-vitest.mjs <path-or-filter> - ด่านตรวจสอบการเปลี่ยนแปลงหรือหลักฐานขนาดใหญ่:
node scripts/crabbox-wrapper.mjs run --provider blacksmith-testbox ... -- env OPENCLAW_CHECK_CHANGED_REMOTE_CHILD=1 OPENCLAW_CHANGED_LANES_RAW_SYNC=1 corepack pnpm check:changedเพื่อให้ pnpm ทำงานภายใน Testbox exitCodeสุดท้ายและ JSON การจับเวลาของตัวห่อหุ้มคือผลลัพธ์ของคำสั่ง การรัน Blacksmith GitHub Actions ที่มอบหมายอาจแสดงcancelledหลังคำสั่ง SSH สำเร็จ เนื่องจาก Testbox ถูกหยุดจากภายนอกแอ็กชันรักษาการทำงาน ให้ตรวจสอบสรุปของตัวห่อหุ้มและเอาต์พุตคำสั่งก่อนถือว่าเป็นความล้มเหลวOPENCLAW_HEAVY_CHECK_LOCK_SCOPE=worktree <local-heavy-check command>: จำกัดการทำงานแบบอนุกรมของการตรวจสอบหนักไว้ภายในเวิร์กทรีปัจจุบัน แทนไดเรกทอรี Git ร่วม สำหรับคำสั่งเช่นpnpm check:changedและpnpm test ...แบบเจาะจง ใช้เฉพาะบนโฮสต์ภายในเครื่องที่มีความจุสูง เมื่อคุณตั้งใจรันการตรวจสอบอิสระข้ามเวิร์กทรีที่เชื่อมโยงกัน
คำสั่งหลัก
การรันผ่านตัวห่อหุ้มการทดสอบจะจบด้วยสรุปสั้น ๆ [test] passed|failed|skipped ... in ...; บรรทัดระยะเวลาของ Vitest เองยังคงเป็นรายละเอียดต่อชาร์ด
| คำสั่ง | การทำงาน |
|---|---|
pnpm test |
เป้าหมายไฟล์/ไดเรกทอรีที่ระบุอย่างชัดเจนจะถูกส่งผ่านเลน Vitest ตามขอบเขต การรันที่ไม่ระบุเป้าหมายเป็นหลักฐานของชุดทดสอบทั้งหมด: กลุ่มชาร์ดแบบคงที่จะขยายเป็นการกำหนดค่าปลายทางสำหรับการทำงานคู่ขนานภายในเครื่อง โดยพิมพ์จำนวนชาร์ดที่คาดไว้ก่อนเริ่ม กลุ่มส่วนขยายจะขยายเป็นการกำหนดค่าชาร์ดต่อส่วนขยายเสมอ แทนกระบวนการโปรเจกต์รากขนาดใหญ่เพียงกระบวนการเดียว |
pnpm test:changed |
การรันทดสอบที่เปลี่ยนแปลงแบบชาญฉลาดและประหยัด: ใช้เป้าหมายที่แม่นยำจากการแก้ไขการทดสอบโดยตรง ไฟล์พี่น้อง *.test.ts การแมปซอร์สที่ระบุไว้อย่างชัดเจน และกราฟการนำเข้าภายในเครื่อง การเปลี่ยนแปลงขนาดใหญ่/การกำหนดค่า/แพ็กเกจจะถูกข้าม เว้นแต่จะแมปไปยังการทดสอบที่แม่นยำได้ |
OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed |
การรันทดสอบที่เปลี่ยนแปลงแบบกว้างอย่างชัดเจน ใช้เมื่อการแก้ไขชุดเครื่องมือทดสอบ/การกำหนดค่า/แพ็กเกจควรถอยกลับไปใช้พฤติกรรมการทดสอบการเปลี่ยนแปลงแบบกว้างกว่าของ Vitest |
pnpm test:force |
ปลดพอร์ต Gateway ของ OpenClaw ที่กำหนดค่าไว้ (ค่าเริ่มต้น 18789) จากนั้นรันชุดทดสอบทั้งหมดด้วยพอร์ต Gateway ที่แยกต่างหาก เพื่อไม่ให้การทดสอบเซิร์ฟเวอร์ชนกับอินสแตนซ์ที่กำลังทำงาน |
pnpm test:coverage |
สร้างรายงานความครอบคลุม V8 เพื่อให้ข้อมูลสำหรับเลนหน่วยเริ่มต้น (vitest.unit.config.ts); ไม่มีการบังคับใช้เกณฑ์ความครอบคลุม |
pnpm test:coverage:changed |
ความครอบคลุมของการทดสอบหน่วยเฉพาะไฟล์ที่เปลี่ยนแปลงตั้งแต่ origin/main |
pnpm changed:lanes |
แสดงเลนสถาปัตยกรรมที่ถูกเรียกใช้โดยส่วนต่างเมื่อเทียบกับ origin/main |
pnpm check:changed |
มอบหมายให้ Crabbox/Testbox เป็นค่าเริ่มต้นเมื่ออยู่นอก CI จากนั้นรันด่านตรวจสอบการเปลี่ยนแปลงอัจฉริยะภายในโพรเซสลูกระยะไกล ได้แก่ การจัดรูปแบบ รวมถึงคำสั่งตรวจสอบชนิด ลินต์ และการป้องกันสำหรับเลนที่ได้รับผลกระทบ ไม่รัน Vitest; ใช้ pnpm test:changed หรือ pnpm test <target> สำหรับหลักฐานการทดสอบ |
สถานะการทดสอบร่วมและตัวช่วยโพรเซส
src/test-utils/openclaw-test-state.ts: ใช้จาก Vitest เมื่อการทดสอบต้องการHOME,OPENCLAW_STATE_DIR,OPENCLAW_CONFIG_PATH, ฟิกซ์เจอร์การกำหนดค่า เวิร์กสเปซ ไดเรกทอรีเอเจนต์ หรือที่เก็บโปรไฟล์การยืนยันตัวตนแบบแยกต่างหากpnpm test:env-mutations:report: รายงานแบบไม่บล็อกของการทดสอบ/ชุดเครื่องมือที่แก้ไขHOME,OPENCLAW_STATE_DIR,OPENCLAW_CONFIG_PATH,OPENCLAW_WORKSPACE_DIRหรือคีย์สภาพแวดล้อมที่เกี่ยวข้องโดยตรง ใช้เพื่อค้นหารายการที่ควรย้ายไปใช้ตัวช่วยสถานะการทดสอบร่วมtest/helpers/openclaw-test-instance.ts: สำหรับการทดสอบ E2E ระดับโพรเซสที่ต้องใช้ Gateway ซึ่งกำลังทำงาน สภาพแวดล้อม CLI การบันทึกล็อก และการล้างข้อมูลในที่เดียว- เลน E2E ของ Docker/Bash ที่ซอร์ส
scripts/lib/docker-e2e-image.shสามารถส่งdocker_e2e_test_state_shell_b64 <label> <scenario>เข้าไปในคอนเทนเนอร์ และถอดรหัสด้วยscripts/lib/openclaw-e2e-instance.sh; สคริปต์แบบหลายโฮมสามารถส่งdocker_e2e_test_state_function_b64และเรียกopenclaw_test_state_create <label> <scenario>ในแต่ละโฟลว์ได้node scripts/lib/openclaw-test-state.mjs -- create --label <name> --scenario <name> --env-file <path> --jsonจะเขียนไฟล์สภาพแวดล้อมของโฮสต์ที่สามารถนำไปซอร์สได้ (--ก่อนcreateป้องกันไม่ให้รันไทม์ Node รุ่นใหม่ตีความ--env-fileเป็นแฟล็กของ Node) เลนที่เปิด Gateway สามารถซอร์สscripts/lib/openclaw-e2e-instance.shเพื่อใช้การกำหนดเอนทรีพอยต์ การเริ่มต้น OpenAI จำลอง การเปิดแบบเบื้องหน้า/เบื้องหลัง การตรวจสอบความพร้อม การส่งออกสภาพแวดล้อมสถานะ การดัมพ์ล็อก และการล้างโพรเซส
เลน Control UI, TUI และส่วนขยาย
- E2E แบบจำลองของ Control UI:
pnpm test:ui:e2eเรียกใช้เลน Vitest + Playwright ซึ่งเริ่ม Vite Control UI และควบคุมหน้า Chromium จริงโดยเชื่อมต่อกับ Gateway WebSocket จำลอง การทดสอบอยู่ในui/src/**/*.e2e.test.ts; ม็อกและตัวควบคุมที่ใช้ร่วมกันอยู่ในui/src/test-helpers/control-ui-e2e.tsโดยpnpm test:e2eรวมเลนนี้ไว้ด้วย การรันโดยเอเจนต์ใช้ Testbox/Crabbox เป็นค่าเริ่มต้น รวมถึงการพิสูจน์แบบเจาะจง; ใช้node scripts/run-vitest.mjs run --config test/vitest/vitest.ui-e2e.config.ts --configLoader runner ui/src/ui/e2e/chat-flow.e2e.test.tsเฉพาะเมื่อระบุให้ใช้ทางเลือกสำรองภายในเครื่องอย่างชัดเจนเท่านั้น - การทดสอบ TUI PTY:
node scripts/run-vitest.mjs run --config test/vitest/vitest.tui-pty.config.tsเรียกใช้เลน PTY ที่รวดเร็วด้วยแบ็กเอนด์จำลองOPENCLAW_TUI_PTY_INCLUDE_LOCAL=1หรือpnpm tui:pty:test:watch --mode localเรียกใช้การทดสอบควันtui --localที่ช้ากว่า ซึ่งจำลองเฉพาะปลายทางโมเดลภายนอก ให้ตรวจยืนยันข้อความที่มองเห็นได้และมีความเสถียร หรือการเรียกฟิกซ์เจอร์ ไม่ใช่สแนปช็อต ANSI ดิบ pnpm test:extensionsและpnpm test extensionsเรียกใช้ชาร์ดส่วนขยาย/Plugin ทั้งหมด Plugin ช่องทางที่ใช้ทรัพยากรมาก, Plugin เบราว์เซอร์ และ OpenAI จะทำงานเป็นชาร์ดเฉพาะ ส่วนกลุ่ม Plugin อื่นยังคงถูกรวมเป็นชุดpnpm test extensions/<id>เรียกใช้เลน Plugin ที่รวมมากับระบบหนึ่งรายการ- ไฟล์ซอร์สที่มีการทดสอบระดับเดียวกันจะถูกแมปไปยังการทดสอบนั้นก่อน แล้วจึงย้อนกลับไปใช้โกลบไดเรกทอรีที่กว้างขึ้น การแก้ไขตัวช่วยภายใต้
src/channels/plugins/contracts/test-helpers,src/plugin-sdk/test-helpersและsrc/plugins/contractsใช้กราฟการนำเข้าภายในเพื่อเรียกใช้การทดสอบที่นำเข้าไฟล์เหล่านั้น แทนการเรียกใช้ทุกชาร์ดแบบกว้างเมื่อเส้นทางการขึ้นต่อกันมีความชัดเจน - เป้าหมายไดเรกทอรีสัญญาจะกระจายไปยังเลนสัญญาที่เกี่ยวข้อง:
pnpm test src/channels/plugins/contractsเรียกใช้การกำหนดค่าสัญญาช่องทางทั้งสี่รายการ และpnpm test src/plugins/contractsเรียกใช้การกำหนดค่าสัญญา Plugin เนื่องจากโปรเจกต์ทั่วไปchannels/pluginsไม่รวมcontracts/** auto-replyแยกออกเป็นการกำหนดค่าเฉพาะสามรายการ (core,top-level,reply) เพื่อไม่ให้ชุดทดสอบการตอบกลับกินทรัพยากรเหนือกว่าการทดสอบสถานะ/โทเค็น/ตัวช่วยระดับบนที่เบากว่า- ไฟล์ทดสอบ
plugin-sdkและcommandsบางรายการจะถูกส่งผ่านเลนเฉพาะที่มีน้ำหนักเบา ซึ่งคงไว้เฉพาะtest/setup.tsส่วนกรณีที่ใช้รันไทม์หนักยังคงอยู่ในเลนเดิม - การกำหนดค่า Vitest พื้นฐานใช้
pool: "threads"และisolate: falseเป็นค่าเริ่มต้น พร้อมเปิดใช้ตัวรันแบบไม่แยกที่ใช้ร่วมกันทั่วทั้งการกำหนดค่าของรีโพ pnpm test:channelsเรียกใช้vitest.channels.config.ts
Gateway และ E2E
- การผสานรวม Gateway ต้องเลือกเปิดใช้:
OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm testหรือpnpm test:gateway pnpm test:e2e: ชุดรวม E2E ของรีโพ =pnpm test:e2e:gateway && pnpm test:ui:e2epnpm test:e2e:gateway: การทดสอบควัน Gateway แบบต้นทางถึงปลายทาง (การจับคู่ WS/HTTP/Node แบบหลายอินสแตนซ์) ใช้threads+isolate: falseเป็นค่าเริ่มต้น พร้อมจำนวนเวิร์กเกอร์ที่ปรับได้ในvitest.e2e.config.ts; ปรับด้วยOPENCLAW_E2E_WORKERS=<n>และเปิดบันทึกแบบละเอียดด้วยOPENCLAW_E2E_VERBOSE=1pnpm test:live: การทดสอบผู้ให้บริการแบบสด (Claude/Minimax/DeepSeek/z.ai/ฯลฯ ซึ่งควบคุมด้วย*.live.test.ts) ต้องใช้คีย์ API และLIVE=1(หรือOPENCLAW_LIVE_TEST=1) เพื่อยกเลิกการข้าม; เปิดเอาต์พุตแบบละเอียดด้วยOPENCLAW_LIVE_TEST_QUIET=0
ชุด Docker เต็มรูปแบบ (pnpm test:docker:all)
สร้างอิมเมจการทดสอบแบบสดที่ใช้ร่วมกัน แพ็ก OpenClaw หนึ่งครั้งเป็นทาร์บอล npm สร้าง/นำอิมเมจตัวรัน Node/Git เปล่ากลับมาใช้ใหม่ พร้อมอิมเมจใช้งานจริงที่ติดตั้งทาร์บอลนั้นลงใน /app จากนั้นเรียกใช้เลนทดสอบควัน Docker ผ่านตัวจัดตารางแบบถ่วงน้ำหนัก scripts/package-openclaw-for-docker.mjs เป็นตัวแพ็กแพ็กเกจภายในเครื่อง/CI เพียงตัวเดียว และตรวจสอบทาร์บอลพร้อม dist/postinstall-inventory.json ก่อนที่ Docker จะนำไปใช้
- อิมเมจเปล่า (
OPENCLAW_DOCKER_E2E_BARE_IMAGE): เลนตัวติดตั้ง/การอัปเดต/การขึ้นต่อกันของ Plugin; เมานต์ทาร์บอลที่สร้างไว้ล่วงหน้าแทนการคัดลอกซอร์สของรีโพ - อิมเมจใช้งานจริง (
OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE): เลนฟังก์ชันการทำงานปกติของแอปที่สร้างแล้ว - คำจำกัดความเลน:
scripts/lib/docker-e2e-scenarios.mjsตัววางแผน:scripts/lib/docker-e2e-plan.mjsตัวดำเนินการ:scripts/test-docker-all.mjs node scripts/test-docker-all.mjs --plan-jsonส่งออกแผน CI ที่ตัวจัดตารางเป็นเจ้าของ (เลน, ชนิดอิมเมจ, ความต้องการแพ็กเกจ/อิมเมจแบบสด, สถานการณ์สถานะ, การตรวจสอบข้อมูลรับรอง) โดยไม่สร้างหรือเรียกใช้ Docker
ตัวปรับแต่งการจัดตาราง (ตัวแปรสภาพแวดล้อม โดยค่าเริ่มต้นอยู่ในวงเล็บ):
| ตัวแปรสภาพแวดล้อม | ค่าเริ่มต้น | วัตถุประสงค์ |
|---|---|---|
OPENCLAW_DOCKER_ALL_PARALLELISM |
10 | สล็อตกระบวนการ |
OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM |
10 | พูลส่วนท้ายที่ไวต่อผู้ให้บริการ |
OPENCLAW_DOCKER_ALL_LIVE_LIMIT |
9 | ขีดจำกัดเลนผู้ให้บริการแบบสดที่ใช้ทรัพยากรมาก |
OPENCLAW_DOCKER_ALL_NPM_LIMIT |
5 | ขีดจำกัดเลนทรัพยากร npm |
OPENCLAW_DOCKER_ALL_SERVICE_LIMIT |
7 | ขีดจำกัดเลนทรัพยากรบริการ |
OPENCLAW_DOCKER_ALL_LIVE_CLAUDE_LIMIT / _CODEX_LIMIT / _GEMINI_LIMIT / _DROID_LIMIT / _OPENCODE_LIMIT |
4 | ขีดจำกัดเลนหนักต่อผู้ให้บริการ |
OPENCLAW_DOCKER_ALL_LIVE_OPENAI_LIMIT / _TELEGRAM_LIMIT |
1 | ขีดจำกัดต่อผู้ให้บริการที่แคบกว่า |
OPENCLAW_DOCKER_ALL_WEIGHT_LIMIT / OPENCLAW_DOCKER_ALL_DOCKER_LIMIT |
- | ค่าทดแทนสำหรับโฮสต์ขนาดใหญ่กว่า |
OPENCLAW_DOCKER_ALL_START_STAGGER_MS |
2000 | หน่วงเวลาระหว่างการเริ่มเลน เพื่อหลีกเลี่ยงการสร้างงานจำนวนมากพร้อมกันในดีมอน Docker ภายในเครื่อง |
OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS |
7,200,000 (120 นาที) | เวลาหมดอายุสำรองต่อเลน; เลนแบบสด/ส่วนท้ายที่เลือกใช้ขีดจำกัดที่เข้มงวดกว่า |
OPENCLAW_DOCKER_ALL_LIVE_RETRIES |
1 | จำนวนครั้งที่ลองใหม่สำหรับความล้มเหลวชั่วคราวของผู้ให้บริการแบบสด |
OPENCLAW_DOCKER_ALL_DRY_RUN |
ปิด | พิมพ์รายการเลนโดยไม่เรียกใช้ Docker |
OPENCLAW_DOCKER_ALL_STATUS_INTERVAL_MS |
30000 | ช่วงเวลาการพิมพ์สถานะเลนที่ทำงานอยู่ |
OPENCLAW_DOCKER_ALL_TIMINGS |
เปิด | นำ .artifacts/docker-tests/lane-timings.json กลับมาใช้ใหม่เพื่อจัดลำดับจากงานที่ใช้เวลานานที่สุดก่อน; ตั้งเป็น 0 เพื่อปิดใช้ |
OPENCLAW_DOCKER_ALL_LIVE_MODE |
- | skip สำหรับเลนแบบกำหนดผลลัพธ์ได้/ภายในเครื่องเท่านั้น, only สำหรับเลนผู้ให้บริการแบบสดเท่านั้น ชื่อแทน: pnpm test:docker:local:all, pnpm test:docker:live:all โหมดเฉพาะแบบสดจะรวมเลนสดหลักและเลนสดส่วนท้ายไว้ในพูลเดียวที่เรียงจากงานยาวที่สุดก่อน เพื่อให้บักเก็ตผู้ให้บริการจัดกลุ่มงาน Claude/Codex/Gemini ร่วมกัน |
OPENCLAW_LIVE_CLI_BACKEND_SETUP_TIMEOUT_SECONDS |
180 | เวลาหมดอายุการตั้งค่า Docker สำหรับแบ็กเอนด์ CLI |
รูปแบบตัวแปรสภาพแวดล้อมสำหรับขีดจำกัดทรัพยากรคือ OPENCLAW_DOCKER_ALL_<RESOURCE>_LIMIT (ชื่อทรัพยากรเป็นตัวพิมพ์ใหญ่ และอักขระที่ไม่ใช่ตัวอักษรหรือตัวเลขจะถูกรวมเป็น _)
ลักษณะการทำงานอื่น ๆ: โดยค่าเริ่มต้น ตัวรันจะตรวจสอบความพร้อมของ Docker ล่วงหน้า ล้างคอนเทนเนอร์ E2E ของ OpenClaw ที่ค้างอยู่ แชร์แคชเครื่องมือ CLI ของผู้ให้บริการระหว่างเลนที่เข้ากันได้ และหยุดจัดกำหนดการเลนแบบพูลใหม่หลังพบความล้มเหลวครั้งแรก เว้นแต่จะตั้งค่า OPENCLAW_DOCKER_ALL_FAIL_FAST=0 หากเลนใดเลนหนึ่งใช้เกินขีดจำกัดน้ำหนัก/ทรัพยากรที่มีผลบนโฮสต์ที่มีระดับการทำงานแบบขนานต่ำ เลนนั้นยังคงเริ่มจากพูลว่างและทำงานเพียงลำพังได้จนกว่าจะคืนความจุ บันทึกแยกตามเลน, summary.json, failures.json และข้อมูลเวลาของแต่ละเฟสจะถูกเขียนไว้ใต้ .artifacts/docker-tests/<run-id>/; ใช้ pnpm test:docker:timings <summary.json> เพื่อตรวจสอบเลนที่ทำงานช้า และใช้ pnpm test:docker:rerun <run-id|summary.json|failures.json> เพื่อพิมพ์คำสั่งรันซ้ำแบบเจาะจงที่ใช้ทรัพยากรน้อย
เลน Docker ที่สำคัญ
| คำสั่ง | สิ่งที่ตรวจสอบ |
|---|---|
pnpm test:docker:browser-cdp-snapshot |
คอนเทนเนอร์ E2E ต้นทางที่ใช้ Chromium พร้อม CDP ดิบและ Gateway แบบแยกส่วน; สแนปช็อตบทบาท CDP ของ browser doctor --deep ประกอบด้วย URL ของลิงก์ องค์ประกอบที่คลิกได้ซึ่งเลื่อนเคอร์เซอร์ไปชี้ได้ การอ้างอิง iframe และข้อมูลเมตาของเฟรม |
pnpm test:docker:skill-install |
ติดตั้ง tarball ที่แพ็กแล้วในตัวรัน Docker เปล่าซึ่งกำหนด skills.install.allowUploadedArchives: false ค้นหา slug ของ skill ปัจจุบันจากการค้นหา ClawHub แบบสด ติดตั้งผ่าน openclaw skills install และตรวจสอบ SKILL.md, .clawhub/origin.json, .clawhub/lock.json และ skills info --json |
pnpm test:docker:live-cli-backend:claude, :claude:resume, :claude:mcp |
โพรบแบบสดที่มุ่งเน้นแบ็กเอนด์ CLI; Gemini มีนามแฝง :resume และ :mcp ที่สอดคล้องกัน |
pnpm test:docker:openwebui |
OpenClaw + Open WebUI ใน Docker: ลงชื่อเข้าใช้ ตรวจสอบ /api/models และเรียกใช้แชตจริงผ่านพร็อกซีทาง /api/chat/completions ต้องใช้คีย์โมเดลแบบสดที่ใช้งานได้และดึงอิมเมจภายนอก จึงไม่คาดว่าจะเสถียรบน CI เท่ากับชุดทดสอบหน่วย/E2E |
pnpm test:docker:mcp-channels |
คอนเทนเนอร์ Gateway ที่ใส่ข้อมูลเริ่มต้นไว้แล้ว พร้อมคอนเทนเนอร์ไคลเอนต์ที่เรียก openclaw mcp serve: การค้นหาบทสนทนาที่กำหนดเส้นทางแล้ว การอ่านบันทึกบทสนทนา ข้อมูลเมตาของไฟล์แนบ พฤติกรรมคิวเหตุการณ์แบบสด การกำหนดเส้นทางการส่งออก และการแจ้งเตือนช่องทางพร้อมสิทธิ์แบบ Claude ผ่านบริดจ์ stdio จริง (การยืนยันผลอ่านเฟรม MCP ของ stdio ดิบโดยตรง) |
pnpm test:docker:upgrade-survivor |
ติดตั้ง tarball ที่แพ็กแล้วทับฟิกซ์เจอร์ผู้ใช้เก่าแบบไม่สะอาด เรียกใช้การอัปเดตแพ็กเกจร่วมกับ doctor แบบไม่โต้ตอบโดยไม่มีคีย์ผู้ให้บริการ/ช่องทางแบบสด เริ่ม Gateway บน local loopback และตรวจสอบว่า agents/การกำหนดค่าช่องทาง/รายการอนุญาต Plugin/ไฟล์พื้นที่ทำงาน/ไฟล์เซสชัน/สถานะการพึ่งพาของ Plugin รุ่นเก่าที่ค้างอยู่/การเริ่มต้น/สถานะ RPC ยังคงอยู่ครบ |
pnpm test:docker:published-upgrade-survivor |
ติดตั้ง openclaw@latest โดยค่าเริ่มต้น ใส่ไฟล์ผู้ใช้เดิมที่สมจริง กำหนดค่าผ่านสูตร openclaw config set ที่ฝังไว้ อัปเดตเป็น tarball ที่แพ็กแล้ว เรียกใช้ doctor แบบไม่โต้ตอบ เขียน .artifacts/upgrade-survivor/summary.json และตรวจสอบ /healthz, /readyz รวมถึงสถานะ RPC ปรับค่าได้ด้วย OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, ขยายเมทริกซ์ด้วย OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS หรือเพิ่มฟิกซ์เจอร์สถานการณ์ด้วย OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS=reported-issues (รวม configured-plugin-installs และ stale-source-plugin-shadow) การตรวจรับแพ็กเกจเผยรายการเหล่านี้เป็น published_upgrade_survivor_baseline(s) / _scenarios และแปลงโทเค็นเมตา เช่น last-stable-4 หรือ all-since-2026.4.23 |
pnpm test:docker:update-migration |
ชุดทดสอบความอยู่รอดหลังอัปเกรดจากรุ่นที่เผยแพร่แล้วในสถานการณ์ plugin-deps-cleanup โดยเริ่มต้นจาก openclaw@2026.4.23 ตามค่าเริ่มต้น เวิร์กโฟลว์ Update Migration ขยายการทดสอบนี้ด้วย baselines=all-since-2026.4.23 เพื่อพิสูจน์การล้างการพึ่งพาของ Plugin ที่กำหนดค่าไว้นอก CI การเผยแพร่ฉบับเต็ม |
pnpm test:docker:plugins |
การทดสอบควันสำหรับการติดตั้ง/อัปเดตจากพาธภายในเครื่อง, file:, แพ็กเกจในรีจิสทรี npm ที่มีการพึ่งพาแบบยกระดับ, การอ้างอิง git ที่เคลื่อนที่ได้, ฟิกซ์เจอร์ ClawHub, การอัปเดตมาร์เก็ตเพลส และการเปิดใช้/ตรวจสอบบันเดิล Claude |
เกต PR ภายในเครื่อง
สำหรับการตรวจสอบก่อนรวม/เกต PR ภายในเครื่อง ให้เรียกใช้:
pnpm check:changedpnpm checkpnpm check:test-typespnpm buildpnpm testpnpm check:docs
หาก pnpm test ล้มเหลวเป็นครั้งคราวบนโฮสต์ที่มีภาระสูง ให้รันซ้ำหนึ่งครั้งก่อนถือว่าเป็นการถดถอย จากนั้นแยกตรวจสอบด้วย pnpm test <path/to/test> สำหรับโฮสต์ที่มีหน่วยความจำจำกัด:
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm testOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/tmp/openclaw-vitest-cache pnpm test:changed
เครื่องมือวัดประสิทธิภาพการทดสอบ
pnpm test:perf:imports: เปิดใช้การรายงานระยะเวลาการนำเข้าและรายละเอียดการนำเข้าของ Vitest โดยยังคงใช้การกำหนดเส้นทางเลนตามขอบเขตสำหรับเป้าหมายไฟล์/ไดเรกทอรีที่ระบุอย่างชัดเจน ส่วนpnpm test:perf:imports:changedจำกัดการทำโปรไฟล์แบบเดียวกันไว้เฉพาะไฟล์ที่เปลี่ยนแปลงนับตั้งแต่origin/mainpnpm test:perf:changed:bench -- --ref <git-ref>วัดประสิทธิภาพเส้นทางโหมดการเปลี่ยนแปลงที่ผ่านการกำหนดเส้นทาง เทียบกับการเรียกใช้โปรเจกต์รากโดยตรงสำหรับส่วนต่าง git ที่คอมมิตแล้วชุดเดียวกัน ส่วนpnpm test:perf:changed:bench -- --worktreeวัดประสิทธิภาพชุดการเปลี่ยนแปลงในเวิร์กทรีปัจจุบันโดยไม่ต้องคอมมิตก่อนpnpm test:perf:profile:mainเขียนโปรไฟล์ CPU สำหรับเธรดหลักของ Vitest (.artifacts/vitest-main-profile) ส่วนpnpm test:perf:profile:runnerเขียนโปรไฟล์ CPU และฮีปสำหรับตัวรันการทดสอบหน่วย (.artifacts/vitest-runner-profile)pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-perf/baseline-before.json: เรียกใช้การกำหนดค่า Vitest ปลายทางทุกชุดของชุดทดสอบเต็มรูปแบบแบบอนุกรม และเขียนข้อมูลระยะเวลาที่จัดกลุ่ม พร้อมอาร์ติแฟกต์ JSON/บันทึกแยกตามการกำหนดค่า รายงานชุดทดสอบเต็มรูปแบบจะแยกไฟล์โดยค่าเริ่มต้น เพื่อไม่ให้กราฟโมดูลที่คงอยู่และช่วงหยุดของ GC จากไฟล์ก่อนหน้าถูกนับรวมกับการตรวจสอบยืนยันในไฟล์ถัดไป ให้ส่ง-- --no-isolateเฉพาะเมื่อตั้งใจทำโปรไฟล์การสะสมของเวิร์กเกอร์ที่ใช้ร่วมกันเท่านั้น ตัวแทนวัดประสิทธิภาพการทดสอบใช้ข้อมูลนี้เป็นค่าฐานก่อนพยายามแก้ไขการทดสอบที่ทำงานช้าpnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.jsonเปรียบเทียบรายงานที่จัดกลุ่มหลังการเปลี่ยนแปลงที่มุ่งเน้นด้านประสิทธิภาพ- การเรียกใช้ชาร์ดแบบเต็ม แบบส่วนขยาย และแบบรูปแบบรวม จะอัปเดตข้อมูลเวลาในเครื่องที่
.artifacts/vitest-shard-timings.jsonการเรียกใช้การกำหนดค่าทั้งชุดในภายหลังจะใช้เวลาเหล่านี้เพื่อสร้างสมดุลระหว่างชาร์ดที่ช้าและเร็ว ชาร์ด CI แบบรูปแบบรวมจะต่อท้ายชื่อชาร์ดเข้ากับคีย์เวลา ซึ่งช่วยให้มองเห็นเวลาของชาร์ดที่กรองแล้วโดยไม่แทนที่ข้อมูลเวลาของการกำหนดค่าทั้งชุด ตั้งค่าOPENCLAW_TEST_PROJECTS_TIMINGS=0เพื่อไม่สนใจอาร์ติแฟกต์เวลาในเครื่อง
การวัดประสิทธิภาพ
เวลาแฝงของโมเดล (scripts/bench-model.ts)
pnpm tsx scripts/bench-model.ts --runs 10ตัวแปรสภาพแวดล้อมที่เลือกใช้ได้: MINIMAX_API_KEY, MINIMAX_BASE_URL, MINIMAX_MODEL, ANTHROPIC_API_KEY พรอมต์เริ่มต้น: "ตอบด้วยคำเดียว: ok ห้ามมีเครื่องหมายวรรคตอนหรือข้อความเพิ่มเติม"
การเริ่มต้น CLI (scripts/bench-cli-startup.ts)
pnpm test:startup:benchpnpm test:startup:bench:smokepnpm test:startup:bench:savepnpm test:startup:bench:updatepnpm test:startup:bench:checkpnpm tsx scripts/bench-cli-startup.ts --runs 12pnpm tsx scripts/bench-cli-startup.ts --preset real --case status --case gatewayStatus --runs 3pnpm tsx scripts/bench-cli-startup.ts --entry openclaw.mjs --entry-secondary dist/entry.js --preset allชุดค่าที่กำหนดไว้ล่วงหน้า:
startup:--version,--help,health,health --json,status --json,statusreal:health,status,status --json,sessions,sessions --json,tasks --json,tasks list --json,tasks audit --json,agents list --json,gateway status,gateway status --json,gateway health --json,config get gateway.portall: รวมชุดค่าที่กำหนดไว้ล่วงหน้าทั้งสองชุด
ผลลัพธ์ประกอบด้วย sampleCount, ค่าเฉลี่ย, p50, p95, ค่าต่ำสุด/สูงสุด, การแจกแจงรหัสออก/สัญญาณ และ RSS สูงสุดต่อคำสั่ง --cpu-prof-dir / --heap-prof-dir จะเขียนโปรไฟล์ V8 แยกต่อการเรียกใช้แต่ละครั้ง
ผลลัพธ์ที่บันทึกไว้: pnpm test:startup:bench:smoke เขียน .artifacts/cli-startup-bench-smoke.json; pnpm test:startup:bench:save เขียน .artifacts/cli-startup-bench-all.json (runs=5 warmup=1) ข้อมูลตัวอย่างที่เช็กอินไว้: test/fixtures/cli-startup-bench.json ซึ่งรีเฟรชด้วย pnpm test:startup:bench:update และเปรียบเทียบด้วย pnpm test:startup:bench:check
การเริ่มต้น Gateway (scripts/bench-gateway-startup.ts)
โดยค่าเริ่มต้นจะใช้จุดเข้า CLI ที่สร้างแล้ว ณ dist/entry.js ให้เรียกใช้ pnpm build ก่อน ส่ง --entry scripts/run-node.mjs เพื่อวัดตัวรันซอร์สแทน และแยกผลลัพธ์เหล่านั้นออกจากค่าฐานของจุดเข้าที่สร้างแล้ว
pnpm test:startup:gateway -- --runs 5 --warmup 1pnpm test:startup:gateway -- --case skipChannels --case fiftyPlugins --runs 5node --import tsx scripts/bench-gateway-startup.ts --case default --runs 5 --output .artifacts/gateway-startup.jsonรหัสกรณี: default, skipChannels (ข้ามการเริ่มต้นช่องทาง), oneInternalHook, allInternalHooks, fiftyPlugins (Plugin จากแมนิเฟสต์ 50 รายการ), fiftyStartupLazyPlugins (Plugin จากแมนิเฟสต์ที่โหลดแบบหน่วงเวลาเมื่อเริ่มต้น 50 รายการ)
ผลลัพธ์ประกอบด้วยเอาต์พุตแรกของกระบวนการ, /healthz, /readyz, เวลาในบันทึกการเริ่มฟัง HTTP, เวลาในบันทึกที่ Gateway พร้อมทำงาน, เวลา CPU, อัตราส่วนคอร์ CPU, RSS สูงสุด, ฮีป, เมตริกการติดตามการเริ่มต้น, ความหน่วงของลูปเหตุการณ์ และเมตริกรายละเอียดตารางค้นหา Plugin สคริปต์จะตั้งค่า OPENCLAW_GATEWAY_STARTUP_TRACE=1 ในสภาพแวดล้อมของ Gateway ลูก
/healthz ใช้ตรวจสอบว่าระบบยังทำงานอยู่ (เซิร์ฟเวอร์ HTTP สามารถตอบกลับได้) /readyz ใช้ตรวจสอบความพร้อมใช้งาน (ไซด์คาร์ Plugin ที่เริ่มต้นพร้อมระบบ ช่องทาง และงานหลังแนบที่สำคัญต่อความพร้อมทำงานเสร็จสิ้นแล้ว) ฮุกการเริ่มต้นจะถูกส่งแบบอะซิงโครนัสและไม่รวมอยู่ในการรับประกันความพร้อม เวลาในบันทึกความพร้อมคือการประทับเวลาภายในของ Gateway ซึ่งมีประโยชน์ต่อการระบุสาเหตุจากฝั่งกระบวนการ แต่ใช้แทนการตรวจสอบ /readyz จากภายนอกไม่ได้
ใช้ผลลัพธ์ JSON หรือ --output เมื่อเปรียบเทียบการเปลี่ยนแปลง ใช้ --cpu-prof-dir เฉพาะเมื่อผลลัพธ์การติดตามชี้ไปที่การนำเข้า การคอมไพล์ หรืองานที่ติดคอขวดด้าน CPU ซึ่งการจับเวลาของแต่ละระยะเพียงอย่างเดียวไม่สามารถอธิบายได้
การเริ่ม Gateway ใหม่ (scripts/bench-gateway-restart.ts)
รองรับเฉพาะ macOS และ Linux (ใช้ SIGUSR1 สำหรับการเริ่มใหม่ภายในกระบวนการ และจะล้มเหลวทันทีบน Windows) มีค่าเริ่มต้นเป็นจุดเข้าที่สร้างแล้วและรองรับการแทนที่ด้วย --entry scripts/run-node.mjs เช่นเดียวกับการเริ่มต้น Gateway ข้างต้น
pnpm test:restart:gateway -- --case skipChannels --runs 1 --restarts 5pnpm test:restart:gateway -- --case default --runs 3 --restarts 3 --warmup 1รหัสกรณี: skipChannels, skipChannelsAcpxProbe (เปิดการตรวจสอบ ACPX เมื่อเริ่มต้น), skipChannelsNoAcpxProbe (ปิดการตรวจสอบ), default, fiftyPlugins
ผลลัพธ์ประกอบด้วย /healthz ถัดไป, /readyz ถัดไป, ระยะเวลาหยุดให้บริการ, เวลาความพร้อมหลังเริ่มใหม่, CPU, RSS, เมตริกการติดตามการเริ่มต้นสำหรับกระบวนการทดแทน และเมตริกการติดตามการเริ่มใหม่สำหรับการจัดการสัญญาณ การรอให้งานที่กำลังทำงานเสร็จสิ้น ระยะการปิด การเริ่มครั้งถัดไป เวลาความพร้อม และสแนปช็อตหน่วยความจำ สคริปต์จะตั้งค่า OPENCLAW_GATEWAY_STARTUP_TRACE=1 และ OPENCLAW_GATEWAY_RESTART_TRACE=1
ใช้การวัดประสิทธิภาพนี้เมื่อการเปลี่ยนแปลงเกี่ยวข้องกับการส่งสัญญาณเริ่มใหม่ ตัวจัดการการปิด การเริ่มต้นหลังเริ่มใหม่ การปิดไซด์คาร์ การส่งมอบบริการ หรือความพร้อมหลังเริ่มใหม่ เริ่มด้วย skipChannels เพื่อแยกกลไกของ Gateway ออกจากการเริ่มต้นช่องทาง ใช้ default หรือกรณีที่มี Plugin จำนวนมากหลังจากกรณีขอบเขตแคบอธิบายเส้นทางการเริ่มใหม่ได้แล้วเท่านั้น เมตริกการติดตามเป็นเพียงข้อมูลบ่งชี้สำหรับการระบุสาเหตุ ไม่ใช่ข้อสรุป — ให้ตัดสินการเปลี่ยนแปลงด้านการเริ่มใหม่จากหลายตัวอย่าง ช่วงการทำงานของเจ้าของที่ตรงกัน พฤติกรรมของ /healthz//readyz และสัญญาการเริ่มใหม่ที่ผู้ใช้มองเห็น
E2E การเริ่มใช้งาน (Docker)
เลือกใช้ได้ จำเป็นเฉพาะสำหรับการทดสอบควันของการเริ่มใช้งานแบบคอนเทนเนอร์ ลำดับการเริ่มต้นใหม่ทั้งหมดในคอนเทนเนอร์ Linux ที่สะอาด:
scripts/e2e/onboard-docker.shควบคุมตัวช่วยแบบโต้ตอบผ่านเทอร์มินัลเสมือน ตรวจสอบไฟล์การกำหนดค่า/เวิร์กสเปซ/เซสชัน จากนั้นเริ่ม Gateway และเรียกใช้ openclaw health
การทดสอบควันการนำเข้า QR (Docker)
ตรวจสอบให้แน่ใจว่าตัวช่วยรันไทม์ QR ที่ดูแลอยู่สามารถโหลดได้ภายใต้รันไทม์ Docker Node ที่รองรับ (Node 24 เป็นค่าเริ่มต้น และเข้ากันได้กับ Node 22):
pnpm test:docker:qr