หน้านี้กล่าวถึงความครบถ้วนสมบูรณ์ ประโยชน์ของการใช้งานสร้างที่แยกต่างหาก และ กลยุทธ์การระบุลักษณะการทำงานที่ไม่อิงตามองค์ประกอบในบิลด์ของคุณ
ภาพรวม
เมื่อได้รับซอร์สโค้ดอินพุตและการกำหนดค่าผลิตภัณฑ์เดียวกัน ระบบบิลด์แบบปิดผนึกจะแสดงผลลัพธ์เดียวกันเสมอโดยการแยกบิลด์ออกจากการเปลี่ยนแปลงในระบบโฮสต์
ในการแยกแยะบิลด์ บิลด์ที่รวมกันได้อย่างอิสระจึงไม่คำนึงถึงไลบรารีและ ซอฟต์แวร์อื่นที่ติดตั้งในเครื่องโฮสต์ภายในหรือระยะไกล ขึ้นอยู่กับ เวอร์ชันที่เจาะจงของเครื่องมือบิลด์ เช่น คอมไพเลอร์และทรัพยากร Dependency เช่น ห้องสมุด วิธีนี้ทำให้กระบวนการบิลด์เป็นแบบในตัวเนื่องจากไม่ต้องพึ่งพา บริการภายนอกสภาพแวดล้อมของบิลด์
องค์ประกอบสำคัญ 2 ประการของความไม่สละสลวยคือ:
- การแยกส่วน: ระบบการบิลด์แบบปิดผนึกจะถือว่าเครื่องมือเป็นซอร์สโค้ด โฆษณาเหล่านี้ ดาวน์โหลดสำเนาเครื่องมือและจัดการพื้นที่เก็บข้อมูลและใช้งานภายในไฟล์ที่มีการจัดการ ต้นไม้ ซึ่งจะแยกระหว่างเครื่องโฮสต์กับผู้ใช้ในเครื่อง รวมถึงภาษาเวอร์ชันที่ติดตั้งไว้
- ข้อมูลประจำตัวต้นทาง: ระบบบิลด์ที่สัญชาติญาณพยายามตรวจสอบความตรงกันของ อินพุต ที่เก็บโค้ด เช่น Git จะระบุชุดการเปลี่ยนแปลงโค้ดด้วย รหัสแฮชที่ไม่ซ้ำกัน ระบบบิลด์ที่ไม่ซับซ้อนจะใช้แฮชนี้เพื่อระบุการเปลี่ยนแปลงของ อินพุตของบิลด์
ประโยชน์
ประโยชน์หลักๆ ของบิลด์แบบปิดผนึก ได้แก่
- ความเร็ว: ระบบแคชเอาต์พุตของการดำเนินการได้ และไม่จำเป็นต้องบันทึกการดำเนินการดังกล่าว ทำงานอีกครั้ง เว้นแต่อินพุตจะเปลี่ยนแปลง
- การดำเนินการแบบขนาน: สำหรับอินพุตและเอาต์พุตที่ระบุ ระบบบิลด์สามารถสร้างกราฟของการดำเนินการทั้งหมดเพื่อคำนวณการดำเนินการแบบขนานที่มีประสิทธิภาพ ระบบบิลด์จะโหลดกฎและคำนวณกราฟการดำเนินการ และแฮชที่ต้องการในการค้นหาในแคช
- บิลด์หลายรายการ: คุณสามารถสร้างบิลด์แบบปิดผนึกหลายรายการในเครื่องเดียวกัน โดยแต่ละบิลด์จะใช้เครื่องมือและเวอร์ชันที่แตกต่างกัน
- ความสามารถในการทำซ้ำ: บิลด์ที่สับเปลี่ยนได้เหมาะกับการแก้ปัญหาเนื่องจากคุณ รู้เงื่อนไขที่แน่ชัดในการสร้างสิ่งที่สร้างขึ้น
การระบุความไม่เป็นธรรมชาติ
หากคุณกำลังเตรียมเปลี่ยนไปใช้ Bazel การย้ายข้อมูลจะง่ายขึ้นหากคุณปรับปรุง งานสร้างที่มีอยู่ ความคลุมเครือล่วงหน้า สาเหตุที่พบบ่อยที่ทําให้บิลด์ไม่ปิดผนึก ได้แก่
- การประมวลผลที่กำหนดเองในไฟล์
.mk
รายการ - การดำเนินการหรือการใช้เครื่องมือที่สร้างไฟล์โดยไม่มีการกำหนด ซึ่งมักเกี่ยวข้องกับ รหัสหรือการประทับเวลาของบิลด์
- ไบนารีของระบบที่แตกต่างกันในโฮสต์ต่างๆ (เช่น ไบนารี
/usr/bin
แบบสัมบูรณ์ เส้นทาง คอมไพเลอร์ C++ ของระบบสำหรับการกำหนดค่ากฎ C++ แบบเนทีฟ) - กำลังเขียนไปยังแผนผังต้นทางระหว่างการสร้าง ซึ่งจะช่วยป้องกันไม่ให้ใช้ซอร์สโค้ดเดียวกันกับเป้าหมายอื่น บิลด์แรกจะเขียนลงในซอร์สทรี โดยแก้ไขซอร์สทรีสําหรับเป้าหมาย ก. จากนั้นการพยายามสร้างเป้าหมาย ข อาจไม่สําเร็จ
การแก้ปัญหาบิลด์ที่ไม่เฉพาะตัว
เริ่มต้นจากการดำเนินการในเครื่อง ปัญหาที่ส่งผลกระทบต่อ Hit ของแคชในเครื่องจะแสดง การดำเนินการที่ไม่อยู่ภายใต้การควบคุม
- ตรวจสอบว่าบิลด์ตามลำดับเป็นค่าว่าง: หากคุณเรียกใช้
make
และบิลด์สำเร็จแล้ว การเรียกใช้บิลด์อีกครั้งไม่ควรสร้างเป้าหมายใดๆ ขึ้นมาใหม่ หากคุณเรียกใช้แต่ละบิลด์ สองครั้งหรือในหลายระบบ ให้เปรียบเทียบแฮชของเนื้อหาไฟล์และ ได้ผลลัพธ์ที่ต่างกัน บิลด์นี้ทำซ้ำไม่ได้ - เรียกใช้ขั้นตอนเพื่อ แก้ไขข้อบกพร่อง Hit แคชในเครื่อง จากเครื่องไคลเอ็นต์มากมาย เพื่อให้แน่ใจว่าคุณสามารถตรวจจับ กรณีต่างๆ ในสภาพแวดล้อมของไคลเอ็นต์หลุดเข้ามาในการดำเนินการ
- ดำเนินการบิลด์ภายในคอนเทนเนอร์ Docker ที่ไม่มีสิ่งใดนอกจาก ตรวจสอบโครงสร้างซอร์สและรายการเครื่องมือโฮสต์ที่ชัดเจน สร้างความเสียหายและ จะตรวจจับทรัพยากร Dependency ของระบบโดยปริยาย
- ค้นหาและแก้ไขปัญหาความครบถ้วนสมบูรณ์โดยใช้ กฎการดำเนินการระยะไกล
- เปิดใช้แซนด์บ็อกซ์ที่เข้มงวด ที่ระดับต่อการดำเนินการ เนื่องจากการดำเนินการในบิลด์อาจเป็นการเก็บสถานะและส่งผลต่อ บิลด์หรือเอาต์พุต
- กฎพื้นที่ทำงาน
อนุญาตให้นักพัฒนาซอฟต์แวร์เพิ่มทรัพยากร Dependency ไปยังพื้นที่ทำงานภายนอกได้
มีความสมบูรณ์เพียงพอที่จะทำให้เกิดกระบวนการที่กำหนดเองได้ คุณสามารถรับบันทึกการดำเนินการบางอย่างที่อาจไม่ปลอดภัยในกฎเวิร์กสเปซ Bazel ได้โดยเพิ่ม Flag
--experimental_workspace_rules_log_file=PATH
ลงในคำสั่ง Bazel
ความสุจริตกับบาเซล
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความสำเร็จของโครงการอื่นๆ จากการใช้เนื้อหาแบบแยกส่วน งานสร้างกับ Bazel ดูการบรรยายของ BazelCon:
- การสร้างระบบเรียลไทม์ด้วย Bazel (SpaceX)
- การดำเนินการระยะไกลของ Bazel และการแคชระยะไกล (Uber และ TwoSigma)
- สร้างได้เร็วขึ้นด้วยการดำเนินการและการแคชระยะไกล
- การผสม Bazel: งานสร้างที่เพิ่มขึ้นอย่างรวดเร็ว
- การดำเนินการระยะไกลกับการดำเนินการในเครื่อง
- การปรับปรุงความสามารถในการใช้งานของแคชระยะไกล (IBM)
- การสร้างรถยนต์ขับรถด้วยตนเองด้วย Bazel (BMW)
- การสร้างรถยนต์ที่ขับเคลื่อนด้วยตนเองด้วย Bazel + ถามและตอบ (GM Cruise)