สมุนไพร

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

ภาพรวม

เมื่อมีซอร์สโค้ดอินพุตและการกำหนดค่าผลิตภัณฑ์เดียวกัน ระบบบิลด์ที่แนบเนียนจะส่งคืนเอาต์พุตเดียวกันเสมอโดยการแยกบิลด์จากการเปลี่ยนแปลงในระบบโฮสต์

ในการแยกบิลด์ บิลด์ 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 ต่อไปนี้