ทําไมต้องเป็นระบบบิลด์

รายงานปัญหา ดูแหล่งที่มา

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

ระบบบิวด์คืออะไร

โดยพื้นฐานแล้ว ระบบบิวด์ทั้งหมดมีวัตถุประสงค์ที่ไม่ซับซ้อน ซึ่งก็คือการเปลี่ยนซอร์สโค้ดที่เขียนโดยวิศวกรเป็นไบนารีปฏิบัติการซึ่งเครื่องสามารถอ่านได้ ระบบบิลด์ไม่ได้มีไว้สําหรับโค้ดที่มนุษย์สร้างขึ้นเท่านั้น แต่ยังอนุญาตให้คอมพิวเตอร์สร้างบิลด์โดยอัตโนมัติ ไม่ว่าจะเป็นการทดสอบหรือการเผยแพร่เป็นเวอร์ชันที่ใช้งานจริง ในองค์กรที่มีวิศวกรหลายพันคน โดยส่วนใหญ่แล้ว งานสร้างส่วนใหญ่จะเกิดขึ้นโดยอัตโนมัติมากกว่าวิศวกรโดยตรง

ฉันใช้คอมไพเลอร์เพียงอย่างเดียวได้ไหม

ความต้องการของระบบงานสร้างอาจไม่ชัดเจนเสมอไป วิศวกรส่วนใหญ่ไม่ได้ใช้ระบบการสร้างในขณะเรียนรู้การเขียนโค้ด โดยส่วนใหญ่จะเริ่มต้นด้วยการเรียกใช้เครื่องมือ เช่น gcc หรือ javac จากบรรทัดคําสั่งโดยตรง หรือเทียบเท่าในสภาพแวดล้อมการพัฒนาที่ผสานรวม (IDE) ตราบใดที่ซอร์สโค้ดทั้งหมดอยู่ในไดเรกทอรีเดียวกัน คําสั่งแบบนี้จะใช้งานได้ดี

javac *.java

วิธีนี้จะสั่งให้คอมไพเลอร์ Java นําไฟล์แหล่งที่มาของ Java ทุกไฟล์ในไดเรกทอรีปัจจุบันแล้วเปลี่ยนเป็นไฟล์คลาสไบนารี กรณีง่ายๆ คือสิ่งที่คุณต้องการ

อย่างไรก็ตาม ข้อมูลแทรกจะเริ่มต้นขึ้นทันทีที่โค้ดขยาย javac ฉลาดพอที่จะดูไดเรกทอรีย่อยในไดเรกทอรีปัจจุบันเพื่อค้นหาโค้ดที่จะนําเข้า แต่การค้นหาโค้ดที่จัดเก็บไว้ในส่วนอื่นๆ ของระบบไฟล์ (อาจไม่ใช่ไลบรารีที่แชร์โดยหลายโปรเจ็กต์) นอกจากนี้ยังรู้วิธีสร้างโค้ด Java ด้วย ระบบขนาดใหญ่มักมีส่วนต่างๆ ที่เขียนขึ้นในภาษาโปรแกรมต่างๆ ที่มีเว็บทรัพยากร Dependency เหล่านั้น ซึ่งหมายความว่าไม่มีคอมไพเลอร์สําหรับภาษาเดียวก็สร้างระบบทั้งหมดได้

เมื่อต้องจัดการกับโค้ดจากหลายภาษาหรือหน่วยรวบรวมหลายหน่วย การสร้างโค้ดจะไม่ใช่กระบวนการเดียวที่ใช้ได้อีกต่อไป ในขั้นตอนนี้ คุณต้องประเมินโค้ดที่ใช้และออกแบบชิ้นส่วนเหล่านั้นตามลําดับที่เหมาะสม ซึ่งอาจเป็นการใช้เครื่องมือชุดละชิ้น หากทรัพยากร Dependency มีการเปลี่ยนแปลง คุณต้องทําขั้นตอนนี้ซ้ําเพื่อหลีกเลี่ยงไบนารีที่ไม่มีการอัปเดต สําหรับโค้ดเบสของขนาดปานกลาง กระบวนการนี้จะทําให้รู้สึกเบื่อหน่ายและเกิดข้อผิดพลาดได้ง่ายอย่างรวดเร็ว

นอกจากนี้ คอมไพเลอร์ยังไม่ทราบวิธีใช้วิธีจัดการทรัพยากร Dependency ภายนอก เช่น ไฟล์ JAR ของบุคคลที่สามใน Java หากไม่มีระบบบิลด์ คุณจะจัดการได้ด้วยการดาวน์โหลดทรัพยากร Dependency จากอินเทอร์เน็ต ใส่ไว้ในโฟลเดอร์ lib ในฮาร์ดไดรฟ์ และกําหนดค่าคอมไพเลอร์ให้อ่านไลบรารีจากไดเรกทอรีนั้น เมื่อเวลาผ่านไป การรักษาการอัปเดต เวอร์ชัน และแหล่งที่มาของทรัพยากร Dependency ภายนอกเหล่านี้เป็นเรื่องยาก

แล้วสคริปต์เปลือกหอยล่ะ

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

  • จะกลายเป็นเรื่องน่าเบื่อ เมื่อระบบมีความซับซ้อนมากขึ้น คุณก็เริ่มใช้เวลากับการสร้างสคริปต์บิวด์เกือบจะมากกับโค้ดจริง การแก้ไขข้อบกพร่องของสคริปต์ Shell เป็นเรื่องที่ยาก โดยมีการแฮ็กซ้อนกันมากขึ้นเรื่อยๆ

  • ช้าหน่อย เพื่อให้แน่ใจว่าคุณจะไม่อาศัยไลบรารีที่ไม่มีการอัปเดตโดยไม่ตั้งใจ คุณต้องให้สคริปต์บิวด์ทํางาน Dependency ทั้งหมดตามลําดับเมื่อคุณเรียกใช้ คุณพิจารณาเพิ่มตรรกะบางอย่างเพื่อตรวจจับว่าส่วนใดที่จําเป็นต้องสร้างใหม่ แต่ดูเหมือนว่าสคริปต์จะมีความซับซ้อนและมีข้อผิดพลาดได้ง่ายมาก หรือลองระบุว่าส่วนใดที่จําเป็นต้องสร้างใหม่ทุกครั้ง จากนั้นคุณกลับมาที่ส่วนสี่เหลี่ยมจัตุรัส

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

  • ภัยพิบัติ ฮาร์ดไดรฟ์ขัดข้อง และคุณจะต้องสร้างใหม่ทั่วทั้งระบบ คุณชาญฉลาดพอที่จะรักษาไฟล์ต้นฉบับทั้งหมดของคุณในการควบคุมเวอร์ชัน แต่จะเกิดอะไรขึ้นกับไลบรารีเหล่านั้นที่คุณดาวน์โหลด คุณจะเห็นไฟล์เหล่านั้นทั้งหมดอีกครั้งและตรวจสอบว่าไฟล์เหล่านั้นเป็นเวอร์ชันเดียวกันกับที่คุณใช้เมื่อดาวน์โหลดครั้งแรกหรือไม่ สคริปต์ของคุณอาจต้องอาศัยการติดตั้ง เนื้อหาในตําแหน่งที่เจาะจง คุณสามารถกู้คืนสภาพแวดล้อมเดียวกันนั้นเพื่อให้สคริปต์ทํางานอีกครั้งได้ไหม แล้วตัวแปรสภาพแวดล้อมทั้งหมดที่คุณตั้งค่าไว้นานแค่ไหนเพื่อให้คอมไพเลอร์ทํางานอย่างถูกต้องแล้วลืมไปเลยว่า

  • แม้ว่าจะมีปัญหาเกิดขึ้น โครงการของคุณก็ประสบความสําเร็จมากพอที่คุณจะเริ่มจ้างวิศวกรได้มากขึ้น และตอนนี้คุณก็ทราบดีว่าเหตุการณ์ภัยพิบัติก่อนหน้านี้จะไม่เกิดขึ้น ต้องผ่านขั้นตอนการบูตที่สร้างความเจ็บปวดให้เหมือนกันทุกครั้งที่นักพัฒนาแอปใหม่เข้าร่วมทีมของคุณ และแม้ว่าเราจะพยายามอย่างดีที่สุด ระบบของแต่ละคนก็ยังมีความแตกต่างกันอยู่เล็กน้อย บ่อยครั้ง สิ่งที่ได้ผลในคอมพิวเตอร์เครื่องหนึ่งจะได้ผลกับอีกเครื่องหนึ่ง และแต่ละครั้งจะใช้เวลา 2-3 ชั่วโมงในการแก้ไขข้อบกพร่องของเครื่องมือหรือไลบรารีเวอร์ชันต่างๆ เพื่อดูว่าความแตกต่างอยู่ตรงไหน

  • คุณตัดสินใจว่าจะกําหนดให้ระบบสร้างแบบอัตโนมัติ ในทางทฤษฎีแล้ว วิธีง่ายๆ มีดังนี้ การหาคอมพิวเตอร์เครื่องใหม่และตั้งค่าให้เรียกใช้สคริปต์บิวด์ทุกคืนโดยใช้ cron คุณยังคงต้องดําเนินการตามขั้นตอนการตั้งค่าที่เจ็บปวด แต่ ณ ปัจจุบัน คุณไม่ใช้ประโยชน์จากการที่สมองของมนุษย์สามารถตรวจจับและแก้ไขปัญหาเล็กๆ น้อยๆ ได้ ตอนนี้ทุกๆ คืนที่คุณเข้ามา จะเห็นว่าการสร้างของเมื่อคืนล้มเหลว เนื่องจากเมื่อวานนักพัฒนาซอฟต์แวร์ทําการเปลี่ยนแปลงที่ทํางานบนระบบของตน แต่ใช้งานไม่ได้ในระบบการสร้างอัตโนมัติ ทุกๆ ครั้งที่แก้ปัญหาได้ง่ายๆ แต่เกิดขึ้นบ่อยมากจนทําให้ต้องใช้เวลามากมายในแต่ละวันเพื่อค้นพบและใช้การแก้ไขง่ายๆ เหล่านี้

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

คุณพบปัญหาแบบคลาสสิกในวงกว้าง สําหรับนักพัฒนาซอฟต์แวร์รายหนึ่งที่ต้องการเขียนโค้ดไม่เกิน 200 บรรทัดเป็นเวลาไม่เกิน 1 หรือ 2 สัปดาห์ (ซึ่งอาจเป็นประสบการณ์ทั้งหมดที่ได้จากนักพัฒนาซอฟต์แวร์ที่เพิ่งจบการศึกษาจากมหาวิทยาลัย) สคริปต์อาจใช้เวลานานกว่าเล็กน้อย แต่ทันทีที่คุณต้องประสานงานกับนักพัฒนาซอฟต์แวร์หลายรายและกับเครื่องของพวกเขา แม้แต่สคริปต์บิวด์ที่สมบูรณ์แบบก็ยังไม่เพียงพอเพราะการจะคํานึงถึงความแตกต่างเล็กๆ น้อยๆ ในเครื่องเหล่านั้นจึงเป็นเรื่องยากมาก เมื่อถึงขั้นนี้ แนวทางง่ายๆ นี้ก็แจกแจงรายละเอียดและได้เวลาลงทุนในระบบการสร้างจริง