คำอธิบายอย่างง่ายของการรวมอย่างต่อเนื่อง


32

คุณจะกำหนด Integration Integration อย่างต่อเนื่องและส่วนประกอบ CI เซิร์ฟเวอร์ใดที่ประกอบด้วย

ฉันต้องการอธิบายให้คนในแผนกการตลาดทราบว่าการรวมระบบแบบต่อเนื่องคืออะไร พวกเขาเข้าใจการควบคุมแหล่งที่มา - เช่นพวกเขาใช้การโค่นล้ม แต่ฉันต้องการอธิบายให้พวกเขาทราบอย่างถูกต้องว่า CI คืออะไร วิกิพีเดียบทความไม่ถูกต้องกำหนดมันบทความ Martin Fowlerเพียง แต่ช่วยให้ต่อไปนี้ซึ่งเป็นพื้นซ้ำซากตามด้วยคำอธิบายที่คลุมเครือของ 'บูรณาการ':

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

อัปเดต : ฉันส่งภาพนี้ให้ฉันพวกเขาไม่สามารถหาภาพที่ง่ายกว่านี้ได้

ป้อนคำอธิบายรูปภาพที่นี่

อัปเดต 2 : ย้อนกลับจากแผนการตลาด (สำหรับช่วงเวลาที่มีคำถาม 3 ข้อ):

ฉันชอบคำตอบทั้งหมด 3 ข้อ - ด้วยเหตุผลที่แตกต่างกัน ฉันรู้สึกเหมือนเข้าสู่ระบบเพียงเพื่อขอบคุณพวกเขาทั้งหมด!

เห็นได้ชัดว่าเขาไม่สามารถ - ขอบคุณในนามของเขา :)

อัปเดต 3 : ฉันรู้แล้วว่าได้อ่านบทความ Wikipedia ว่ามันมีหลักการซึ่งเมื่อคุณใช้หัวเรื่องเป็นรายการที่ค่อนข้างดี:

  1. รักษาที่เก็บรหัส
  2. สร้างโดยอัตโนมัติ
  3. สร้างการทดสอบตัวเอง
  4. ทุกคนมุ่งมั่นที่จะเป็นพื้นฐานทุกวัน
  5. ควรสร้างทุกการกระทำ (ถึงพื้นฐาน)
  6. สร้างงานต่อไป
  7. ทดสอบในโคลนของสภาพแวดล้อมการผลิต
  8. ทำให้เป็นเรื่องง่ายที่จะได้รับผลงานล่าสุด
  9. ทุกคนสามารถเห็นผลลัพธ์ของการสร้างล่าสุด
  10. ทำให้การใช้งานโดยอัตโนมัติ

3
oO ฝ่ายการตลาดของคุณใช้การโค่นล้ม? ล่อลวงให้โหวตให้ปิดเป็น "Too Localized" ... ;-)
Jeroen

@ Jeroen Yep จริงๆแล้วสำหรับไฟล์ในเว็บไซต์ ฉันทำให้พวกเขาเป็นปุ่มสีแดงขนาดใหญ่บนหน้าเว็บที่ระบุว่า 'ทำ' เพื่ออัปเดตการโค่นล้มบนเซิร์ฟเวอร์ :)
icc97

คำตอบ:


27

เมื่อมีคนเปลี่ยนไฟล์ที่ประกอบขึ้นเป็นผลิตภัณฑ์ซอฟต์แวร์และจากนั้นพยายามตรวจสอบใน (กล่าวอีกนัยหนึ่งพยายามรวมการเปลี่ยนแปลงในรหัสผลิตภัณฑ์หลัก) ที่คุณต้องการตรวจสอบให้แน่ใจว่าผลิตภัณฑ์ซอฟต์แวร์ยังสามารถสร้างได้สำเร็จ

โดยปกติจะมีระบบภายนอกที่เรียกว่าเซิร์ฟเวอร์ CIซึ่งเป็นระยะ ๆ หรือทุก ๆ การเปลี่ยนแปลงจะคว้าไฟล์ต้นฉบับจากการควบคุมเวอร์ชันและพยายามสร้างผลิตภัณฑ์ (คอมไพล์ / ทดสอบ / แพ็คเกจ) หากเซิร์ฟเวอร์ CI สามารถสร้างบิลได้สำเร็จการเปลี่ยนแปลงจะถูกรวมเข้าด้วยกันเป็นผลสำเร็จ

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

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


1
การรวมอย่างต่อเนื่องใส่ใจเกี่ยวกับสถานะการสร้าง แต่ยังเกี่ยวกับการทดสอบ
Quentin Pradet

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

1
เนื่องจากคำถามขอคำอธิบายอย่างง่ายฉันจึงออกรายละเอียดโครงการ (ทีมส่วนใหญ่ / เฉพาะเวลา) จำนวนมากซึ่งอาจเข้าสู่ระบบ CI
c_maker

สิ่งนี้ขึ้นอยู่กับการพัฒนาโดยอาศัยการทดสอบหรือไม่? รหัสที่คอมไพล์ไม่ใช่รหัสที่ใช้งานได้ใช่ไหม หากไม่มีการทดสอบจะล้มเหลวเมื่อรหัสไม่พร้อมระบบ CI จะทราบได้อย่างไรว่ารหัสรวมเข้าด้วยกันได้อย่างไร
mowwwalker

1
@ user828584: ในคำตอบของฉันฉันหมายความว่า 'ทดสอบ' เป็นส่วนหนึ่งของงานสร้าง และในฐานะที่เป็นด้านข้าง TDD นั้นแตกต่างจากการทดสอบเพื่อตรวจสอบคุณภาพ ในฐานะที่เป็นผลข้างเคียงของ TDD คุณจะได้รับการทดสอบเป็นอย่างดี แต่คุณสามารถทำการทดสอบได้โดยไม่ต้องทำการทดสอบ TDD เลย
c_maker

33

ผมคิดว่าสำหรับแผนกการตลาดของคุณมันไม่ได้เป็นสิ่งที่สำคัญวิธีการทำงานของ CIแต่หมายถึงสิ่ง CI สำหรับรุ่นใหม่ของซอฟต์แวร์ของคุณ

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

ตัวอย่างเช่นหากคุณมีชุดคุณลักษณะใหม่ที่วางแผนไว้ว่าจะวางจำหน่ายอย่างเป็นทางการสำหรับซอฟต์แวร์เวอร์ชั่น "2015" ของคุณและคุณมีส่วนหนึ่งของชุดคุณสมบัติที่ได้รับการเข้ารหัสและรวมไว้แล้วในปัจจุบันผู้ทำการตลาดสามารถใช้เวอร์ชันปัจจุบันของ ซอฟต์แวร์และแสดงอย่างปลอดภัยมากขึ้นหรือน้อยลงในการประชุมครั้งต่อไปในปี 2556 หากไม่มี CI พวกเขาจะต้องถามทีมของคุณเกี่ยวกับการแช่แข็งรหัสที่ไม่ได้วางแผนไว้สมาชิกทุกคนในทีมต้องรวมคุณสมบัติครึ่งที่อบ ผลิตภัณฑ์อาจไม่มีการทดสอบอัตโนมัติเพียงพอและคาดเดาว่าจะเกิดอะไรขึ้นในการประชุม "รุ่นอัลฟ่า" ของการเปิดตัว 2015er ของคุณจะมีความเสี่ยงสูงกว่าที่จะเกิดการชนโดยเฉพาะอย่างยิ่งเมื่อแสดงคุณสมบัติใหม่


4
+1 เมื่อใกล้ถึงประโยชน์ที่ได้รับ
โผล่

17

คุณไม่สามารถรู้ได้ว่า CI คืออะไรเว้นแต่คุณจะรู้ว่าเราเคยทำอะไร ลองนึกภาพระบบที่มี 3 ส่วน มี UI ที่รวบรวมข้อมูลและวางไว้ในฐานข้อมูล มีระบบการรายงานที่สร้างรายงานจากฐานข้อมูล และมีเซิร์ฟเวอร์บางประเภทที่ตรวจสอบฐานข้อมูลและส่งการแจ้งเตือนทางอีเมลหากตรงตามเกณฑ์ที่กำหนด

นานมานี้จะถูกเขียนดังนี้:

  1. เห็นด้วยกับสคีมาสำหรับฐานข้อมูลและข้อกำหนด - ใช้เวลาหลายสัปดาห์เพราะมันจะต้องสมบูรณ์แบบเพราะคุณจะเห็นว่าทำไมในไม่ช้า
  2. กำหนด 3 devs หรือ 3 ทีมอิสระของ devs ไปยัง 3 ชิ้น
  3. ผู้พัฒนาแต่ละคนจะทำงานกับชิ้นส่วนของตนและทดสอบชิ้นส่วนของตนโดยใช้สำเนาฐานข้อมูลของตนเองเป็นเวลาหลายสัปดาห์หรือหลายเดือน

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

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

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

คุณอาจคิดว่าฉันกำลังพูดเกินจริงเรื่องแรก ฉันทำงานให้กับ บริษัท บ้างครั้งหนึ่งเมื่อผู้ติดต่อของฉันเคี้ยวฉันเพื่อตรวจสอบรหัสบางอย่างที่เกิดจากข้อบกพร่องต่อไปนี้:

  • หน้าจอที่เขาไม่ได้ทำงานมีปุ่มที่ยังไม่ได้ทำอะไรเลย
  • ผู้ใช้ไม่ได้ลงชื่อออกในการออกแบบหน้าจอ (สีและแบบอักษรที่แม่นยำการมีอยู่ของหน้าจอความสามารถและปุ่มที่มีอยู่ในข้อมูลจำเพาะ 300 หน้า)

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

นอกจากนี้หากคุณพบว่ามันยากที่จะเชื่อว่าทีมจะถูกตัดการเชื่อมต่อรอบ ๆ ทรัพยากรที่ใช้ร่วมกันเช่นฐานข้อมูลคุณจะไม่เชื่อจริงๆ คุณกำลังจะเขียนฟังก์ชั่นที่ฉันสามารถโทรได้หรือไม่? เยี่ยมมากเลยไปข้างหน้าและทำสิ่งนั้นฉันจะทำ hardcode สิ่งที่ฉันต้องการในระหว่างนี้ เดือนต่อมาฉันจะ "รวม" รหัสของฉันดังนั้นจึงเรียก API ของคุณและเราจะพบว่ามันระเบิดถ้าฉันผ่าน null ฉันระเบิดถ้ามันคืน null (และมันมากที่) มันกลับสิ่งที่ใหญ่เกินไป สำหรับฉันมันไม่สามารถจัดการปีอธิกสุรทินและอีกพันสิ่งได้ ทำงานอย่างอิสระและมีเฟสการรวมเป็นปกติ ตอนนี้ดูเหมือนบ้า


2
เรามีเรื่องราวที่คล้ายกันซึ่งเราได้อัปเกรดแอปพลิเคชันที่กำหนดเองที่สร้างขึ้นใน SP 2003 เป็น SP 2007 โดยใช้ VSS (ใช่ VSS :) ผู้พัฒนาแต่ละคนตรวจสอบไฟล์บางส่วนของพวกเขาเขียนโค้ดสำหรับหนึ่งและสองสัปดาห์ รหัสบูมของเราซึ่งเมื่อปัญหาเริ่มต้นขึ้นเนื่องจากรหัสของเราเบี่ยงเบนอย่างมีนัยสำคัญ เราแก้ไขปัญหาการรวมเป็นเวลาหนึ่งเดือนและโครงการเช่าโรงแรมเพื่อรองรับผู้ที่อาศัยอยู่ไกลมากในวันธรรมดา ในวันนั้นฉันเรียนรู้ที่จะรวมรหัสในแต่ละวัน :-)
OnesimusUnbound

@OnesimusUnbound ฉันจำได้ว่าโดนชนจาก VSS ไปยัง Clearcase ... ออกจากกองไฟ หลายปีต่อมาหลังจากกลับไปที่ บริษัท เดียวกันสำหรับเครื่องดื่มฉันจำได้ว่ามีคนหัวเราะที่นักพัฒนาเพื่อนเพราะพูดถึงการควบคุมแหล่งใหม่นี้ที่เรียกว่า 'Git', "เราต้องการระบบควบคุมแหล่งอื่นสำหรับอะไร?"
icc97

1
ขอบคุณ - ฉันได้พยายามเข้าใจ CI มาก่อนเพียงเพราะฉันไม่รู้ว่าทางเลือกคืออะไร
Rhys

น่าสนใจ สำหรับฉันมันฟังดูคล้ายกับการเปรียบเทียบ CI กับน้ำตก แต่คุณสามารถใช้วิธีการที่ไม่ใช่น้ำตกที่หลีกเลี่ยงปัญหาเหล่านี้ (เช่นการพัฒนาซ้ำ ๆ ) และไม่ใช้ CI
Dan Molding

@DanMoulding ถ้าฉันมีความว่องไวและทำซ้ำและอะไรก็ตามที่อยู่ในส่วนของสิ่งที่ใหญ่กว่าที่ไม่ได้รวมเข้ากับสิ่งที่คนอื่นกำลังทำอยู่ฉันไม่ได้ทำ CI เฮ็คคุณสามารถน้ำตกและ CI ออกแบบรหัสทดสอบทั้งหมดหากคุณต้องการ - ถ้าทุกคนใช้โค้ด / สคีมา / เลย์เอาต์ของคนอื่นตลอดเวลานั่นคือ CI แม้ว่าคุณจะใช้ฟอเรสต์อยู่ก็ตาม การเชื่อมต่อคือโดยไม่ต้อง CI คุณอยู่และตายโดย BDUF เพราะนั่นคือความหวังเดียวของคุณ (และกลายเป็นความหวังจาง ๆ ) ของการมีระยะการรวมที่มีความยาวที่เหมาะสม การยอมรับ CI ทำให้เราสามารถละทิ้ง BDUF ได้
Kate Gregory
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.