การปรับกฎ Bazel สําหรับการดําเนินการระยะไกล

รายงานปัญหา ดูแหล่งที่มา

หน้านี้มีไว้สําหรับผู้ใช้ Bazel ที่เขียนกฎที่กําหนดเองและการทดสอบกฎที่ต้องการทําความเข้าใจข้อกําหนดสําหรับกฎ Bazel ในบริบทของการดําเนินการระยะไกล

การดําเนินการจากระยะไกลช่วยให้ Bazel ดําเนินการกับแพลตฟอร์มต่างๆ แยกกันได้ เช่น ศูนย์ข้อมูล Bazel ใช้โปรโตคอล gRPC สําหรับการดําเนินการระยะไกล คุณอาจลองใช้การดําเนินการระยะไกลด้วย bazel-buildfarm ซึ่งเป็นโปรเจ็กต์โอเพนซอร์สที่มุ่งหมายจะเป็นแพลตฟอร์มการดําเนินการระยะไกลแบบกระจาย

หน้านี้ใช้คําศัพท์ต่อไปนี้เมื่อพูดถึงประเภทสภาพแวดล้อมหรือแพลตฟอร์มต่างๆ

  • แพลตฟอร์มโฮสต์ - ที่ Bazel ทํางานอยู่
  • แพลตฟอร์มการดําเนินการ - ลักษณะการทํางานของ Bazel
  • แพลตฟอร์มเป้าหมาย - ที่เอาต์พุตของบิลด์ (และการดําเนินการบางอย่าง) จะทํางาน

ภาพรวม

เมื่อกําหนดค่าบิลด์ Bazel สําหรับการดําเนินการระยะไกล คุณต้องปฏิบัติตามหลักเกณฑ์ที่อธิบายในหน้านี้เพื่อให้บิลด์ทํางานได้จากระยะไกลโดยไม่มีข้อผิดพลาด เนื่องจากลักษณะของการดําเนินการระยะไกล กล่าวคือ

  • การดําเนินการสร้างที่แยกไว้ เครื่องมือสร้างจะไม่เก็บสถานะไว้ และทรัพยากร Dependency จะรั่วไหลระหว่างกันไม่ได้

  • สภาพแวดล้อมการดําเนินการที่หลากหลาย การกําหนดค่าบิลด์ในเครื่องอาจไม่เหมาะกับสภาพแวดล้อม การดําเนินการระยะไกลเสมอไป

หน้านี้อธิบายปัญหาที่อาจเกิดขึ้นเมื่อใช้การสร้างบิลด์และทดสอบกฎที่กําหนดเองสําหรับการดําเนินการระยะไกลและวิธีหลีกเลี่ยง โดยจะครอบคลุมหัวข้อต่อไปนี้

การเรียกใช้เครื่องมือสร้างผ่านกฎของเครื่องมือเชน

กฎของเครื่องมือเชน Bazel เป็นผู้ให้บริการการกําหนดค่าซึ่งบอกกฎบิวด์เกี่ยวกับเครื่องมือที่ใช้สร้าง เช่น คอมไพเลอร์และ Linker ที่จะใช้และวิธีกําหนดค่าด้วยพารามิเตอร์ที่ผู้สร้างกฎกําหนด กฎเกี่ยวกับเครื่องมือเชนจะอนุญาตให้สร้างและทดสอบกฎเพื่อใช้เครื่องมือสร้างในรูปแบบที่คาดการณ์ล่วงหน้าซึ่งเข้ากันได้กับการดําเนินการระยะไกล เช่น ใช้กฎเกี่ยวกับเครื่องมือเชนแทนการเรียกใช้เครื่องมือบิลด์ผ่าน PATH, JAVA_HOME หรือตัวแปรอื่นๆ ในเครื่องที่อาจไม่ได้ตั้งเป็นค่าที่เทียบเท่า (หรือเลย) ในสภาพแวดล้อมการดําเนินการระยะไกล

ปัจจุบัน กฎเครื่องมือเชนสําหรับกฎการทดสอบบิลด์และ Bazel สําหรับ Scala, Rust และ Go รวมถึงกฎเครื่องมือเชนใหม่ใช้กับภาษาและเครื่องมืออื่นๆ เช่น bash หากไม่มีกฎเครื่องมือสําหรับเครื่องมือที่กฎใช้อยู่ ให้พิจารณาสร้างกฎเครื่องมือเครื่องมือ

การจัดการทรัพยากร Dependency แบบโดยนัย

หากเครื่องมือสร้างบิลด์เข้าถึงทรัพยากร Dependency ในการทํางานของบิลด์ได้ การดําเนินการเหล่านั้นจะล้มเหลวเมื่อทํางานจากระยะไกล เนื่องจากการดําเนินการสร้างระยะไกลแต่ละรายการจะแยกจากการดําเนินการอื่นๆ เครื่องมือบิวด์บางอย่างจะคงสถานะการดําเนินการของบิลด์และทรัพยากร Dependency ที่จะไม่ได้รวมอยู่ในการเรียกใช้เครื่องมืออย่างชัดเจน ซึ่งจะทําให้การดําเนินการของบิลด์ที่ทํางานจากระยะไกลล้มเหลว

เช่น เมื่อ Bazel สั่งให้คอมไพเลอร์แบบเก็บสถานะสร้าง foo ในเครื่อง คอมไพเลอร์จะยังคงอ้างอิงเอาต์พุตเอาต์พุตของ foo ต่อไป จากนั้น Bazel จะสั่งให้คอมไพเลอร์สร้าง bar โดยขึ้นอยู่กับ foo โดยไม่ต้องอาศัยทรัพยากร Dependency ในไฟล์ BUILD สําหรับการรวมไว้ในการเรียกใช้คอมไพเลอร์ การดําเนินการจะสําเร็จตราบใดที่อินสแตนซ์ของคอมไพเลอร์เดียวกันดําเนินการสําหรับทั้ง 2 อย่าง (เช่นเดียวกับการดําเนินการทั่วไปในเครื่อง) อย่างไรก็ตาม เนื่องจากในสถานการณ์การดําเนินการระยะไกล การดําเนินการสร้างแต่ละรายการจะดําเนินการกับอินสแตนซ์คอมไพเลอร์แยกต่างหาก สถานะคอมไพเลอร์และ Dependency แบบโดยนัยของ bar ใน foo จะสูญหายและบิลด์จะล้มเหลว

Bazel 0.14.1 มีแซนด์บ็อกซ์ของ Kubernetes ในเครื่องซึ่งมีข้อจํากัดสําหรับทรัพยากร Dependency เหมือนกับการดําเนินการระยะไกลเพื่อช่วยตรวจจับและกําจัดปัญหาการพึ่งพาเหล่านี้ ใช้แซนด์บ็อกซ์เพื่อเตรียมบิวด์สําหรับการดําเนินการระยะไกลโดยระบุและแก้ไขข้อผิดพลาดบิลด์ที่เกี่ยวข้องกับทรัพยากร Dependency ดูข้อมูลเพิ่มเติมที่หัวข้อการแก้ปัญหาการดําเนินการจากระยะไกลของ Bazel ด้วยแซนด์บ็อกซ์แซนด์บ็อกซ์

การจัดการไบนารีที่ขึ้นอยู่กับแพลตฟอร์ม

โดยปกติแล้ว ไบนารีที่สร้างขึ้นในแพลตฟอร์มของโฮสต์จะไม่สามารถดําเนินการอย่างปลอดภัยบนแพลตฟอร์มการดําเนินการระยะไกลที่กําหนดเอง เนื่องจากทรัพยากร Dependency ที่ไม่ตรงกันอาจไม่ตรงกัน ตัวอย่างเช่น ไบนารีของ SingleJar ที่ให้ไว้กับ Bazel จะกําหนดเป้าหมายไปยังแพลตฟอร์มโฮสต์ อย่างไรก็ตาม สําหรับการดําเนินการระยะไกล คุณต้องรวบรวม SingleJar ในกระบวนการสร้างโค้ดเพื่อให้กําหนดเป้าหมายไปยังแพลตฟอร์มการดําเนินการระยะไกล (ดูตรรกะการเลือกเป้าหมาย)

อย่าจัดส่งไบนารีของเครื่องมือสร้างที่จําเป็นซึ่งบิลด์ของคุณสร้างด้วยซอร์สโค้ด จนกว่าคุณจะมั่นใจว่าเครื่องมือเหล่านี้จะทํางานบนแพลตฟอร์มการดําเนินการได้อย่างปลอดภัย แต่ให้ทําอย่างใดอย่างหนึ่งต่อไปนี้แทน

  • จัดส่งหรืออ้างอิงซอร์สโค้ดสําหรับเครื่องมือภายนอกเพื่อให้สร้างสําหรับแพลตฟอร์มการดําเนินการระยะไกลได้

  • ติดตั้งเครื่องมือล่วงหน้าในสภาพแวดล้อมการเรียกใช้ระยะไกล (เช่น คอนเทนเนอร์เครื่องมือเชน) หากมีความเสถียรเพียงพอและใช้กฎจากเครื่องมือเชนเพื่อเรียกใช้ในบิลด์

จัดการกฎ 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 เพื่อปล่อยไฟล์ที่สร้างขึ้น คุณสามารถเรียกใช้กฎเหล่านั้นในสภาพแวดล้อมการดําเนินการใหม่แต่ละสภาพแวดล้อม เช่น ภายในคอนเทนเนอร์เครื่องมือเชนแต่ละรายการ และตรวจสอบเอาต์พุตของการดําเนินการระยะไกลที่สร้างลงในที่เก็บต้นทางเพื่ออ้างอิง

เช่น สําหรับกฎของ TensorFlow สําหรับ cuda และ python กฎ WORKSPACE จะสร้าง BUILD files ต่อไปนี้ สําหรับการดําเนินการในเครื่อง ระบบจะใช้ไฟล์ที่ผลิตโดยการตรวจสอบสภาพแวดล้อมของโฮสต์ สําหรับการดําเนินการจากระยะไกล คําสั่งแบบมีเงื่อนไขในตัวแปรสภาพแวดล้อมจะช่วยให้กฎใช้ไฟล์ที่ตรวจสอบในที่เก็บได้

ไฟล์ BUILD ประกาศ genrules ซึ่งเรียกใช้ได้ทั้งในเครื่องและจากระยะไกล รวมถึงดําเนินการที่จําเป็นที่เคยทําผ่าน repository_ctx.symlink ดังที่แสดงที่นี่