การปรับกฎของ Bazel เพื่อการเรียกใช้ระยะไกล

รายงานปัญหา ดูซอร์สโค้ด รุ่น Nightly · 8.0 7.4 7.3 · 7.2 · 7.1 · 7.0 · 6.5

หน้านี้มีไว้สําหรับผู้ใช้ Bazel ที่เขียนกฎการบิลด์และการทดสอบที่กําหนดเองซึ่งต้องการทําความเข้าใจข้อกําหนดสําหรับกฎ Bazel ในบริบทของการดำเนินการระยะไกล

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

หน้านี้ใช้คำศัพท์ต่อไปนี้เมื่อกล่าวถึงประเภทสภาพแวดล้อมหรือแพลตฟอร์มต่างๆ

  • แพลตฟอร์มโฮสต์ - แพลตฟอร์มที่ Bazel ทำงาน
  • แพลตฟอร์มการดําเนินการ - แพลตฟอร์มที่เรียกใช้การดำเนินการของ Bazel
  • แพลตฟอร์มเป้าหมาย - แพลตฟอร์มที่รันเอาต์พุตการสร้าง (และการดำเนินการบางอย่าง)

ภาพรวม

เมื่อกำหนดค่าบิลด์ Bazel สำหรับการเรียกใช้จากระยะไกล คุณต้องปฏิบัติตามหลักเกณฑ์ที่อธิบายไว้ในหน้านี้เพื่อให้บิลด์ทำงานจากระยะไกลได้โดยไม่มีข้อผิดพลาด สาเหตุนี้เกิดจากลักษณะของการดําเนินการจากระยะไกล ดังนี้

  • การดำเนินการสร้างแบบแยก เครื่องมือสร้างจะไม่เก็บสถานะและ Dependency ไว้ และไม่สามารถรั่วไหลระหว่างเครื่องมือสร้าง

  • สภาพแวดล้อมการดําเนินการแบบหลากหลาย การกําหนดค่าบิลด์ในเครื่องอาจไม่เหมาะกับสภาพแวดล้อมการดําเนินการระยะไกลเสมอไป

หน้านี้อธิบายปัญหาที่อาจเกิดขึ้นเมื่อใช้กฎการสร้างและทดสอบ Bazel ที่กําหนดเองสําหรับการดําเนินการจากระยะไกล และวิธีหลีกเลี่ยงปัญหา โดยจะครอบคลุมหัวข้อต่อไปนี้

การเรียกใช้เครื่องมือสร้างผ่านกฎชุดเครื่องมือ

กฎเครื่องมือทํางานของ Bazel คือผู้ให้บริการการกําหนดค่าที่จะบอกกฎการสร้างว่าจะใช้เครื่องมือสร้างใด เช่น คอมไพเลอร์และโปรแกรมลิงก์ และวิธีกําหนดค่าโดยใช้พารามิเตอร์ที่ครีเอเตอร์ของกฎกําหนด กฎชุดเครื่องมือช่วยให้กฎการสร้างและทดสอบเรียกใช้เครื่องมือสร้างในลักษณะที่คาดการณ์ได้และกำหนดค่าไว้ล่วงหน้า ซึ่งเข้ากันได้กับการดำเนินการระยะไกล เช่น ใช้กฎชุดเครื่องมือแทนการเรียกใช้เครื่องมือสร้างผ่าน PATH, JAVA_HOME หรือตัวแปรอื่นๆ ในพื้นที่ ซึ่งอาจไม่ได้ตั้งค่าเป็นค่าที่เทียบเท่า (หรือไม่ตั้งค่าเลย) ในสภาพแวดล้อมการเรียกใช้ระยะไกล

ปัจจุบันมีกฎสำหรับเครื่องมือทํางานของ Bazel และกฎการทดสอบสําหรับภาษา Scala, Rust และ Go และเรากําลังพัฒนากฎเครื่องมือทํางานใหม่สําหรับภาษาและเครื่องมืออื่นๆ เช่น bash หากไม่มีกฎสำหรับเครื่องมือที่ใช้กฎ ให้พิจารณาสร้างกฎสำหรับเครื่องมือ

การจัดการทรัพยากร Dependency ที่ไม่ระบุ

หากเครื่องมือสร้างเข้าถึงทรัพยากร Dependencies ต่างๆ ของการดำเนินการสร้างได้ การดําเนินการเหล่านั้นจะดำเนินการไม่สำเร็จเมื่อดำเนินการจากระยะไกล เนื่องจากการดำเนินการสร้างจากระยะไกลแต่ละรายการจะดำเนินการแยกจากกัน เครื่องมือสร้างบางรายการจะเก็บสถานะไว้สำหรับการดำเนินการสร้างและเข้าถึงทรัพยากร Dependency ที่ไม่ได้รวมไว้ในการเรียกใช้เครื่องมืออย่างชัดเจน ซึ่งจะทำให้การดำเนินการสร้างที่ดำเนินการจากระยะไกลไม่สำเร็จ

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

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

การจัดการไบนารีที่ขึ้นอยู่กับแพลตฟอร์ม

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

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

  • จัดส่งหรืออ้างอิงซอร์สโค้ดของเครื่องมือภายนอกเพื่อให้สร้างแพลตฟอร์มการเรียกใช้ระยะไกลได้

  • ติดตั้งเครื่องมือล่วงหน้าในสภาพแวดล้อมการเรียกใช้ระยะไกล (เช่น คอนเทนเนอร์เครื่องมือ) หากเครื่องมือมีเสถียรเพียงพอ และใช้กฎเครื่องมือเพื่อเรียกใช้ในบิลด์

การจัดการกฎ WORKSPACE สไตล์การกําหนดค่า

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

การดําเนินการต่อไปนี้ที่กฎ WORKSPACE ดําเนินใช้ไม่ได้กับการดําเนินการจากระยะไกล

  • การสร้างไบนารี การดำเนินการคอมไพล์ในกฎ WORKSPACE จะส่งผลให้ไฟล์ไบนารีใช้ร่วมกับแพลตฟอร์มการเรียกใช้ระยะไกลไม่ได้หากแพลตฟอร์มนั้นแตกต่างจากแพลตฟอร์มโฮสต์

  • การติดตั้งแพ็กเกจ pip กฎของแพ็กเกจ pip ที่ติดตั้งผ่าน WORKSPACE requires กำหนดให้ต้องติดตั้งแพ็กเกจที่ต้องพึ่งพาไว้ล่วงหน้าบนแพลตฟอร์มโฮสต์ แพ็กเกจดังกล่าวซึ่งสร้างขึ้นสำหรับแพลตฟอร์มโฮสต์โดยเฉพาะจะใช้ร่วมกับแพลตฟอร์มการเรียกใช้จากระยะไกลไม่ได้หากแพลตฟอร์มดังกล่าวแตกต่างจากแพลตฟอร์มโฮสต์

  • การซิงค์กับเครื่องมือหรืออาร์ติแฟกต์ในเครื่อง ลิงก์สัญลักษณ์ไปยังเครื่องมือหรือไลบรารีที่ติดตั้งในแพลตฟอร์มโฮสต์ซึ่งสร้างผ่านกฎ WORKSPACE จะทําให้การสร้างไม่สําเร็จในแพลตฟอร์มการดําเนินการระยะไกลเนื่องจาก Bazel จะหาไม่พบ แต่ให้สร้างลิงก์สัญลักษณ์โดยใช้การดำเนินการสร้างมาตรฐานเพื่อให้เข้าถึงเครื่องมือและไลบรารีที่ใช้ลิงก์สัญลักษณ์ได้จากrunfiles ต้นไม้ของ Bazel อย่าใช้ repository_ctx.symlink เพื่อลิงก์สัญลักษณ์ไฟล์เป้าหมายที่อยู่นอกไดเรกทอรีรีโปภายนอก

  • การทำให้แพลตฟอร์มโฮสต์เปลี่ยนแปลง หลีกเลี่ยงการสร้างไฟล์นอกต้นไม้ Bazelrunfiles การสร้างตัวแปรสภาพแวดล้อม และการดําเนินการอื่นๆ ที่คล้ายกัน เนื่องจากอาจทํางานในลักษณะที่ไม่คาดคิดบนแพลตฟอร์มการดําเนินการระยะไกล

คุณสามารถใช้บันทึกกฎของ Workspace เพื่อช่วยค้นหาลักษณะการทำงานที่อาจไม่เป็นไปตามข้อกำหนดการแยกส่วน

หากทรัพยากรภายนอกดำเนินการบางอย่างที่ขึ้นอยู่กับแพลตฟอร์มโฮสต์ คุณควรแยกการดำเนินการเหล่านั้นระหว่าง WORKSPACE กับกฎการสร้าง ดังนี้

  • การตรวจสอบแพลตฟอร์มและการแจกแจงรายการทรัพยากร Dependency การดำเนินการเหล่านี้ทำงานได้แบบปลอดภัยในเครื่องผ่านกฎ WORKSPACE ซึ่งสามารถตรวจสอบว่ามีการติดตั้งไลบรารีใดบ้าง ดาวน์โหลดแพ็กเกจที่ต้องสร้าง และเตรียมอาร์ติแฟกต์ที่จำเป็นสำหรับการคอมไพล์ สําหรับการดําเนินการจากระยะไกล กฎเหล่านี้ต้องรองรับการใช้อาร์ติแฟกต์ที่ตรวจสอบล่วงหน้าด้วย เพื่อระบุข้อมูลที่ปกติจะได้รับระหว่างการตรวจสอบแพลตฟอร์มโฮสต์ ออบเจ็กต์ตรวจสอบล่วงหน้าช่วยให้ Bazel อธิบายทรัพยากร Dependencies ได้ราวกับว่าอยู่ในเครื่อง ใช้คำสั่งแบบมีเงื่อนไขหรือ Flag --override_repository

  • การสร้างหรือคอมไพล์อาร์ติแฟกต์เฉพาะเป้าหมายและการกลายพันธุ์ของแพลตฟอร์ม การดำเนินการเหล่านี้ต้องดำเนินการผ่านกฎการสร้างปกติ การดำเนินการที่ก่อให้เกิดอาร์ติแฟกต์เฉพาะเป้าหมายสําหรับทรัพยากรภายนอกต้องดําเนินการระหว่างการบิลด์

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

ตัวอย่างเช่น สำหรับกฎของ Tensorflow สำหรับ cuda และ python กฎ WORKSPACE จะสร้าง BUILD files ดังต่อไปนี้ สําหรับการเรียกใช้ในเครื่อง ระบบจะใช้ไฟล์ที่สร้างขึ้นจากการตรวจสอบสภาพแวดล้อมโฮสต์ สําหรับการดําเนินการจากระยะไกล คำสั่งแบบมีเงื่อนไขในตัวแปรสภาพแวดล้อมจะช่วยให้กฎใช้ไฟล์ที่เช็คอินไปยังที่เก็บได้

ไฟล์ BUILD จะประกาศ genrules ที่ทำงานได้ทั้งแบบในเครื่องและจากระยะไกล รวมถึงดำเนินการประมวลผลที่จำเป็นซึ่งก่อนหน้านี้ทำผ่าน repository_ctx.symlink ตามที่แสดงที่นี่