กำลังโทรหา Bazel จากสคริปต์

คุณสามารถเรียกใช้ Bazel จากสคริปต์เพื่อทำการบิลด์ เรียกใช้การทดสอบ หรือค้นหากราฟทรัพยากร Dependency Bazel ได้รับการออกแบบมาเพื่อให้การเขียนสคริปต์มีประสิทธิภาพ แต่ส่วนนี้จะแสดงรายละเอียดบางอย่างที่ควรทราบเพื่อให้สคริปต์มีความเสถียรมากขึ้น

การเลือกฐานเอาต์พุต

ตัวเลือก --output_base จะควบคุมตำแหน่งที่กระบวนการ Bazel ควรเขียนเอาต์พุตของบิลด์ รวมถึงไฟล์งานต่างๆ ที่ Bazel ใช้ภายใน ซึ่งหนึ่งในนั้นคือการล็อกที่ป้องกันการเปลี่ยนแปลงฐานเอาต์พุตพร้อมกันโดยกระบวนการ Bazel หลายรายการ

การเลือกไดเรกทอรีฐานเอาต์พุตที่ถูกต้องสำหรับสคริปต์ขึ้นอยู่กับปัจจัยหลายประการ หากต้องการวางเอาต์พุตของบิลด์ไว้ในตำแหน่งที่เฉพาะเจาะจง ตำแหน่งดังกล่าวจะเป็นตัวกำหนดฐานเอาต์พุตที่คุณต้องใช้ หากคุณเรียกใช้ Bazel แบบ "อ่านอย่างเดียว" (เช่น bazel query) ปัจจัยการล็อกจะมีความสำคัญมากขึ้น โดยเฉพาะอย่างยิ่ง หากคุณต้องการเรียกใช้สคริปต์หลายอินสแตนซ์พร้อมกัน คุณควรทราบว่ากระบวนการเซิร์ฟเวอร์ Blaze แต่ละรายการจัดการการเรียกใช้ได้ครั้งละ 1 รายการเท่านั้น ในครั้งเดียว ทั้งนี้ขึ้นอยู่กับสถานการณ์ คุณอาจต้องให้แต่ละอินสแตนซ์ของสคริปต์รอตามลำดับ หรือใช้ --output_base เพื่อเรียกใช้เซิร์ฟเวอร์ Blaze หลายรายการและใช้เซิร์ฟเวอร์เหล่านั้น

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

หมายเหตุเกี่ยวกับโหมดเซิร์ฟเวอร์

โดยค่าเริ่มต้น Bazel จะใช้กระบวนการเซิร์ฟเวอร์ที่ทำงานเป็นเวลานานเพื่อเพิ่ม ประสิทธิภาพ เมื่อเรียกใช้ Bazel ในสคริปต์ อย่าลืมเรียกใช้ shutdown เมื่อคุณใช้งานเซิร์ฟเวอร์เสร็จแล้ว หรือระบุ --max_idle_secs=5 เพื่อให้เซิร์ฟเวอร์ที่ไม่มีการใช้งานปิดตัวเองโดยทันที

ฉันจะได้รับโค้ดสำหรับออกที่เท่าใด

Bazel พยายามแยกความแตกต่างระหว่างความล้มเหลวที่เกิดจากซอร์สโค้ดที่พิจารณา กับข้อผิดพลาดภายนอกที่ป้องกันไม่ให้ Bazel ทำงานอย่างถูกต้อง การดำเนินการ Bazel อาจส่งผลให้เกิดโค้ดสำหรับออกที่ต่อไปนี้

โค้ดสำหรับออกที่ใช้ร่วมกันในทุกคำสั่ง:

  • 0 - สำเร็จ
  • 2 - ปัญหาบรรทัดคำสั่ง, แฟล็กหรือการผสมคำสั่งที่ไม่ถูกต้องหรือไม่ได้รับอนุญาต หรือ ตัวแปรสภาพแวดล้อมที่ไม่ถูกต้อง คุณต้องแก้ไขบรรทัดคำสั่ง
  • 8 - บิลด์ถูกขัดจังหวะ แต่เราสิ้นสุดด้วยการปิดระบบอย่างเป็นระเบียบ
  • 9 - การล็อกเซิร์ฟเวอร์ถูกระงับและมีการส่ง --noblock_for_lock
  • 32 - ข้อผิดพลาดของสภาพแวดล้อมภายนอกไม่ได้อยู่ในเครื่องนี้

  • 33 - หน่วยความจำของ Bazel มีไม่เพียงพอและระบบหยุดทำงาน คุณต้องแก้ไขบรรทัดคำสั่ง

  • 34 - สงวนไว้สำหรับการใช้งานภายในของ Google

  • 35 - สงวนไว้สำหรับการใช้งานภายในของ Google

  • 36 - ปัญหาเกี่ยวกับสภาพแวดล้อมในเครื่อง ซึ่งคาดว่าจะเป็นปัญหาถาวร

  • 37 - ข้อยกเว้นที่ไม่ได้จัดการ / ข้อผิดพลาดภายในของ Bazel

  • 38 - ข้อผิดพลาดชั่วคราวในการเผยแพร่ผลลัพธ์ไปยังบริการ Build Event

  • 39 - ระบบนำ Blob ที่ Bazel ต้องการออกจากแคชระยะไกล

  • 41-44 - สงวนไว้สำหรับการใช้งานภายในของ Google

  • 45 - ข้อผิดพลาดถาวรในการเผยแพร่ผลลัพธ์ไปยังบริการ Build Event

  • 47 - สงวนไว้สำหรับการใช้งานภายในของ Google

  • 49 - สงวนไว้สำหรับการใช้งานภายในของ Google

โค้ดการคืนค่าสำหรับคำสั่ง bazel build, bazel test:

  • 1 - บิลด์ล้มเหลว
  • 3 - บิลด์สำเร็จ แต่การทดสอบบางรายการล้มเหลวหรือหมดเวลา
  • 4 - บิลด์สำเร็จ แต่ไม่พบการทดสอบแม้ว่าจะมีการขอทดสอบก็ตาม

สำหรับ bazel run:

  • 1 - บิลด์ล้มเหลว
  • หากบิลด์สำเร็จ แต่กระบวนการย่อยที่ดำเนินการคืนค่าโค้ดสำหรับออกที่ไม่ใช่ 0 โค้ดสำหรับออกดังกล่าวจะเป็นโค้ดสำหรับออกของคำสั่งด้วย

สำหรับ bazel query:

  • 3 - สำเร็จบางส่วน แต่การค้นหาพบข้อผิดพลาดอย่างน้อย 1 รายการใน ชุดไฟล์ BUILD อินพุต ดังนั้นผลลัพธ์ของการดำเนินการจึงไม่น่าเชื่อถือ 100% ซึ่งอาจเกิดจากตัวเลือก --keep_going ในบรรทัดคำสั่ง
  • 7 - คำสั่งล้มเหลว

Bazel เวอร์ชันในอนาคตอาจเพิ่มโค้ดสำหรับออกที่เพิ่มเติม โดยแทนที่โค้ดสำหรับออกที่แสดงความล้มเหลวทั่วไป 1 ด้วยค่าที่ไม่ใช่ 0 อื่นๆ ที่มีความหมายเฉพาะ อย่างไรก็ตาม ค่าสำหรับออกที่ไม่ใช่ 0 ทั้งหมดจะถือเป็นข้อผิดพลาดเสมอ

การอ่านไฟล์ .bazelrc

โดยค่าเริ่มต้น Bazel จะอ่านไฟล์ .bazelrc จากไดเรกทอรีพื้นที่ทำงานฐาน หรือไดเรกทอรีหลักของผู้ใช้ การอ่านไฟล์ดังกล่าวหรือไม่นั้นขึ้นอยู่กับสคริปต์ของคุณ หากสคริปต์ต้องมีความเสถียรอย่างสมบูรณ์ (เช่น เมื่อทำการบิลด์เวอร์ชันที่เผยแพร่) คุณควรปิดใช้การอ่านไฟล์ .bazelrc โดยใช้ตัวเลือก --bazelrc=/dev/null หากต้องการทำการบิลด์โดยใช้การตั้งค่าที่ผู้ใช้ต้องการ ลักษณะการทำงานเริ่มต้นจะดีกว่า

บันทึกคำสั่ง

เอาต์พุตของ Bazel ยังมีอยู่ในไฟล์บันทึกคำสั่ง ซึ่งคุณดูได้ด้วยคำสั่งต่อไปนี้

bazel info command_log

ไฟล์บันทึกคำสั่งจะมีสตรีม stdout และ stderr ที่สลับกันของคำสั่ง Bazel ล่าสุด โปรดทราบว่าการเรียกใช้ bazel info จะเขียนทับเนื้อหาของไฟล์นี้ เนื่องจากไฟล์นี้จะกลายเป็นคำสั่ง Bazel ล่าสุด อย่างไรก็ตาม ตำแหน่งของไฟล์บันทึกคำสั่งจะไม่เปลี่ยนแปลง เว้นแต่คุณจะเปลี่ยนการตั้งค่าตัวเลือก --output_base หรือ --output_user_root

การแยกวิเคราะห์เอาต์พุต

เอาต์พุตของ Bazel แยกวิเคราะห์ได้ง่ายมากสำหรับวัตถุประสงค์หลายอย่าง ตัวเลือก 2 รายการที่อาจ เป็นประโยชน์สำหรับสคริปต์ของคุณ ได้แก่ --noshow_progress ซึ่งจะระงับข้อความแสดงความคืบหน้า และ --show_result n ซึ่งจะควบคุมว่าจะพิมพ์ข้อความ "build up-to-date" หรือ ไม่ คุณสามารถแยกวิเคราะห์ข้อความเหล่านี้เพื่อดูว่าเป้าหมายใดที่สร้างขึ้นสำเร็จและตำแหน่งของไฟล์เอาต์พุต ที่เป้าหมายเหล่านั้นสร้างขึ้น อย่าลืมระบุค่า n ที่มีขนาดใหญ่มากหากคุณต้องใช้ข้อความเหล่านี้

การแก้ปัญหาด้านประสิทธิภาพด้วยการสร้างโปรไฟล์

ดูส่วนการสร้างโปรไฟล์ประสิทธิภาพ