หน้านี้มีไว้สําหรับผู้ใช้ Bazel ที่เขียนกฎบิลด์และการทดสอบที่กําหนดเอง ที่ต้องการทำความเข้าใจข้อกำหนดของกฎของ Bazel ในบริบทของ การดำเนินการจากระยะไกล
การดำเนินการระยะไกลทำให้ Bazel สามารถดำเนินการบนแพลตฟอร์มที่แยกต่างหากได้ เช่น ศูนย์ข้อมูล Bazel ใช้ โปรโตคอล gRPC สำหรับการดำเนินการจากระยะไกล คุณลองดำเนินการจากระยะไกลได้ด้วย bazel-buildfarm โปรเจ็กต์โอเพนซอร์สที่มุ่งให้บริการการดำเนินการจากระยะไกลแบบกระจาย ที่มีการจัดการครบวงจรได้เลย
หน้านี้ใช้คำศัพท์ต่อไปนี้เมื่ออ้างอิงถึง ประเภทสภาพแวดล้อมหรือแพลตฟอร์มต่อไปนี้
- แพลตฟอร์มโฮสต์ - ที่ Bazel ทำงาน
- แพลตฟอร์มการดำเนินการ - ที่มีการดำเนินการของ Bazel
- แพลตฟอร์มเป้าหมาย - ที่เอาต์พุตของบิลด์ (และการกระทำบางอย่าง) ทำงาน
ภาพรวม
เมื่อกำหนดค่าบิลด์ Bazel สำหรับการดำเนินการจากระยะไกล คุณต้องปฏิบัติตาม หลักเกณฑ์ที่อธิบายไว้ในหน้านี้เพื่อให้มั่นใจว่าบิลด์จะทำงานจากระยะไกล โดยปราศจากข้อผิดพลาด เนื่องจากลักษณะของการดำเนินการจากระยะไกล ได้แก่
การดำเนินการบิลด์ที่แยกออกมา เครื่องมือสร้างไม่เก็บสถานะและทรัพยากร Dependency ไว้ ไม่รั่วไหลออกไป
สภาพแวดล้อมการดำเนินการที่หลากหลาย การกำหนดค่าบิลด์ในเครื่องไม่ใช่การกำหนดค่าเสมอไป ซึ่งเหมาะสำหรับสภาพแวดล้อมการดำเนินการระยะไกล
หน้านี้อธิบายปัญหาที่อาจเกิดขึ้นเมื่อใช้ Bazel ที่กำหนดเอง สร้างและทดสอบกฎสำหรับการดำเนินการจากระยะไกลและวิธีหลีกเลี่ยง ซึ่งครอบคลุมถึง หัวข้อต่อไปนี้:
- การเรียกใช้เครื่องมือสร้างผ่านกฎเครื่องมือเชน
- การจัดการทรัพยากร Dependency โดยนัย
- การจัดการไบนารีที่ขึ้นอยู่กับแพลตฟอร์ม
- การจัดการกฎ WORKSPACE รูปแบบการกำหนดค่า
การเรียกใช้เครื่องมือสร้างผ่านกฎ 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
ก่อนหน้านี้ ดังที่แสดงที่นี่