ขออภัยเกี่ยวกับโพสต์ที่ยาวนานนี้ แต่ฉันคิดว่ามันคุ้มค่า
ฉันเพิ่งเริ่มต้นด้วยร้าน. NET ขนาดเล็กที่ทำงานค่อนข้างแตกต่างจากที่อื่น ๆ ที่ฉันเคยทำงาน ซอฟท์แวร์ที่เขียนตรงนี้ไม่ได้อยู่ในตำแหน่งก่อนหน้าใด ๆ ของฉันตรงที่มีลูกค้าหลายรายและไม่ใช่ลูกค้าทุกคนที่จะได้รับซอฟต์แวร์รุ่นล่าสุดพร้อมกัน ด้วยเหตุนี้จึงไม่มี "เวอร์ชันการผลิตปัจจุบัน" เมื่อลูกค้าได้รับการอัปเดตพวกเขายังได้รับคุณสมบัติทั้งหมดที่เพิ่มเข้ามาในซอฟต์แวร์ตั้งแต่การอัปเดตครั้งล่าสุดซึ่งอาจเป็นเวลานานแล้ว ซอฟต์แวร์สามารถกำหนดค่าได้อย่างมากและสามารถเปิดและปิดคุณสมบัติ: เรียกว่า "สลับคุณสมบัติ" วัฏจักรการวางจำหน่ายของที่นี่แน่นมากจริงๆแล้วมันไม่ได้อยู่ในกำหนดเวลา: เมื่อคุณสมบัติเสร็จสมบูรณ์ซอฟต์แวร์จะถูกปรับใช้กับลูกค้าที่เกี่ยวข้อง
ทีมเมื่อปีที่แล้วย้ายจาก Visual Source Safe ไปยัง Team Foundation Server ปัญหาคือพวกเขายังคงใช้ TFS ราวกับว่ามันเป็น VSS และบังคับใช้ Checkout ล็อคในสาขารหัสเดียว เมื่อใดก็ตามที่การแก้ไขข้อผิดพลาดถูกนำออกสู่สนาม (แม้กระทั่งสำหรับลูกค้าเดี่ยว) พวกเขาเพียงแค่สร้างสิ่งที่อยู่ใน TFS ทดสอบข้อผิดพลาดได้รับการแก้ไขและปรับใช้ให้กับลูกค้า! (ตัวเองมาจากพื้นหลังของซอฟต์แวร์ยาและอุปกรณ์การแพทย์ซึ่งไม่น่าเชื่อเลย!) ผลที่ได้คือรหัส dev ที่อบออกมาครึ่งหนึ่งถูกนำไปผลิตโดยไม่ต้องมีการทดสอบ บั๊กมักจะลื่นไถลไปสู่รุ่นวางจำหน่าย แต่บ่อยครั้งที่ลูกค้าที่เพิ่งได้รับบิลด์จะไม่เห็นบั๊กเหล่านี้หากพวกเขาไม่ได้ใช้คุณสมบัติที่บั๊กนั้นอยู่ผู้อำนวยการรู้ว่านี่เป็นปัญหาเพราะ บริษัท เริ่มเติบโต ทันใดนั้นมีลูกค้ารายใหญ่บางรายเข้ามาและมีลูกค้าจำนวนน้อยกว่า
ฉันถูกขอให้ดูที่ตัวเลือกการควบคุมแหล่งที่มาเพื่อกำจัดการปรับใช้ buggy หรือรหัสที่ยังไม่เสร็จ แต่จะไม่เสียสละลักษณะแบบอะซิงโครนัสของทีมออก ฉันเคยใช้ VSS, TFS, SVN และ Bazaar ในอาชีพของฉัน แต่ TFS เป็นที่ที่ประสบการณ์ส่วนใหญ่ของฉันได้รับ
ก่อนหน้านี้ทีมส่วนใหญ่ที่ฉันทำงานด้วยใช้โซลูชันสองหรือสามสาขาของ Dev-Test-Prod ซึ่งเป็นเวลาหนึ่งเดือนที่นักพัฒนาทำงานโดยตรงใน Dev แล้วการเปลี่ยนแปลงจะถูกรวมเข้ากับ Test แล้ว Prod หรือเลื่อนขั้นเมื่อทำเสร็จแทนที่จะเป็น รอบคงที่ มีการใช้งานบิลด์อัตโนมัติโดยใช้ Cruise Control หรือ Team Build ในงานก่อนหน้านี้ Bazaar ของฉันเคยนั่งอยู่ด้านบนของ SVN: devs ทำงานในฟีเจอร์ย่อย ๆ ของพวกเขาเองจากนั้นก็ผลักดันการเปลี่ยนแปลงไปสู่ SVN (ซึ่งผูกติดกับ TeamCity) นี่เป็นเรื่องดีที่มันแยกการเปลี่ยนแปลงได้ง่ายและแบ่งปันกับสาขาอื่น ๆ ของประชาชน
ด้วยโมเดลเหล่านี้ทั้งคู่มีส่วนกลาง dev และ prod (และบางครั้งทดสอบ) ผ่านรหัสที่ถูกผลัก (และป้ายชื่อถูกใช้เพื่อทำเครื่องหมาย builds ใน prod ที่มีการเผยแพร่ ... และสิ่งเหล่านี้ถูกทำเป็นสาขาสำหรับการแก้ไขข้อบกพร่อง เพื่อเผยแพร่และรวมกลับไปยัง dev) สิ่งนี้ไม่เหมาะกับวิธีการทำงานที่นี่จริง ๆ อย่างไรก็ตามไม่มีคำสั่งว่าเมื่อใดที่คุณสมบัติต่างๆจะถูกปล่อยออกมาพวกเขาจะถูกผลักเมื่อเสร็จสมบูรณ์
ด้วยข้อกำหนดนี้วิธีการ "บูรณาการอย่างต่อเนื่อง" ตามที่ฉันเห็นมันล้มเหลว ในการรับฟีเจอร์ใหม่ด้วยการผนวกรวมอย่างต่อเนื่องจะต้องผลักดันผ่าน dev-test-prod และจะจับงานที่ยังไม่เสร็จใน dev
ฉันคิดว่าที่จะเอาชนะสิ่งนี้เราควรลงโมเดลที่มีสาขาที่มีฟีเจอร์สูงโดยไม่ต้องใช้กิ่ง dev-test-prod แต่ควรมีแหล่งที่มาเป็นชุดของฟีเจอร์สาขาซึ่งเมื่องานพัฒนาเสร็จสมบูรณ์แล้วจะถูกล็อคทดสอบคงที่ ทดสอบและเปิดตัวแล้ว สาขาคุณลักษณะอื่น ๆ สามารถดึงการเปลี่ยนแปลงจากสาขาอื่นเมื่อต้องการ / ต้องการดังนั้นในที่สุดการเปลี่ยนแปลงทั้งหมดจะถูกดูดซึมเข้าสู่ทุกคน สิ่งนี้เหมาะกับรูปแบบบาซ่าแท้ๆอย่างมากจากสิ่งที่ฉันประสบในงานล่าสุดของฉัน
มีความยืดหยุ่นเนื่องจากฟังดูแปลกที่ไม่มีสาขา dev หรือสาขาแยงที่ใดที่หนึ่งและฉันกังวลเกี่ยวกับสาขาที่สาขาจะไม่รวมเข้าด้วยกันอีกครั้งหรือการเปลี่ยนแปลงในช่วงปลายเล็กน้อยทำให้ไม่เคยถูกดึงไปที่สาขาอื่นและนักพัฒนาบ่น รวมภัยพิบัติ ...
ประชาชนคิดอะไรเกี่ยวกับเรื่องนี้?
คำถามสุดท้ายที่สอง: ฉันค่อนข้างสับสนเกี่ยวกับคำจำกัดความที่แน่นอนของการควบคุมแหล่งที่มาแบบกระจาย: บางคนดูเหมือนจะแนะนำว่ามันไม่เกี่ยวกับที่เก็บส่วนกลางเช่น TFS หรือ SVN บางคนบอกว่ามันเกี่ยวกับการถูกตัดการเชื่อมต่อ และ TFS มีโหมดออฟไลน์ที่ใช้งานได้อย่างสมบูรณ์) และคนอื่น ๆ กล่าวว่าเป็นเรื่องเกี่ยวกับฟีเจอร์การแบ่งสาขาและความสะดวกในการผสานระหว่างสาขาที่ไม่มีความสัมพันธ์ระหว่างผู้ปกครองกับลูก บางทีนี่อาจเป็นคำถามที่สอง!