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

รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

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

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

ภาพรวม

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

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

  • สภาพแวดล้อมการดำเนินการที่หลากหลาย การกำหนดค่าบิลด์ในเครื่องไม่ใช่การกำหนดค่าเสมอไป ซึ่งเหมาะสำหรับสภาพแวดล้อมการดำเนินการระยะไกล

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

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

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

ปัจจุบันกฎห่วงโซ่เครื่องมือมีอยู่สำหรับกฎการสร้างและทดสอบของ Bazel สำหรับ Scala สนิม และ Go และกฎเชนใหม่ก็กำลังจะเปิดตัวในภาษาและเครื่องมืออื่นๆ เช่น Bash หากไม่มีกฎ Toolchain สำหรับเครื่องมือที่กฎของคุณใช้ โปรดพิจารณา การสร้างกฎ Toolchain

การจัดการทรัพยากร Dependency โดยนัย

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

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

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

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

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

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

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

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

การจัดการกฎ WORKSPACE รูปแบบการกำหนดค่า

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

การดำเนินการต่อไปนี้ซึ่งดำเนินการโดยกฎ WORKSPACE ไม่สามารถใช้งานร่วมกับ การดำเนินการจากระยะไกล:

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

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

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

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

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

หากทรัพยากร Dependency ภายนอกเรียกใช้การดำเนินการที่เฉพาะเจาะจงโดยอิงตามโฮสต์ คุณควรแยกการดำเนินการเหล่านั้นระหว่าง WORKSPACE และสร้าง ดังต่อไปนี้

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

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

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

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

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