Release and CI

การทดสอบ

ค่าเริ่มต้นสำหรับเอเจนต์

เซสชันของเอเจนต์รันการทดสอบและการตรวจสอบที่ใช้ทรัพยากรประมวลผลสูงจากระยะไกล ผ่าน Crabbox โดยโค้ดของผู้ดูแลที่เชื่อถือได้จะใช้ Blacksmith Testbox เป็นค่าเริ่มต้น เวิร์กโฟลว์ Testbox ที่กำหนดค่าไว้จะเติมข้อมูลประจำตัว ดังนั้นโค้ดจากผู้มีส่วนร่วมที่ ไม่น่าเชื่อถือหรือจากฟอร์กต้องใช้ CI ของฟอร์กที่ไม่มีข้อมูลลับ หรือใช้ AWS Crabbox โดยตรงที่ผ่านการปรับสภาพให้ปลอดภัยแทน

เมื่องานโค้ดที่เชื่อถือได้มีแนวโน้มต้องใช้การทดสอบหรือหลักฐานที่ใช้ทรัพยากรสูง ให้เริ่ม อุ่นเครื่องล่วงหน้าทันทีในเซสชันคำสั่งเบื้องหลัง ทำงานต่อระหว่างที่ระบบเติมข้อมูล นำรหัส tbx_... ที่ได้รับกลับมาใช้ซ้ำ ซิงค์เช็กเอาต์ปัจจุบันทุกครั้งที่รัน และ หยุดระบบก่อนส่งมอบงาน:

bash
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 ก่อนอัปโหลดสคริปต์ใด ๆ

ลำดับการทำงานภายในเครื่องตามปกติ

  1. pnpm test:changed สำหรับหลักฐาน Vitest ตามขอบเขตที่เปลี่ยนแปลง
  2. pnpm test <path-or-filter> สำหรับไฟล์ ไดเรกทอรี หรือเป้าหมายที่ระบุอย่างชัดเจนหนึ่งรายการ
  3. 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:e2e
  • pnpm test:e2e:gateway: การทดสอบควัน Gateway แบบต้นทางถึงปลายทาง (การจับคู่ WS/HTTP/Node แบบหลายอินสแตนซ์) ใช้ threads + isolate: false เป็นค่าเริ่มต้น พร้อมจำนวนเวิร์กเกอร์ที่ปรับได้ใน vitest.e2e.config.ts; ปรับด้วย OPENCLAW_E2E_WORKERS=<n> และเปิดบันทึกแบบละเอียดด้วย OPENCLAW_E2E_VERBOSE=1
  • pnpm 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_&lt;RESOURCE&gt;_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:changed
  • pnpm check
  • pnpm check:test-types
  • pnpm build
  • pnpm test
  • pnpm check:docs

หาก pnpm test ล้มเหลวเป็นครั้งคราวบนโฮสต์ที่มีภาระสูง ให้รันซ้ำหนึ่งครั้งก่อนถือว่าเป็นการถดถอย จากนั้นแยกตรวจสอบด้วย pnpm test <path/to/test> สำหรับโฮสต์ที่มีหน่วยความจำจำกัด:

  • OPENCLAW_VITEST_MAX_WORKERS=1 pnpm test
  • OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/tmp/openclaw-vitest-cache pnpm test:changed

เครื่องมือวัดประสิทธิภาพการทดสอบ

  • pnpm test:perf:imports: เปิดใช้การรายงานระยะเวลาการนำเข้าและรายละเอียดการนำเข้าของ Vitest โดยยังคงใช้การกำหนดเส้นทางเลนตามขอบเขตสำหรับเป้าหมายไฟล์/ไดเรกทอรีที่ระบุอย่างชัดเจน ส่วน pnpm test:perf:imports:changed จำกัดการทำโปรไฟล์แบบเดียวกันไว้เฉพาะไฟล์ที่เปลี่ยนแปลงนับตั้งแต่ origin/main
  • pnpm 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)
bash
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)
bash
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, status
  • real: 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.port
  • all: รวมชุดค่าที่กำหนดไว้ล่วงหน้าทั้งสองชุด

ผลลัพธ์ประกอบด้วย 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 เพื่อวัดตัวรันซอร์สแทน และแยกผลลัพธ์เหล่านั้นออกจากค่าฐานของจุดเข้าที่สร้างแล้ว

bash
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 ข้างต้น

bash
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 ที่สะอาด:

bash
scripts/e2e/onboard-docker.sh

ควบคุมตัวช่วยแบบโต้ตอบผ่านเทอร์มินัลเสมือน ตรวจสอบไฟล์การกำหนดค่า/เวิร์กสเปซ/เซสชัน จากนั้นเริ่ม Gateway และเรียกใช้ openclaw health

การทดสอบควันการนำเข้า QR (Docker)

ตรวจสอบให้แน่ใจว่าตัวช่วยรันไทม์ QR ที่ดูแลอยู่สามารถโหลดได้ภายใต้รันไทม์ Docker Node ที่รองรับ (Node 24 เป็นค่าเริ่มต้น และเข้ากันได้กับ Node 22):

bash
pnpm test:docker:qr

ที่เกี่ยวข้อง

Was this useful?
On this page

On this page