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

คุณสามารถเรียกใช้ Bazel จากสคริปต์เพื่อทำการบิลด์ ทดสอบ หรือค้นหากราฟการขึ้นต่อกันได้ 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 จากไดเรกทอรีพื้นที่ทำงานฐาน หรือไดเรกทอรีหลักของผู้ใช้ การอ่านไฟล์ดังกล่าวหรือไม่นั้นขึ้นอยู่กับสคริปต์ของคุณ หากสคริปต์ต้องเป็นแบบ hermetic อย่างสมบูรณ์ (เช่น เมื่อทำการบิลด์เวอร์ชันที่เผยแพร่) คุณควรปิดใช้การอ่านไฟล์ .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 ที่มีขนาดใหญ่มากหากคุณใช้ข้อความเหล่านี้

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

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