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