หน้านี้มีไว้สำหรับผู้ใช้ 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 การดำเนินการ (ซึ่งเป็นลักษณะปกติของการดำเนินการในเครื่อง) อย่างไรก็ตาม เนื่องจากในสถานการณ์การดำเนินการจากระยะไกล การดำเนินการสร้างแต่ละรายการจะเรียกใช้อินสแตนซ์คอมไพเลอร์แยกกัน สถานะคอมไพลเลอร์และbar's ทรัพยากร Dependency โดยนัยของ foo จะหายไปและการสร้างจะล้มเหลว
Bazel 0.14.1 มีแซนด์บ็อกซ์ Docker ในเครื่อง ซึ่งมีข้อจำกัดด้านทรัพยากร Dependency เหมือนกับการดำเนินการจากระยะไกล เพื่อช่วยตรวจหาและแก้ไขปัญหาทรัพยากร Dependency เหล่านี้ ใช้แซนด์บ็อกซ์เพื่อเตรียมการสร้างสำหรับการดำเนินการจากระยะไกลโดยระบุและแก้ไขข้อผิดพลาดในการสร้างที่เกี่ยวข้องกับทรัพยากร Dependency ดูข้อมูลเพิ่มเติมได้ที่ การแก้ปัญหาการดำเนินการจากระยะไกลของ Bazel ด้วยแซนด์บ็อกซ์ Docker
การจัดการไบนารีที่ขึ้นอยู่กับแพลตฟอร์ม
โดยปกติแล้ว ไบนารีที่สร้างในแพลตฟอร์มโฮสต์จะไม่สามารถดำเนินการในแพลตฟอร์มการดำเนินการจากระยะไกลโดยพลการได้อย่างปลอดภัย เนื่องจากทรัพยากร Dependency อาจไม่ตรงกัน ตัวอย่างเช่น ไบนารี SingleJar ที่มาพร้อมกับ Bazel จะกำหนดเป้าหมายเป็นแพลตฟอร์มโฮสต์ อย่างไรก็ตาม สำหรับการดำเนินการจากระยะไกล จะต้องคอมไพล์ SingleJar เป็นส่วนหนึ่งของกระบวนการสร้างโค้ดเพื่อให้กำหนดเป้าหมายเป็นแพลตฟอร์มการดำเนินการจากระยะไกล (ดูตรรกะการเลือก เป้าหมาย)
อย่าจัดส่งไบนารีของเครื่องมือสร้างที่การสร้างของคุณต้องใช้พร้อมกับซอร์สโค้ด เว้นแต่คุณจะมั่นใจว่าเครื่องมือเหล่านั้นจะทำงานในแพลตฟอร์มการดำเนินการได้อย่างปลอดภัย แต่ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้
จัดส่งหรืออ้างอิงซอร์สโค้ดของเครื่องมือจากภายนอกเพื่อให้สร้างเครื่องมือสำหรับแพลตฟอร์มการดำเนินการจากระยะไกลได้
ติดตั้งเครื่องมือไว้ล่วงหน้าในสภาพแวดล้อมการดำเนินการจากระยะไกล (เช่น คอนเทนเนอร์ Toolchain) หากเครื่องมือมีความเสถียรเพียงพอ และใช้กฎ Toolchain เพื่อเรียกใช้เครื่องมือในการสร้าง
การจัดการกฎ WORKSPACE รูปแบบการกำหนดค่า
คุณสามารถใช้กฎ WORKSPACE ของ Bazel เพื่อตรวจสอบเครื่องมือและไลบรารีที่การสร้างต้องใช้ในแพลตฟอร์มโฮสต์ ซึ่งสำหรับการสร้างในเครื่องก็คือแพลตฟอร์มการดำเนินการของ Bazel ด้วย หากการสร้างขึ้นอยู่กับเครื่องมือสร้างและอาร์ติแฟกต์ในเครื่องอย่างชัดเจน การสร้างจะล้มเหลวระหว่างการดำเนินการจากระยะไกลหากแพลตฟอร์มการดำเนินการจากระยะไกลไม่เหมือนกับแพลตฟอร์มโฮสต์
การดำเนินการต่อไปนี้ที่กฎ WORKSPACE ดำเนินการไม่เข้ากันกับการดำเนินการจากระยะไกล
การสร้างไบนารี การดำเนินการคอมไพเลชันในกฎ
WORKSPACEจะส่งผลให้เกิดไบนารีที่ไม่เข้ากันกับแพลตฟอร์มการดำเนินการจากระยะไกลหากแพลตฟอร์มดังกล่าวแตกต่างจากแพลตฟอร์มโฮสต์การติดตั้งแพ็กเกจ
pippipแพ็กเกจที่ติดตั้งผ่าน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 ดังที่แสดง ไว้ที่นี่