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