หน้านี้มีไว้สำหรับผู้ใช้ Bazel ที่เขียนกฎการสร้างและการทดสอบที่กำหนดเอง ซึ่งต้องการทำความเข้าใจข้อกำหนดสำหรับกฎ Bazel ในบริบทของ การดำเนินการจากระยะไกล
การดำเนินการจากระยะไกลช่วยให้ Bazel ดำเนินการในแพลตฟอร์มอื่นได้ เช่น ศูนย์ข้อมูล Bazel ใช้โปรโตคอล gRPC สำหรับการดำเนินการจากระยะไกล คุณลองใช้การดำเนินการระยะไกลกับ bazel-buildfarm ได้ ซึ่งเป็นโปรเจ็กต์โอเพนซอร์สที่มีเป้าหมายเพื่อมอบแพลตฟอร์มการดำเนินการระยะไกลแบบกระจาย
หน้านี้ใช้คำศัพท์ต่อไปนี้เมื่ออ้างอิงถึงสภาพแวดล้อมประเภทต่างๆ หรือแพลตฟอร์ม
- แพลตฟอร์มโฮสต์ - ที่ Bazel ทำงาน
- แพลตฟอร์มการดำเนินการ - ที่ Bazel เรียกใช้การดำเนินการ
- แพลตฟอร์มเป้าหมาย - ที่เอาต์พุตการสร้าง (และการดำเนินการบางอย่าง) ทำงาน
ภาพรวม
เมื่อกำหนดค่าบิลด์ Bazel สำหรับการดำเนินการจากระยะไกล คุณต้องปฏิบัติตาม หลักเกณฑ์ที่อธิบายไว้ในหน้านี้เพื่อให้แน่ใจว่าบิลด์จะดำเนินการจากระยะไกลโดยไม่มีข้อผิดพลาด เนื่องจากลักษณะของการดำเนินการระยะไกล ซึ่งได้แก่
การดำเนินการบิลด์ที่แยกกัน เครื่องมือบิลด์จะไม่เก็บสถานะและทรัพยากร Dependency ไม่สามารถรั่วไหลระหว่างเครื่องมือ
สภาพแวดล้อมการดำเนินการที่หลากหลาย การกำหนดค่าบิลด์ในเครื่องอาจไม่เหมาะกับสภาพแวดล้อมการดำเนินการระยะไกลเสมอไป
หน้านี้อธิบายปัญหาที่อาจเกิดขึ้นเมื่อใช้กฎการสร้างและการทดสอบ Bazel ที่กำหนดเองสำหรับการดำเนินการจากระยะไกล และวิธีหลีกเลี่ยงปัญหาดังกล่าว โดยจะครอบคลุมหัวข้อต่อไปนี้
- เรียกใช้เครื่องมือบิลด์ผ่านกฎ Toolchain
- การจัดการการอ้างอิงโดยนัย
- การจัดการไบนารีที่ขึ้นอยู่กับแพลตฟอร์ม
- การจัดการกฎ WORKSPACE รูปแบบการกำหนดค่า
เรียกใช้เครื่องมือบิลด์ผ่านกฎ Toolchain
กฎของ Toolchain ของ Bazel คือผู้ให้บริการการกำหนดค่าที่บอกกฎการสร้างว่าควรใช้เครื่องมือสร้างใด เช่น คอมไพเลอร์และลิงเกอร์ และวิธีกำหนดค่าโดยใช้พารามิเตอร์ที่กำหนดโดยผู้สร้างกฎ กฎ Toolchain ช่วยให้กฎการสร้าง
และการทดสอบเรียกใช้เครื่องมือบิลด์ในลักษณะที่คาดการณ์ได้และกำหนดค่าไว้ล่วงหน้า
ซึ่งเข้ากันได้กับการดำเนินการจากระยะไกล เช่น ใช้กฎ Toolchain
แทนการเรียกใช้เครื่องมือบิลด์ผ่าน PATH, JAVA_HOME หรือตัวแปรอื่นๆ ในเครื่อง
ที่อาจไม่ได้ตั้งค่าเป็นค่าที่เทียบเท่า (หรือไม่ได้ตั้งค่าเลย) ในสภาพแวดล้อมการดำเนินการจากระยะไกล
ปัจจุบันมีกฎ Toolchain สำหรับกฎการสร้างและการทดสอบ Bazel สำหรับ Scala Rust และ Go และกำลังสร้างกฎ Toolchain ใหม่สำหรับภาษาและเครื่องมืออื่นๆ เช่น bash หากไม่มีกฎ Toolchain สำหรับเครื่องมือที่กฎของคุณใช้ ให้พิจารณาสร้างกฎ Toolchain
การจัดการทรัพยากร Dependency โดยนัย
หากเครื่องมือบิลด์เข้าถึงทรัพยากร Dependency ในการดำเนินการบิลด์ได้ การดำเนินการเหล่านั้นจะล้มเหลวเมื่อดำเนินการจากระยะไกล เนื่องจากระบบจะดำเนินการบิลด์จากระยะไกลแต่ละรายการแยกจากรายการอื่นๆ เครื่องมือบิลด์บางอย่างจะคงสถานะไว้ในการดำเนินการบิลด์และ เข้าถึงทรัพยากร Dependency ที่ไม่ได้รวมไว้ในการเรียกใช้เครื่องมืออย่างชัดเจน ซึ่งจะทำให้การดำเนินการบิลด์ที่ดำเนินการจากระยะไกลล้มเหลว
ตัวอย่างเช่น เมื่อ Bazel สั่งให้คอมไพเลอร์แบบมีสถานะสร้าง foo ในเครื่อง คอมไพเลอร์จะเก็บการอ้างอิงเอาต์พุตการสร้างของ foo ไว้ เมื่อ Bazel สั่งให้คอมไพเลอร์สร้าง bar ซึ่งขึ้นอยู่กับ foo โดยไม่ได้ระบุทรัพยากร Dependency นั้นอย่างชัดเจนในไฟล์ BUILD เพื่อรวมไว้ในการเรียกใช้คอมไพเลอร์ การดำเนินการจะทำงานสำเร็จตราบใดที่อินสแตนซ์คอมไพเลอร์เดียวกันทำงานสำหรับการดำเนินการทั้ง 2 อย่าง (ซึ่งเป็นเรื่องปกติสำหรับการดำเนินการในเครื่อง) อย่างไรก็ตาม เนื่องจากในสถานการณ์การดำเนินการจากระยะไกล การดำเนินการบิลด์แต่ละรายการจะเรียกใช้อินสแตนซ์คอมไพเลอร์แยกต่างหาก สถานะคอมไพเลอร์ และการอ้างอิงโดยนัยของ bar ที่มีต่อ foo จะหายไปและบิลด์จะล้มเหลว
Bazel 0.14.1 มี แซนด์บ็อกซ์ Docker ในเครื่อง ซึ่งมีข้อจำกัดเดียวกันสำหรับทรัพยากร Dependency เหมือนกับการดำเนินการจากระยะไกล เพื่อช่วยตรวจหาและแก้ไขปัญหาเกี่ยวกับทรัพยากร Dependency เหล่านี้ ใช้แซนด์บ็อกซ์เพื่อเตรียมบิลด์สำหรับการดำเนินการจากระยะไกลโดย ระบุและแก้ไขข้อผิดพลาดในการบิลด์ที่เกี่ยวข้องกับการขึ้นต่อกัน ดูข้อมูลเพิ่มเติมได้ที่การแก้ปัญหาการดำเนินการจากระยะไกลของ Bazel ด้วย Docker Sandbox
การจัดการไบนารีที่ขึ้นอยู่กับแพลตฟอร์ม
โดยปกติแล้ว ไบนารีที่สร้างขึ้นในแพลตฟอร์มโฮสต์จะไม่สามารถเรียกใช้ในแพลตฟอร์มการเรียกใช้จากระยะไกลโดยพลการได้อย่างปลอดภัย เนื่องจากอาจมีการขึ้นต่อกันที่ไม่ตรงกัน ตัวอย่างเช่น ไบนารี SingleJar ที่มาพร้อมกับเป้าหมาย Bazel จะกำหนดเป้าหมายไปยังแพลตฟอร์มโฮสต์ อย่างไรก็ตาม สำหรับการดำเนินการจากระยะไกล คุณต้องคอมไพล์ SingleJar เป็นส่วนหนึ่งของกระบวนการ สร้างโค้ดเพื่อให้กำหนดเป้าหมายไปยังแพลตฟอร์มการดำเนินการจากระยะไกล (ดูตรรกะการเลือกเป้าหมาย)
อย่านำไบนารีของเครื่องมือบิลด์ที่บิลด์ของคุณต้องการไปพร้อมกับซอร์สโค้ด เว้นแต่คุณจะแน่ใจว่าไบนารีเหล่านั้นจะทำงานในแพลตฟอร์มการดำเนินการของคุณได้อย่างปลอดภัย ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้แทน
จัดส่งหรืออ้างอิงภายนอกไปยังซอร์สโค้ดของเครื่องมือเพื่อให้สร้างเครื่องมือสำหรับแพลตฟอร์มการดำเนินการระยะไกลได้
ติดตั้งเครื่องมือล่วงหน้าในสภาพแวดล้อมการดำเนินการระยะไกล (เช่น คอนเทนเนอร์ Toolchain) หากเครื่องมือมีความเสถียรเพียงพอ และใช้กฎ Toolchain เพื่อเรียกใช้เครื่องมือในการสร้าง
การจัดการกฎ WORKSPACE รูปแบบการกำหนดค่า
WORKSPACE กฎของ Bazel สามารถใช้ในการตรวจสอบแพลตฟอร์มโฮสต์เพื่อหาเครื่องมือ
และไลบรารีที่จำเป็นสำหรับการสร้าง ซึ่งสำหรับบิลด์ในเครื่องก็เป็นแพลตฟอร์มการดำเนินการของ Bazel ด้วย
หากบิลด์ขึ้นอยู่กับเครื่องมือบิลด์และอาร์ติแฟกต์ในเครื่องอย่างชัดเจน บิลด์จะล้มเหลวระหว่างการดำเนินการระยะไกลหากแพลตฟอร์มการดำเนินการระยะไกลไม่เหมือนกับแพลตฟอร์มโฮสต์
การดำเนินการต่อไปนี้ที่กฎ WORKSPACE ดำเนินการใช้ไม่ได้กับการดำเนินการจากระยะไกล
การสร้างไบนารี การดำเนินการคอมไพล์ใน
WORKSPACEจะทำให้เกิดไบนารีที่ไม่เข้ากันกับแพลตฟอร์มการดำเนินการระยะไกล หากแตกต่างจากแพลตฟอร์มโฮสต์การติดตั้งแพ็กเกจ
pipแพ็กเกจpipที่ติดตั้งผ่านกฎWORKSPACEกำหนดให้ต้องติดตั้งการอ้างอิงไว้ล่วงหน้าในแพลตฟอร์มโฮสต์ แพ็กเกจดังกล่าวซึ่งสร้างขึ้นสำหรับแพลตฟอร์มโฮสต์โดยเฉพาะจะใช้กับแพลตฟอร์มการดำเนินการจากระยะไกลไม่ได้หากแตกต่างจากแพลตฟอร์มโฮสต์การสร้างลิงก์สัญลักษณ์ไปยังเครื่องมือหรืออาร์ติแฟกต์ในเครื่อง Symlink ไปยังเครื่องมือหรือไลบรารีที่ติดตั้งในแพลตฟอร์มโฮสต์ซึ่งสร้างผ่าน
WORKSPACEจะทําให้บิลด์ล้มเหลวในแพลตฟอร์มการเรียกใช้จากระยะไกล เนื่องจาก Bazel จะค้นหาไม่ได้ แต่ให้สร้าง Symlink โดยใช้การดำเนินการบิลด์มาตรฐานเพื่อให้เข้าถึงเครื่องมือและไลบรารีที่ลิงก์สัญลักษณ์ได้จากrunfilesทรีของ Bazel อย่าใช้repository_ctx.symlinkเพื่อสร้างลิงก์สัญลักษณ์ไปยังไฟล์เป้าหมายที่อยู่นอกไดเรกทอรีที่เก็บภายนอกการเปลี่ยนแปลงแพลตฟอร์มโฮสต์ หลีกเลี่ยงการสร้างไฟล์นอกโครงสร้าง Bazel
runfilesการสร้างตัวแปรสภาพแวดล้อม และการดำเนินการที่คล้ายกัน เนื่องจากอาจทํางานอย่างไม่คาดคิดในแพลตฟอร์มการดำเนินการจากระยะไกล
คุณใช้บันทึกกฎของ Workspace เพื่อช่วยค้นหาลักษณะการทำงานที่อาจไม่เป็นไปตามข้อกำหนดได้
หากการขึ้นต่อกันภายนอกดำเนินการเฉพาะเจาะจงที่ขึ้นอยู่กับแพลตฟอร์มโฮสต์ คุณควรแยกการดำเนินการเหล่านั้นระหว่างWORKSPACEและกฎการสร้าง
ดังนี้
การตรวจสอบแพลตฟอร์มและการแจงนับการขึ้นต่อกัน การดำเนินการเหล่านี้ปลอดภัยที่จะดำเนินการในเครื่องผ่านกฎ
WORKSPACEซึ่งสามารถตรวจสอบได้ว่ามีการติดตั้งไลบรารีใดบ้าง ดาวน์โหลดแพ็กเกจที่ต้องสร้าง และเตรียมอาร์ติแฟกต์ที่จำเป็นสำหรับการคอมไพล์ สำหรับการดำเนินการจากระยะไกล กฎเหล่านี้ต้องรองรับการใช้สิ่งประดิษฐ์ที่ตรวจสอบแล้วล่วงหน้าเพื่อระบุข้อมูลที่ปกติจะได้รับระหว่างการตรวจสอบแพลตฟอร์มโฮสต์ด้วย อาร์ติแฟกต์ที่ตรวจสอบล่วงหน้า ช่วยให้ Bazel อธิบายการขึ้นต่อกันได้ราวกับว่าอยู่ภายในเครื่อง ใช้ คำสั่งแบบมีเงื่อนไขหรือแฟล็ก--override_repositoryสำหรับกรณีนี้การสร้างหรือรวบรวมอาร์ติแฟกต์ที่เฉพาะเจาะจงเป้าหมายและการเปลี่ยนแปลงแพลตฟอร์ม การดำเนินการเหล่านี้ต้องดำเนินการผ่านกฎการสร้างปกติ การดำเนินการที่สร้างอาร์ติแฟกต์เฉพาะเป้าหมายสำหรับการอ้างอิงภายนอกต้องดำเนินการในระหว่างการสร้าง
หากต้องการสร้างอาร์ติแฟกต์ที่ตรวจสอบล่วงหน้าสำหรับการดำเนินการจากระยะไกลได้ง่ายขึ้น คุณสามารถใช้
WORKSPACE rules เพื่อส่งไฟล์ที่สร้างขึ้นได้ คุณสามารถเรียกใช้กฎเหล่านั้นในสภาพแวดล้อมการดำเนินการใหม่แต่ละรายการ เช่น ภายในคอนเทนเนอร์ของเครื่องมือแต่ละชุด และตรวจสอบเอาต์พุตของการสร้างการดำเนินการจากระยะไกลในที่เก็บแหล่งที่มาเพื่อใช้อ้างอิง
ตัวอย่างเช่น สำหรับกฎของ Tensorflow สำหรับ cuda
และ python
กฎ WORKSPACE จะสร้าง BUILD files ต่อไปนี้
สำหรับการดำเนินการในเครื่อง ระบบจะใช้ไฟล์ที่สร้างขึ้นจากการตรวจสอบสภาพแวดล้อมของโฮสต์
สำหรับการดำเนินการจากระยะไกล Conditional Statement
ในตัวแปรสภาพแวดล้อมจะช่วยให้กฎใช้ไฟล์ที่เช็คอิน
ในที่เก็บได้
BUILD ไฟล์จะประกาศ genrules
ที่เรียกใช้ได้ทั้งในเครื่องและจากระยะไกล รวมถึงดำเนินการประมวลผลที่จำเป็น
ซึ่งก่อนหน้านี้ทำผ่าน repository_ctx.symlink ดังที่แสดงที่นี่