สร้างโปรโตคอลเหตุการณ์

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

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

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

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

  • รายการย่อย: เหตุการณ์บิลด์อาจประกาศเหตุการณ์บิลด์อื่นๆ โดยการใส่ ตัวระบุเหตุการณ์บิลด์ของเหตุการณ์เหล่านั้นในช่อง รายการย่อย ตัวอย่างเช่น เหตุการณ์บิลด์ PatternExpanded จะประกาศเป้าหมายที่ขยายเป็นรายการย่อย โปรโตคอลรับประกันว่าเหตุการณ์ทั้งหมด ยกเว้นเหตุการณ์แรก จะได้รับการประกาศโดยเหตุการณ์ก่อนหน้า

  • เพย์โหลด: เพย์โหลดมีข้อมูลที่มีโครงสร้างเกี่ยวกับเหตุการณ์บิลด์ ซึ่งเข้ารหัสเป็นข้อความบัฟเฟอร์โปรโตคอลที่เฉพาะเจาะจงสำหรับเหตุการณ์นั้น โปรดทราบว่าเพย์โหลดอาจไม่ใช่ประเภทที่คาดไว้ แต่อาจเป็นข้อความ Aborted หากการบิลด์ถูกยกเลิกก่อนเวลา

กราฟเหตุการณ์บิลด์

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

โครงสร้างของกราฟเหตุการณ์จะแสดงวงจรชีวิตของคำสั่ง กราฟ BEP ทุกกราฟมีรูปร่างลักษณะดังนี้

  1. เหตุการณ์รากจะเป็นBuildStarted เหตุการณ์เสมอ เหตุการณ์อื่นๆ ทั้งหมดเป็นเหตุการณ์ที่สืบทอดมาจากเหตุการณ์ราก
  2. เหตุการณ์ย่อยโดยตรงของเหตุการณ์ BuildStarted จะมีข้อมูลเมตาเกี่ยวกับคำสั่ง
  3. เหตุการณ์ที่มีข้อมูลที่สร้างโดยคำสั่ง เช่น ไฟล์ที่บิลด์และผลการทดสอบ จะปรากฏก่อนเหตุการณ์ BuildFinished
  4. เหตุการณ์ BuildFinished อาจ ตามด้วยเหตุการณ์ที่มีข้อมูลสรุปเกี่ยวกับการบิลด์ (เช่น เมตริก หรือข้อมูลการสร้างโปรไฟล์)

การใช้โปรโตคอลเหตุการณ์บิลด์

ใช้ในรูปแบบไบนารี

วิธีใช้ BEP ในรูปแบบไบนารี

  1. ให้ Bazel ทำให้ข้อความบัฟเฟอร์โปรโตคอลเป็นอนุกรมลงในไฟล์โดยระบุตัวเลือก --build_event_binary_file=/path/to/file ไฟล์จะมีข้อความบัฟเฟอร์โปรโตคอลที่เป็นอนุกรม โดยแต่ละข้อความจะมีการจำกัดความยาว แต่ละข้อความจะขึ้นต้นด้วยความยาวที่เข้ารหัสเป็นจำนวนเต็มความยาวผันแปร คุณสามารถอ่านรูปแบบนี้ได้โดยใช้วิธี parseDelimitedFrom(InputStream) ของไลบรารีบัฟเฟอร์โปรโตคอล

  2. จากนั้น ให้เขียนโปรแกรมที่แยกข้อมูลที่เกี่ยวข้องจากข้อความบัฟเฟอร์โปรโตคอลที่เป็นอนุกรม

ใช้ในรูปแบบข้อความหรือ JSON

แฟล็กบรรทัดคำสั่ง Bazel ต่อไปนี้จะแสดงผล BEP ในรูปแบบที่มนุษย์อ่านได้ เช่น ข้อความและ JSON

--build_event_text_file
--build_event_json_file

บริการเหตุการณ์บิลด์

โปรโตคอลบริการเหตุการณ์บิลด์เป็นบริการ gRPCทั่วไปสำหรับการเผยแพร่เหตุการณ์บิลด์ โปรโตคอลบริการเหตุการณ์บิลด์ไม่ขึ้นอยู่กับ BEP และถือว่าเหตุการณ์ BEP เป็นไบต์ทึบแสง Bazel มาพร้อมกับการใช้งานไคลเอ็นต์ gRPC ของโปรโตคอลบริการเหตุการณ์บิลด์ที่เผยแพร่เหตุการณ์โปรโตคอลเหตุการณ์บิลด์ คุณสามารถระบุปลายทางที่จะส่งเหตุการณ์ได้โดยใช้แฟล็ก --bes_backend=HOST:PORT หากแบ็กเอนด์ใช้ gRPC คุณต้องนำหน้าแอดเดรสด้วยสคีมาที่เหมาะสม ได้แก่ grpc:// สำหรับ gRPC แบบข้อความธรรมดา และ grpcs:// สำหรับ gRPC ที่เปิดใช้ TLS

แฟล็กบริการเหตุการณ์บิลด์

Bazel มีแฟล็กหลายรายการที่เกี่ยวข้องกับโปรโตคอลบริการเหตุการณ์บิลด์ ซึ่งรวมถึง

  • --bes_backend
  • --[no]bes_lifecycle_events
  • --bes_results_url
  • --bes_timeout
  • --bes_instance_name

ดูคำอธิบายของแฟล็กแต่ละรายการได้ที่ ข้อมูลอ้างอิงบรรทัดคำสั่ง

การตรวจสอบสิทธิ์และความปลอดภัย

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

  • --[no]google_default_credentials
  • --google_credentials
  • --google_auth_scopes
  • --tls_certificate
  • --[no]tls_enabled

ดูคำอธิบายของแฟล็กแต่ละรายการได้ที่ ข้อมูลอ้างอิงบรรทัดคำสั่ง

บริการเหตุการณ์บิลด์และการแคชระยะไกล

โดยปกติแล้ว BEP จะมีการอ้างอิงไฟล์บันทึก (test.log, test.xml ฯลฯ) จำนวนมากที่จัดเก็บไว้ในเครื่องที่ Bazel ทำงานอยู่ เซิร์ฟเวอร์ BES ระยะไกลมักจะเข้าถึงไฟล์เหล่านี้ไม่ได้เนื่องจากไฟล์อยู่ในเครื่องอื่น วิธีแก้ปัญหาคือใช้ Bazel กับ การแคชระยะไกล Bazel จะอัปโหลดไฟล์เอาต์พุตทั้งหมดไปยังแคชระยะไกล (รวมถึงไฟล์ที่อ้างอิงใน BEP) จากนั้นเซิร์ฟเวอร์ BES จะดึงไฟล์ที่อ้างอิงจากแคชได้

ดูรายละเอียดเพิ่มเติมได้ที่ปัญหา GitHub 3689สำหรับ