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