หน้านี้มีไว้สําหรับผู้ใช้ Bazel ที่เขียนกฎที่กําหนดเองและการทดสอบกฎที่ต้องการทําความเข้าใจข้อกําหนดสําหรับกฎ Bazel ในบริบทของการดําเนินการระยะไกล
การดําเนินการจากระยะไกลช่วยให้ Bazel ดําเนินการกับแพลตฟอร์มต่างๆ แยกกันได้ เช่น ศูนย์ข้อมูล Bazel ใช้โปรโตคอล gRPC สําหรับการดําเนินการระยะไกล คุณอาจลองใช้การดําเนินการระยะไกลด้วย bazel-buildfarm ซึ่งเป็นโปรเจ็กต์โอเพนซอร์สที่มุ่งหมายจะเป็นแพลตฟอร์มการดําเนินการระยะไกลแบบกระจาย
หน้านี้ใช้คําศัพท์ต่อไปนี้เมื่อพูดถึงประเภทสภาพแวดล้อมหรือแพลตฟอร์มต่างๆ
- แพลตฟอร์มโฮสต์ - ที่ Bazel ทํางานอยู่
- แพลตฟอร์มการดําเนินการ - ลักษณะการทํางานของ Bazel
- แพลตฟอร์มเป้าหมาย - ที่เอาต์พุตของบิลด์ (และการดําเนินการบางอย่าง) จะทํางาน
ภาพรวม
เมื่อกําหนดค่าบิลด์ Bazel สําหรับการดําเนินการระยะไกล คุณต้องปฏิบัติตามหลักเกณฑ์ที่อธิบายในหน้านี้เพื่อให้บิลด์ทํางานได้จากระยะไกลโดยไม่มีข้อผิดพลาด เนื่องจากลักษณะของการดําเนินการระยะไกล กล่าวคือ
การดําเนินการสร้างที่แยกไว้ เครื่องมือสร้างจะไม่เก็บสถานะไว้ และทรัพยากร Dependency จะรั่วไหลระหว่างกันไม่ได้
สภาพแวดล้อมการดําเนินการที่หลากหลาย การกําหนดค่าบิลด์ในเครื่องอาจไม่เหมาะกับสภาพแวดล้อม การดําเนินการระยะไกลเสมอไป
หน้านี้อธิบายปัญหาที่อาจเกิดขึ้นเมื่อใช้การสร้างบิลด์และทดสอบกฎที่กําหนดเองสําหรับการดําเนินการระยะไกลและวิธีหลีกเลี่ยง โดยจะครอบคลุมหัวข้อต่อไปนี้
- การเรียกใช้เครื่องมือสร้างผ่านกฎของเครื่องมือเชน
- การจัดการทรัพยากร Dependency แบบโดยนัย
- การจัดการไบนารีที่ขึ้นอยู่กับแพลตฟอร์ม
- การจัดการกฎ WORKSPACE แบบกําหนดค่า
การเรียกใช้เครื่องมือสร้างผ่านกฎของเครื่องมือเชน
กฎของเครื่องมือเชน Bazel เป็นผู้ให้บริการการกําหนดค่าซึ่งบอกกฎบิวด์เกี่ยวกับเครื่องมือที่ใช้สร้าง เช่น คอมไพเลอร์และ Linker ที่จะใช้และวิธีกําหนดค่าด้วยพารามิเตอร์ที่ผู้สร้างกฎกําหนด กฎเกี่ยวกับเครื่องมือเชนจะอนุญาตให้สร้างและทดสอบกฎเพื่อใช้เครื่องมือสร้างในรูปแบบที่คาดการณ์ล่วงหน้าซึ่งเข้ากันได้กับการดําเนินการระยะไกล เช่น ใช้กฎเกี่ยวกับเครื่องมือเชนแทนการเรียกใช้เครื่องมือบิลด์ผ่าน PATH
, JAVA_HOME
หรือตัวแปรอื่นๆ ในเครื่องที่อาจไม่ได้ตั้งเป็นค่าที่เทียบเท่า (หรือเลย) ในสภาพแวดล้อมการดําเนินการระยะไกล
ปัจจุบัน กฎเครื่องมือเชนสําหรับกฎการทดสอบบิลด์และ Bazel สําหรับ Scala, Rust และ Go รวมถึงกฎเครื่องมือเชนใหม่ใช้กับภาษาและเครื่องมืออื่นๆ เช่น bash หากไม่มีกฎเครื่องมือสําหรับเครื่องมือที่กฎใช้อยู่ ให้พิจารณาสร้างกฎเครื่องมือเครื่องมือ
การจัดการทรัพยากร Dependency แบบโดยนัย
หากเครื่องมือสร้างบิลด์เข้าถึงทรัพยากร Dependency ในการทํางานของบิลด์ได้ การดําเนินการเหล่านั้นจะล้มเหลวเมื่อทํางานจากระยะไกล เนื่องจากการดําเนินการสร้างระยะไกลแต่ละรายการจะแยกจากการดําเนินการอื่นๆ เครื่องมือบิวด์บางอย่างจะคงสถานะการดําเนินการของบิลด์และทรัพยากร Dependency ที่จะไม่ได้รวมอยู่ในการเรียกใช้เครื่องมืออย่างชัดเจน ซึ่งจะทําให้การดําเนินการของบิลด์ที่ทํางานจากระยะไกลล้มเหลว
เช่น เมื่อ Bazel สั่งให้คอมไพเลอร์แบบเก็บสถานะสร้าง foo ในเครื่อง คอมไพเลอร์จะยังคงอ้างอิงเอาต์พุตเอาต์พุตของ foo ต่อไป จากนั้น Bazel จะสั่งให้คอมไพเลอร์สร้าง bar โดยขึ้นอยู่กับ foo โดยไม่ต้องอาศัยทรัพยากร Dependency ในไฟล์ BUILD สําหรับการรวมไว้ในการเรียกใช้คอมไพเลอร์ การดําเนินการจะสําเร็จตราบใดที่อินสแตนซ์ของคอมไพเลอร์เดียวกันดําเนินการสําหรับทั้ง 2 อย่าง (เช่นเดียวกับการดําเนินการทั่วไปในเครื่อง) อย่างไรก็ตาม เนื่องจากในสถานการณ์การดําเนินการระยะไกล การดําเนินการสร้างแต่ละรายการจะดําเนินการกับอินสแตนซ์คอมไพเลอร์แยกต่างหาก สถานะคอมไพเลอร์และ Dependency แบบโดยนัยของ bar ใน foo จะสูญหายและบิลด์จะล้มเหลว
Bazel 0.14.1 มีแซนด์บ็อกซ์ของ Kubernetes ในเครื่องซึ่งมีข้อจํากัดสําหรับทรัพยากร Dependency เหมือนกับการดําเนินการระยะไกลเพื่อช่วยตรวจจับและกําจัดปัญหาการพึ่งพาเหล่านี้ ใช้แซนด์บ็อกซ์เพื่อเตรียมบิวด์สําหรับการดําเนินการระยะไกลโดยระบุและแก้ไขข้อผิดพลาดบิลด์ที่เกี่ยวข้องกับทรัพยากร Dependency ดูข้อมูลเพิ่มเติมที่หัวข้อการแก้ปัญหาการดําเนินการจากระยะไกลของ Bazel ด้วยแซนด์บ็อกซ์แซนด์บ็อกซ์
การจัดการไบนารีที่ขึ้นอยู่กับแพลตฟอร์ม
โดยปกติแล้ว ไบนารีที่สร้างขึ้นในแพลตฟอร์มของโฮสต์จะไม่สามารถดําเนินการอย่างปลอดภัยบนแพลตฟอร์มการดําเนินการระยะไกลที่กําหนดเอง เนื่องจากทรัพยากร Dependency ที่ไม่ตรงกันอาจไม่ตรงกัน ตัวอย่างเช่น ไบนารีของ SingleJar ที่ให้ไว้กับ Bazel จะกําหนดเป้าหมายไปยังแพลตฟอร์มโฮสต์ อย่างไรก็ตาม สําหรับการดําเนินการระยะไกล คุณต้องรวบรวม SingleJar ในกระบวนการสร้างโค้ดเพื่อให้กําหนดเป้าหมายไปยังแพลตฟอร์มการดําเนินการระยะไกล (ดูตรรกะการเลือกเป้าหมาย)
อย่าจัดส่งไบนารีของเครื่องมือสร้างที่จําเป็นซึ่งบิลด์ของคุณสร้างด้วยซอร์สโค้ด จนกว่าคุณจะมั่นใจว่าเครื่องมือเหล่านี้จะทํางานบนแพลตฟอร์มการดําเนินการได้อย่างปลอดภัย แต่ให้ทําอย่างใดอย่างหนึ่งต่อไปนี้แทน
จัดส่งหรืออ้างอิงซอร์สโค้ดสําหรับเครื่องมือภายนอกเพื่อให้สร้างสําหรับแพลตฟอร์มการดําเนินการระยะไกลได้
ติดตั้งเครื่องมือล่วงหน้าในสภาพแวดล้อมการเรียกใช้ระยะไกล (เช่น คอนเทนเนอร์เครื่องมือเชน) หากมีความเสถียรเพียงพอและใช้กฎจากเครื่องมือเชนเพื่อเรียกใช้ในบิลด์
จัดการกฎ WORKSPACE ที่กําหนดค่า
กฎ WORKSPACE
ของ Bazel อาจใช้สําหรับการตรวจสอบแพลตฟอร์มของโฮสต์สําหรับเครื่องมือและไลบรารีที่บิลด์เหล่านี้ต้องการ และสําหรับบิลด์ในเครื่องจะเป็นแพลตฟอร์มการดําเนินการของ Bazel ด้วย หากบิลด์ขึ้นอยู่กับเครื่องมือสร้างและอาร์ติแฟกต์ภายใน จะล้มเหลวระหว่างการดําเนินการระยะไกลหากแพลตฟอร์มการดําเนินการระยะไกลไม่เหมือนกับแพลตฟอร์มโฮสต์
การดําเนินการต่อไปนี้ของกฎ WORKSPACE
ใช้ไม่ได้กับการดําเนินการระยะไกล
การสร้างไบนารี การดําเนินการคอมไพล์ในกฎ
WORKSPACE
จะทําให้ไบนารีที่ใช้ไม่ได้กับแพลตฟอร์มการดําเนินการระยะไกล แตกต่างจากแพลตฟอร์มโฮสต์กําลังติดตั้งแพ็กเกจ
pip
แพ็กเกจpip
ที่ติดตั้งผ่านกฎWORKSPACE
ต้องติดตั้งทรัพยากร Dependency ล่วงหน้าในแพลตฟอร์มของโฮสต์ แพ็กเกจที่สร้างมาเพื่อแพลตฟอร์มโฮสต์นี้โดยเฉพาะจะเข้ากันไม่ได้กับแพลตฟอร์มการดําเนินการระยะไกล หากแตกต่างจากแพลตฟอร์มโฮสต์การลิงก์ไปยังเครื่องมือหรืออาร์ติแฟกต์ในเครื่อง ลิงก์เครื่องมือหรือไลบรารีที่ติดตั้งในแพลตฟอร์มโฮสต์ที่สร้างผ่านกฎ
WORKSPACE
จะทําให้บิลด์บนแพลตฟอร์มการดําเนินการระยะไกลล้มเหลว เนื่องจาก Bazel ระบุตําแหน่งไฟล์ไม่ได้ ให้สร้างลิงก์รูปแบบโดยใช้การดําเนินการสร้างแบบมาตรฐานแทน เพื่อให้ เครื่องมือและไลบรารีที่ลิงก์กันสามารถเข้าถึงได้จากแผนผังrunfiles
ของ Bazel อย่าใช้repository_ctx.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
ดังที่แสดงที่นี่