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