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