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

รายงานปัญหา ดูแหล่งที่มา รุ่น Nightly · 7.4 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

ดูที่ส่วนการวัดประสิทธิภาพ