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