หน้านี้ครอบคลุมการเป็นระบบปิด ประโยชน์ของการใช้บิลด์ที่เป็นระบบปิด และกลยุทธ์ในการระบุลักษณะการทำงานที่ไม่เป็นระบบปิดในบิลด์
ภาพรวม
เมื่อได้รับซอร์สโค้ดอินพุตและการกำหนดค่าผลิตภัณฑ์เดียวกัน ระบบบิลด์ที่เป็นระบบปิดจะแสดงผลลัพธ์เดียวกันเสมอโดยแยกบิลด์จากการเปลี่ยนแปลงในระบบโฮสต์
บิลด์ที่เป็นระบบปิดจะไม่ได้รับผลกระทบจากไลบรารีและซอฟต์แวร์อื่นๆ ที่ติดตั้งในเครื่องโฮสต์ภายในหรือระยะไกล เพื่อแยกบิลด์ บิลด์เหล่านี้ขึ้นอยู่กับเครื่องมือบิลด์เวอร์ชันที่เฉพาะเจาะจง เช่น คอมไพเลอร์ และการขึ้นต่อกัน เช่น ไลบรารี ซึ่งทำให้กระบวนการบิลด์เป็นแบบสแตนด์อโลน เนื่องจากไม่ขึ้นอยู่กับบริการภายนอกสภาพแวดล้อมของบิลด์
การเป็นระบบปิดมี 2 ด้านที่สำคัญ ได้แก่
- การแยก: ระบบบิลด์ที่เป็นระบบปิดจะถือว่าเครื่องมือเป็นซอร์สโค้ด ระบบจะดาวน์โหลดสำเนาเครื่องมือและจัดการพื้นที่เก็บข้อมูลและการใช้งานภายในแผนผังไฟล์ที่มีการจัดการ ซึ่งจะสร้างการแยกระหว่างเครื่องโฮสต์กับผู้ใช้ภายใน รวมถึงภาษาเวอร์ชันที่ติดตั้ง
- ข้อมูลประจำตัวของแหล่งที่มา: ระบบบิลด์ที่เป็นระบบปิดจะพยายามให้แน่ใจว่าอินพุตเหมือนกัน ที่เก็บโค้ด เช่น Git จะระบุชุดการเปลี่ยนแปลงโค้ดด้วยรหัสแฮชที่ไม่ซ้ำกัน ระบบบิลด์ที่เป็นระบบปิดใช้แฮชนี้เพื่อระบุการเปลี่ยนแปลงอินพุตของบิลด์
สิทธิประโยชน์
ข้อดีหลักๆ ของบิลด์ที่เป็นระบบปิดมีดังนี้
- ความเร็ว: ระบบจะแคชเอาต์พุตของการดำเนินการ และไม่จำเป็นต้อง เรียกใช้การดำเนินการอีกครั้ง เว้นแต่ว่าอินพุตจะมีการเปลี่ยนแปลง
- การดำเนินการแบบขนาน: สำหรับอินพุตและเอาต์พุตที่กำหนด ระบบบิลด์สามารถ สร้างกราฟของการดำเนินการทั้งหมดเพื่อคำนวณการดำเนินการแบบขนานที่มีประสิทธิภาพ ระบบบิลด์จะโหลดกฎและคำนวณกราฟการดำเนินการและแฮชอินพุตเพื่อค้นหาในแคช
- บิลด์หลายรายการ: คุณสามารถสร้างบิลด์ที่เป็นระบบปิดหลายรายการใน เครื่องเดียวกัน โดยแต่ละบิลด์จะใช้เครื่องมือและเวอร์ชันที่แตกต่างกัน
- ความสามารถในการทำซ้ำ: บิลด์ที่เป็นระบบปิดเหมาะสำหรับการแก้ปัญหา เนื่องจากคุณ ทราบเงื่อนไขที่แน่นอนที่ทำให้เกิดบิลด์
ระบุการไม่เป็นระบบปิด
หากคุณกำลังเตรียมเปลี่ยนไปใช้ Bazel การย้ายข้อมูลจะง่ายขึ้นหากคุณปรับปรุงการเป็นระบบปิดของบิลด์ที่มีอยู่ล่วงหน้า แหล่งที่มาทั่วไปของการไม่เป็นระบบปิดในบิลด์มีดังนี้
- การประมวลผลที่กำหนดเองในไฟล์
.mk - การดำเนินการหรือเครื่องมือที่สร้างไฟล์แบบไม่กำหนดผลลัพธ์ ซึ่งมักจะเกี่ยวข้องกับรหัสบิลด์หรือการประทับเวลา
- ไบนารีของระบบที่แตกต่างกันในโฮสต์ (เช่น ไบนารี
/usr/binเส้นทางสัมบูรณ์ คอมไพเลอร์ C++ ของระบบสำหรับการกำหนดค่าอัตโนมัติของกฎ C++ ในตัว) - การเขียนลงในแผนผังแหล่งที่มาในระหว่างบิลด์ ซึ่งจะป้องกันไม่ให้ใช้แผนผังแหล่งที่มาเดียวกันสำหรับเป้าหมายอื่น บิลด์แรกจะเขียนลงในแผนผังแหล่งที่มา ซึ่งจะแก้ไขแผนผังแหล่งที่มาสำหรับเป้าหมาย ก จากนั้นการพยายามสร้างเป้าหมาย ข อาจล้มเหลว
การแก้ปัญหาบิลด์ที่ไม่เป็นระบบปิด
การเริ่มต้นด้วยการดำเนินการภายใน ปัญหาที่ส่งผลต่อการเข้าถึงแคชภายในจะเผยให้เห็นการดำเนินการที่ไม่เป็นระบบปิด
- ตรวจสอบว่าบิลด์ลำดับงานเป็นค่าว่าง: หากคุณเรียกใช้
makeและได้รับบิลด์ที่สำเร็จ การเรียกใช้บิลด์อีกครั้งไม่ควรสร้างเป้าหมายใหม่ หากคุณเรียกใช้แต่ละขั้นตอนของบิลด์ 2 ครั้งหรือในระบบต่างๆ ให้เปรียบเทียบแฮชของเนื้อหาไฟล์และได้รับผลลัพธ์ที่แตกต่างกัน แสดงว่าบิลด์ไม่สามารถทำซ้ำได้ - เรียกใช้ขั้นตอนต่างๆ เพื่อ แก้ไขข้อบกพร่องของการเข้าถึงแคชภายใน จากเครื่องไคลเอ็นต์ที่มีศักยภาพหลากหลาย เพื่อให้แน่ใจว่าคุณจะตรวจพบ กรณีที่สภาพแวดล้อมของไคลเอ็นต์รั่วไหลไปยังการดำเนินการ
- ดำเนินการบิลด์ภายในคอนเทนเนอร์ Docker ที่มีเพียงแผนผังแหล่งที่มาที่เช็กเอาต์และรายการเครื่องมือโฮสต์ที่ชัดเจน การหยุดทำงานของบิลด์และข้อความแสดงข้อผิดพลาดจะตรวจพบการขึ้นต่อกันของระบบโดยนัย
- ค้นพบและแก้ไขปัญหาการเป็นระบบปิดโดยใช้ กฎการดำเนินการระยะไกล
- เปิดใช้แซนด์บ็อกซ์ที่เข้มงวดในระดับการดำเนินการ เนื่องจากมีการดำเนินการในบิลด์ที่อาจเก็บสถานะและส่งผลต่อบิลด์หรือเอาต์พุต
- กฎพื้นที่ทำงาน
อนุญาตให้นักพัฒนาแอปเพิ่มการขึ้นต่อกันลงในพื้นที่ทำงานภายนอก แต่มีความยืดหยุ่นเพียงพอที่จะอนุญาตให้มีการประมวลผลที่กำหนดเองเกิดขึ้นในกระบวนการ คุณสามารถ
รับบันทึกการดำเนินการบางอย่างที่อาจไม่เป็นระบบปิดในกฎพื้นที่ทำงานของ Bazel ได้โดย
เพิ่มแฟล็ก
--experimental_workspace_rules_log_file=PATHลงใน คำสั่ง Bazel
การเป็นระบบปิดด้วย Bazel
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่โปรเจ็กต์อื่นๆ ประสบความสำเร็จในการใช้บิลด์ที่เป็นระบบปิดกับ Bazel ได้ในทอล์ก BazelCon ต่อไปนี้
- Building Real-time Systems with Bazel (SpaceX)
- Bazel Remote Execution and Remote Caching (Uber and Two Sigma)
- Faster Builds With Remote Execution and Caching
- Fusing Bazel: Faster Incremental Builds
- Remote Execution versus Local Execution
- Improving the Usability of Remote Caching (IBM)
- Building Self Driving Cars with Bazel (BMW)
- Building Self Driving Cars with Bazel + Q&A (GM Cruise)