คุณจัดการกับการรวมรหัสจากหลาย ๆ สาขา / นักพัฒนาแต่ละ sprint ได้อย่างไร


42

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

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

เราจะลดภาระนี้และทำให้รหัสของเรารวมเข้าด้วยกันได้ง่ายขึ้นได้อย่างไร จากมุมมองของฉันการมี PO หรือ SM จัดลำดับความสำคัญของเรื่องราวด้วยวิธีที่มีประสิทธิภาพมากขึ้นดังนั้นเราจึงไม่มีการพึ่งพาเหล่านี้ในการวิ่งเดียวกันอาจช่วยแก้ปัญหาบางอย่างได้ คนอื่นจะรับมือกับเรื่องนี้อย่างไร หรือนี่เป็นเพียงส่วนหนึ่งของกระบวนการ?


18
คุณไม่มีสาขาการพัฒนาที่ทำการรวมระบบอย่างต่อเนื่องหรือไม่
Kayaman

13
ฉันอยู่กับ Kayaman ที่นี่วิธีปฏิบัติที่ดีที่สุดสำหรับสิ่งนี้คือการนำการบูรณาการอย่างต่อเนื่อง
RandomUs1r

27
สุขสันต์วันผสาน! เมื่อใดก็ตามที่ปัญหาของคุณคล้ายกับบางอย่างใน The Daily WTF คุณรู้ว่าคุณกำลังมีปัญหา
3067860

ผสานเร็วผสานบ่อย: {เขียนรหัสทดสอบที่เล็กที่สุดที่จะล้มเหลว (สีแดง) เขียนรหัสการผลิตที่เล็กที่สุดที่จะผ่าน (สีเขียว), refactor ทดสอบซ้ำผสาน} ในขณะที่ยังไม่เสร็จ
ctrl-alt-delor

1
การเช็คอินครั้งแรกชนะ! ไม่เคยเป็นคนสุดท้าย! :-)
ChuckCottrill

คำตอบ:


88

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

เมื่อนักพัฒนาที่จะทำกับการทำงานของพวกเขาพวกเขาสร้างคำขอดึง เมื่อได้รับการอนุมัตินั่นจะถูกรวมเข้ากับdevelopสาขา

developสาขาควรมีรหัสการทำงานและมีความพร้อมสำหรับการเปิดตัวในเวลาใดก็ได้ เมื่อคุณจริงต้องมีการปลดปล่อยคุณผสานdevelopเข้าmasterและแท็กมัน

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


73
ส่วนที่สำคัญ (ซึ่งบอกเป็นนัยในคำตอบของคุณ) คือควรรวมสาขาทันทีที่พร้อมโดยปกติจะมีเพียง 1 - 5 คอมมิชชันและไม่เพียง แต่ในตอนท้ายของการวิ่ง สาขาหนึ่งต่อคุณลักษณะ / เรื่องราวไม่ใช่สาขาหนึ่งต่อผู้พัฒนา ต้องใช้ว่าเรื่องราวนั้นเล็กจริง ๆ เช่นใช้เวลาไม่เกินสองวัน
amon

@ มอนมเห็นด้วย เพิ่มคำว่า "สาขาฟีเจอร์" แต่พยายามที่จะให้คำตอบนี้มีขนาดค่อนข้างเล็ก มีบทความดีๆมากมายที่พูดถึงกระบวนการนี้ให้ลึกซึ้งยิ่งขึ้น
Berin Loritsch

5
อย่าอยู่โดดเดี่ยวในสาขาของคุณเอง นั่นคือวิธีที่การรวมนรกเริ่มต้นขึ้น ใช้การพัฒนาการฉีดแยกการทำงานระหว่างดำเนินการเบื้องหลังสลับคุณสมบัติหรือการกำหนดค่าเวลาทำงานอื่น ๆ
Rob Crawford

3
@Zibbobz ทีมของฉันใช้ "Feature Branches" อย่างชัดเจนสำหรับผู้ที่ได้รับการปฏิบัติเหมือนเป็นสาขาที่พัฒนา แต่สำหรับคำขอดึงและยอมรับที่เกี่ยวข้องกับการเปลี่ยนแปลงนั้น โดยทั่วไปขึ้นอยู่กับระยะเวลาที่ต้องแยกจากกันทุกๆสองสามวันจะมีคนรวมการเปลี่ยนแปลงจากการพัฒนาเป็นคุณลักษณะและแก้ไขปัญหาใด ๆ วิธีนั้นกิ่งไม้จะคล้ายกันมากที่สุดเมื่อถึงเวลาที่จะผสาน โปรดทราบว่านี่เป็นเพียงการเปลี่ยนแปลงที่ยิ่งใหญ่จริงๆ
reffu

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

23

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

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


2
นี่คือประสบการณ์ของฉันเช่นกัน มันไม่สำคัญว่าคุณจะกระทำบ่อยแค่ไหน แต่เมื่อมีการรวมเข้าด้วยกัน / รวมกันอย่างรวดเร็วการคอมมิชชันจะช่วยประหยัดความพยายามลงมาก ครั้งหนึ่งฉันเคยอยู่ในโครงการที่เรามีสาขาการพัฒนาที่แตกต่างกันสามสาขาซึ่งแต่ละแห่งมีค่าใช้จ่ายในการทำงานเป็นเดือน การผสานพวกเขาไม่ใช่เรื่องสนุก ฉันได้เรียนรู้มากมายจากความผิดพลาดนั้น :)
amon

4
ใช่ - นี่คือความหมายของ "การผสานรวมอย่างต่อเนื่อง"! คุณกำลังรวมการเปลี่ยนแปลงของคุณอย่างต่อเนื่องกับการเปลี่ยนแปลงของนักพัฒนาคนอื่น!
Rob Crawford

@Rob เห็นด้วย คำแถลงของฉันไม่ได้หมายถึงการแนะนำว่าการผสานรวมอย่างต่อเนื่องไม่ได้ดีอย่างต่อเนื่อง แค่ว่าเราไม่ได้ทำในอุดมคติและยังเห็นประโยชน์มากมายในการเข้าใกล้มัน
Daniel

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

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

จากนั้นเมื่อการผสานของคุณเสร็จสมบูรณ์คุณสามารถตรวจสอบรายงานการทดสอบระบบอัตโนมัติร่วมกันและตรวจสอบว่าทุกอย่างรวมกันเรียบร้อยแล้ว

ฉันเห็นด้วยกับหนึ่งในคำตอบอื่น ๆ ที่ผู้เขียนระบุ Git PRs จะแก้ปัญหานี้โดยการให้นักพัฒนาแต่ละคนรวมงานของตัวเอง

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


6

อย่า

ขึ้นอยู่กับภาษาของคุณและไฟล์ที่คุณกำลังแก้ไขอาจไม่เหมาะสมที่นักพัฒนาแต่ละคนจะทำการแก้ไขในสาขาของตนเอง ตัวอย่างเช่นใน C # ฉันพบว่าเป็นการดีที่สุดที่จะมีเพียงคนเดียวเท่านั้นที่จะแก้ไขไฟล์ตัวออกแบบ UI ได้ตลอดเวลา ไฟล์เหล่านี้เป็นไฟล์ที่สร้างอัตโนมัติและบางครั้งรหัสก็ถูกย้ายไปมาโดยไม่มีเหตุผลที่ชัดเจน

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

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


เครื่องมือการควบคุมเวอร์ชันที่ใช้งานมีความสำคัญต่อการแยกและการรวมที่ประสบความสำเร็จ ถึงแม้จะมีรหัส C # และสันนิษฐาน WinForms หรือ WebForms รหัสที่คุณจะต้องทำงานร่วมกับมักจะไม่เปลี่ยนมากว่า หากเป็นเช่นนั้นคุณอาจต้องทำการจำลองก่อนที่จะเล่นด้วยรหัส UIs ที่ใช้ XAML นั้นมีเสถียรภาพเช่นเดียวกับรหัสปกติและรหัสกลางที่ไม่ได้รับการตรวจสอบ
Berin Loritsch

2
@BerinLoritsch WinForms รหัสออกแบบแน่นอนสามารถเปลี่ยนแปลงได้มากถึงแม้จะมีการเปลี่ยนแปลงภาพเล็กน้อย ฉันพบว่าบรรทัดของรหัสตัวเองเหมือนกัน แต่การสั่งซื้อนั้นแตกต่างกันอย่างมาก - โดยเฉพาะอย่างยิ่งเมื่อนักพัฒนาหลายคนกำลังทำการแก้ไขในเวลาเดียวกัน อาจเป็นปัญหาของเครื่องมือ VCS (เราใช้หลายอย่างบางทีเราแค่ใช้สิ่งที่ผิด) แต่สำหรับเรามันง่ายกว่ามากในการเปลี่ยนแปลงกระบวนการของเราเล็กน้อย
mmathis

2
@BerinLoritsch ฉันต้อง mmathis ที่สองที่นี่อย่างน้อยสำหรับแบบฟอร์มการชนะ (ไม่เคยใช้เว็บฟอร์ม) ตัวออกแบบ UI ของ winforms ชอบที่จะจัดลำดับรหัสทั้งหมดใหม่ในไฟล์ตัวออกแบบเพื่อตอบสนองต่อการเปลี่ยนแปลงเล็กน้อยในรูปแบบ เว้นแต่คุณจะยกเลิกการจัดลำดับใหม่ด้วยตนเองก่อนที่จะกระทำแต่ละครั้ง (บางสิ่งที่อาจเป็น 10 หรือ 15 นาทีในรูปแบบที่ซับซ้อน) ประวัติของไฟล์ผู้ออกแบบนั้นไร้ประโยชน์อย่างแน่นอนและถ้า 2 คนทำงานกับ UI ของฟอร์มในครั้งเดียว ความขัดแย้งผสานจากนรก การล็อคโดยทั่วไปนั้นเป็นตัวเลือกที่น่ากลัว แต่ด้วยการใช้ winforms นั้นเป็นสิ่งที่ชั่วร้ายที่สุด
Dan Neely

@DanNeely นั่นเป็นเพียงหนึ่งในเหตุผลที่ทีมของเราย้ายออกจากรหัส WinForms อีกเหตุผลหนึ่งก็คือผู้ออกแบบมีความเปราะบางอย่างยิ่งและรูปแบบที่ซับซ้อนบางอย่างของเราไม่สามารถแก้ไขด้วยสายตาได้ เราต้องทำการเปลี่ยนแปลงโดยตรงใน codebehind - อาจเป็นสาเหตุที่ฉันจำไม่ได้ว่ามีการเปลี่ยนแปลงมากเกินไป สิ่งนั้นและผู้ใช้ของเราที่ทำงานด้วยหน้าจอความหนาแน่นสูงผลักเราให้เป็น WPF จริงๆ กระบวนการที่เจ็บปวดพร้อมกับช่วงการเรียนรู้ที่สูง แต่เป็นรางวัลที่ดีในตอนท้าย เรื่องราวส่วนใหญ่ใน Backlog เป็นส่วนต่างของแอพอยู่แล้ว
Berin Loritsch

@BerinLoritsch เหมือนกันที่นี่ แบบฟอร์ม Win จ่ายส่วนใหญ่ของค่าของฉันสำหรับส่วนใหญ่ของทศวรรษที่งานก่อนหน้าของฉัน แต่ฉันจะมีความสุขมากที่จะไม่สัมผัสอีกครั้งในอนาคต
Dan Neely

2

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

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

ดังที่คำตอบอื่น ๆ ได้ชี้ให้เห็นแล้วควรรวมกับโซลูชันการรวมอย่างต่อเนื่อง

คุณสมบัติธงมีประโยชน์เพิ่มเติม (ตัวอย่างเช่นทำให้ง่ายต่อการทดสอบ A / B) ดูบทความนี้โดย Martin Fowlerสำหรับข้อมูลเพิ่มเติม


0

เรากำลังติดตามวิธีการของสาขาการพัฒนาแยกต่างหากสำหรับแต่ละคุณสมบัติแล้วเราจะรวมสาขากับสาขา QA สำหรับการทดสอบในสภาพแวดล้อมการทดสอบการรวม

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

หากทุกอย่างเป็นไปด้วยดีเราจะรวมสาขาย่อยกลับไปที่สาขาหลัก


0

ในการกล่าวง่ายๆการรวมและการรวมมักจะลดหน้าต่างแห่งโอกาสในการรวมความขัดแย้งและจะลดความขัดแย้งอย่างมาก อีกส่วนคือการวางแผนโดยผู้นำซึ่งสามารถทำให้มั่นใจได้ว่างานจะราบรื่น

คำตอบอื่น ๆ ให้ข้อมูลเชิงลึกที่ดีเกี่ยวกับแนวทางปฏิบัติที่ดีที่สุดสำหรับการผูกมัดและเพียงทำตามสิ่งเหล่านั้นคุณอาจลดปัญหาการรวมส่วนใหญ่ของคุณ การรวมกันมากขึ้นนั้นเป็นสิ่งจำเป็นอย่างแน่นอน แต่สำหรับทีมขนาดเล็กแนวทางของสาขาต่อคนอาจทำงานได้ดีพอ แน่นอนว่ามันไม่เจ็บ (มาก) ในการฝึกปฏิบัติที่สามารถขยายได้มากขึ้น!

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.