ทำไมจึงต้องใช้ระบบการสร้าง

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

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

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

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

ฉันใช้แค่คอมไพเลอร์ไม่ได้ใช่ไหม

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

javac *.java

คำสั่งนี้จะสั่งให้คอมไพเลอร์ Java นำไฟล์ซอร์สโค้ด Java ทั้งหมดในไดเรกทอรีปัจจุบันไปเปลี่ยนเป็นไฟล์คลาสไบนารี ในกรณีที่ง่ายที่สุด สิ่งที่คุณต้องทำมีเท่านี้

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

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

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

แล้วสคริปต์ของ Shell ล่ะ

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

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

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

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

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

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

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

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

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