กลยุทธ์การแยก Git สำหรับโค้ดที่ยังไม่เผยแพร่ซึ่งใช้งานมานาน


15

ที่ทีมของเรานอกเหนือจากงานแต่ละหน่วย (เรื่อง) เรามีธีมการทำงานที่ยาวนานขึ้น (Epics) เรื่องราวหลากหลายทำให้มหากาพย์

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

มีคำแนะนำใด ๆ เกี่ยวกับวิธีจัดการ repo ของเราเพื่อให้บรรลุเป้าหมายนี้หรือไม่? ฉันคิดว่าจะแนะนำ "สาขาที่ยิ่งใหญ่" ซึ่งเราจะรวมเรื่องที่ปิดไปยังสาขาที่เกี่ยวข้องแทนการเป็นอาจารย์โดยตรง แต่ข้อกังวลของฉันคือ:

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

คำตอบ:


23

คำแนะนำง่ายๆ: อย่าทำอย่างนั้น

สาขาคอมไพล์ไม่ได้สำหรับงายาวทำงานของรหัสตามที่กล่าวไว้ที่นี่และhttps://blog.newrelic.com/2012/11/14/long-running-branches-considered-harmful/ สาขาได้รับการปฏิบัติอย่างดีที่สุดเป็นสิ่งชั่วคราวที่ใช้ในการจัดระเบียบคอมมิทชันโดยนักพัฒนาแต่ละคนในระดับต่อวัน ดังนั้นหากพวกเขามีชื่อที่ตรงกับสิ่งที่ผู้จัดการโครงการ (ให้ผู้ใช้คนเดียว) อาจสนใจคุณทำอะไรผิด

แนวทางปฏิบัติที่แนะนำคือการใช้การรวมอย่างต่อเนื่องกับการสลับคุณลักษณะหรือการแยกสาขาโดยย่อเพื่อให้แน่ใจว่า:

  • รหัสทั้งหมดรวมอยู่ตลอดเวลา (อย่างน้อยทุกวันโดยเฉพาะอย่างยิ่งบ่อยกว่า)
  • สิ่งที่ได้รับการปรับใช้อยู่ภายใต้การควบคุมที่ชัดเจน

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

คุณสามารถใช้สาขาเพื่อพัฒนาโค้ดได้อย่าใช้เพื่อเก็บรหัส ดังนั้นหากคุณไม่แน่ใจว่างานนั้นมีการแก้ไข 30 นาทีหรือทำงานซ้ำ 2 สัปดาห์ให้เริ่มจากสาขา ทันทีที่คุณรู้ทั้งผสานหรือ refactor เพื่อนามธรรม / สลับจากนั้นผสาน
soru

@Sitati: ฉันเพิ่งรวมรหัสบางอย่างที่อยู่ในสาขาคุณลักษณะในช่วงสี่เดือนที่ผ่านมา ในระหว่างนี้develเราได้เปลี่ยนมาใช้ CMake จาก Autotools ได้แนะนำ Travis CI และทำการปรับปรุงรหัสใหม่ ในที่สุดมันก็ง่ายต่อการเข้าใจคุณสมบัติใหม่และใช้มันด้วยตนเองdevelกว่าพยายามที่จะผสานมัน นอกจากนี้เรายังให้นักศึกษาปริญญาโทใหม่พัฒนาคุณลักษณะใหม่ในสาขาที่พวกเขาแยกออกเมื่อพวกเขาเริ่มทำวิทยานิพนธ์ หลังจากหนึ่งปีพวกเขาผลักมันและไม่มีความพยายามที่จะรวมมันกลับดังนั้นมันจึงยากที่จะรวมวันต่อวัน
Martin Ueding

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

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

1

ฉันคิดว่านี่เป็นปัญหาที่พบได้บ่อยมากและเลือกที่จะรวมฟีเจอร์ในรีลีสหลังจากฟีเจอร์นั้นได้รับการเข้ารหัสมากกว่าที่เคยเป็นมา

เช่น.

ฉันมีคุณสมบัติ A, B และ C สำหรับ v2 ของผลิตภัณฑ์ของฉัน เกี่ยวข้องกับ B และ C ฉันไม่ต้องการปล่อย B จนกว่า C จะเสร็จสิ้น

ฉันมีสาม devs ทั้งหมดทำงานในเวลาเดียวกันกับคุณสมบัติ

ฉันมีชุดในวันที่วางจำหน่ายหิน D

B เสร็จสิ้นและรวมเข้าด้วยแล้ว A เสร็จสิ้นและรวมเข้าด้วยกัน C ล่าช้า ... ฉันต้องทำอย่างไรดี!

ฉันไม่เชื่อว่าจะมีวิธีแก้ไขปัญหาทางเทคนิคสำหรับปัญหานี้ คุณต้องการปล่อยรุ่นที่ยังไม่ทดลองของผลิตภัณฑ์ที่มีคุณสมบัติ A เท่านั้น หากคุณไม่รวมและทดสอบคุณลักษณะที่เป็นไปได้ทั้งหมดสิ่งนี้จะเป็นไปได้เสมอ

การแก้ปัญหาเป็นมนุษย์มากกว่า คุณพลาดวันที่วางจำหน่ายและต้องย้อนกลับ


1

นี่เป็นปัญหาที่ยุ่งยาก แต่มีหลายคนที่ต้องเผชิญ ฉันชอบที่จะใช้การตั้งค่า Gitflow เป็นจุดเริ่มต้น

การพัฒนา -> สิ่งใหม่ที่กำลังทำงานอยู่ใน
ระดับปริญญาโท -> สิ่งที่เสร็จสิ้นแล้วซึ่งต้องการการทดสอบการผลิต -> สิ่งที่ได้รับการเผยแพร่ไปยังการผลิต

ที่คุณสมบัติรอง (สั้นกว่า) ฉันสร้างสาขาจากการพัฒนาทำงานที่นั่นแล้วผสานสาขากลับไปสู่การพัฒนา

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

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

เมื่อใดก็ตามที่มีการรวมต้นแบบเข้ากับการพัฒนาและการพัฒนาควรถูกรวมเข้ากับสาขาย่อยระยะยาว

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

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

ต้นไม้ปกติของฉันดูเหมือน

 LongTerm -> Development -> Master -> Production    
 LongTerm <- Development      |            |  
     |       Development -> Master         |  
 LongTerm <- Development -> Master         |  
             Development <- Master         |  
                            Master -> Production  

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

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


"ที่ฟีเจอร์หลัก (ระยะยาว) ฉันสร้างสาขาจากการพัฒนา" - คุณไม่ควรสร้างสาขาฟีเจอร์ (พัฒนา) สาขาใหม่จากสาขาการผลิตหรือไม่ เห็นว่าเป็นสาขาการผลิตเป็นรหัสพร้อมออก
robotron

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

แต่ถ้าคุณแยกสาขาจาก dev และหลังจากนั้นกลับมารวมกันอีกครั้งสาขานั้นก็จะไม่รวมกัน (และหลังจากนั้นก็เป็น Master และ Production ในภายหลัง) ดังนั้นจึงรวมการเปลี่ยนแปลง dev ทั้งหมดที่ผู้อื่นทำไว้จนถึงจุดที่แตกแขนงออกไป การเปลี่ยนแปลงบางอย่างนั้นอาจไม่ได้รับการอนุมัติ QA บางทีกำลังพูดถึงวิธีการต่าง ๆ เพื่อปล่อยการจัดการ
robotron

ใช่มันจะเป็นประเด็น QA ทำการทดสอบกับ SHA เฉพาะในมาสเตอร์ แต่คุณไม่สามารถพัฒนาได้
coteyr

"การทดสอบ QA สำหรับ SHA เฉพาะในต้นแบบ" -> QA ทดสอบคุณลักษณะใหม่แต่ละรายการเป็นแบบสแตนด์อโลนหรือไม่ ให้ฉันดำเนินการตามสถานการณ์ทั่วไปที่ทีมของฉันเผชิญ: สมมติว่าคุณมีโครงการที่ดำเนินการมานาน 2 โครงการบนฐานข้อมูลเดียวกัน: โครงการ A อยู่ใน QA สำหรับเดือนที่ผ่านมาและจะถูก QA สำหรับอีกเดือนหนึ่ง โครงการ B อยู่ระหว่างการพัฒนาในช่วง 6 เดือนที่ผ่านมาและพร้อมสำหรับการประกันคุณภาพ โปรเจ็กต์ A ถูกรวมเข้ากับมาสเตอร์และไม่พร้อมสำหรับการผลิตเนื่องจากข้อผิดพลาดของกฎทางธุรกิจที่ละเอียดอ่อนมากมาย เราจะจัดการโครงการ B ได้อย่างไร ต้องทดสอบ A และ B ร่วมกันเพื่อตรวจสอบการโต้ตอบ (B จะไม่ทำให้เกิดข้อขัดแย้งระหว่างการรวม)
robotron
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.