Her bir sprint'te birden fazla daldan / geliştiriciden gelen kodu nasıl yönetirsiniz?


42

Geliştiricilerin, öykülerinin her bir sprint ana dalına entegrasyonu konusundaki endişelerini dile getirdikleri retro bir çağrıdan yeni çıktım. Geliştiriciler tüm kodları kendi dallarında ve sprintin sonuna doğru tek bir ana dalda birleştirirler.

Daha sonra, bir geliştirici (genellikle aynı), her şeyin diğer dev koduyla iyi bir şekilde bütünleştiğinden emin olma görevi ile kalır (Değişikliklerin çoğu aynı sayfadadır. Örneğin, bir veri görüntüleme hikayesi, veri filtreleme hikayesi ve bir SLA göstergesi).

Bu yükü nasıl azaltabilir ve kodumuzun bir araya gelmesini nasıl kolaylaştırabiliriz? Benim bakış açıma göre, PO veya SM'nin öyküleri daha verimli bir şekilde önceliklendirmesi, aynı sprint içinde bu tür bağımlılıklara sahip olmamanız durumunda bazı sorunları çözebilir. Diğer herkes bununla nasıl başa çıkıyor? Yoksa bu sadece sürecin bir parçası mı?


18
Sürekli entegrasyonun yapıldığı bir gelişim dalınız yok mu?
Kayaman

13
Burada Kayaman ile birlikteyim, bunun için en iyi uygulama sürekli entegrasyon uygulamak.
RandomUs1r

27
Mutlu Birleştirme Günü! Probleminiz The Daily WTF'deki bir şeye çok benzer olduğunda, başınızın dertte olduğunu biliyorsunuzdur.
user3067860

Erken birleştirme, sık sık birleştirme: {bitmeyecek şekilde (yeşil), refactor, yeniden test etme, birleştirme} 'yi geçecek en küçük test kodunu yazın (kırmızı), başarısız olacak en küçük üretim kodunu yazın.
ctrl-alt-delor

1
İlk giriş Kazandı! Asla son olma! :-)
ChuckCottrill

Yanıtlar:


88

Git kullanıyorsanız, her geliştirici developdaldan kendi özellik dalına girer, böylece mevcut taban çizgisinden çok ileri gitmemelerini sağlar. Bunu her gün yapabilirler, böylece birkaç günden fazla süren görevler senkronize kalır ve birleştirme sorunları hala küçükken çözülür.

Geliştirici işlerini yaparken, bir çekme isteği oluşturur . Onaylandığında, bu developdalla birleştirilir .

developŞube daima çalışan kod var ve her an serbest bırakılması için hazır olmalıdır. Aslında bir açıklaması yaptığınızda, birleştirme developiçine masterve etiket buna.

Sürekli bir Entegrasyon Sunucunuz varsa, değişiklikler teslim edildiğinde her bir dalı oluşturacaktır - özellikle çekme istekleri için. Bazı yapı sunucuları, yapı başarısız olursa veya otomatik testler başarısız olursa bir çekme isteğini otomatik olarak onaylamak veya reddetmek için Git sunucunuzla bütünleşir. Bu potansiyel entegrasyon hatalarını bulmak için başka bir yoldur.


73
Önemli olan (sadece cevabınıza yazılan kısımdır), dallar hazır olduklarında, tipik olarak sadece 1 - 5 taahhütle değil, sadece süratin sonunda birleştirilmeleri gerekir. Özellik / hikaye başına bir dal, geliştirici başına bir dal değil. Bu, hikayelerin gerçekten küçük olmasını, yani en fazla iki gün sürmesini gerektirir.
amon

@ amon, kabul etti. "Özellik dalı" kelimelerini ekledi, ancak bu cevabı oldukça küçük tutmaya çalışıyor. Bu süreçte daha derinlere inen çok sayıda iyi makale var.
Berin Loritsch

5
Kendi dalında izole olmayın. Birleştirme cehennemi böyle başlar. Ana hat geliştirmeyi kullanın, devam eden çalışma özelliğini özellik geçişleri veya diğer çalışma zamanı yapılandırmasının arkasına izole edin.
Rob Crawford,

3
@Zibbobz Ekibim, temel olarak geliştirme dalı gibi ele alınanlar için açık "Özellik Branşları" kullanır, ancak yalnızca bu değişiklikle ilgili çekme istekleri ve taahhütleri için kullanır. Genel olarak, ne kadar ayrı kalması gerektiğine bağlı olarak, birkaç günde bir birisi, geliştirme aşamasındaki gelişmeleri özelliğe ekler ve sorunları çözer. Bu şekilde dalları birleştirme zamanı geldiğinde mümkün olduğu kadar benzerdir. Bir not olarak, bu sadece gerçekten büyük kırılma değişimleri içindir
reffu

9
"Devam eden çalışma özelliğini özellik geçişleri veya diğer çalışma zamanı yapılandırmasının arkasına izole et" Bunun yerine config cehenneme girerek cehennemi birleştirmekten kaçındınız. "Birleştirme cehennemi" bir seferde yalnızca bir geliştirici için bir sorundur ve kolayca düzenli olarak senkronize edilerek kolayca önlenebilir, tonlarca geçici yapılandırmaya sahip olmak gelecekteki tüm geliştiriciler için sonsuza dek cehennemdir.
Kübik

23

Aynı problemle mücadele ettiğimiz bir ekipte çalıştım. Entegrasyondan önce ne kadar az zamanımız olursa, bunun o kadar az zorlaştığını gördük. Sürekli entegrasyon öğreten insanların çoğunun birkaç dakikada bir sorumluluk almaktan bahsettiğini biliyorum.

Ayrıca sadece binanın yeterli olmadığını gördük. Yanlışlıkla birbirimizin kodunu kırmadığımızdan emin olmak için iyi bir test kapsamı seviyesine ihtiyacımız vardı.


2
Bu benim de tecrübem. Ne sıklıkta iş yaptığınız önemli değil, ancak bir kez hızlı bir şekilde entegrasyon / taahhüdü birleştirme taahhüdünde bulunmak büyük çaba sarf etmenizi sağlar. Bir zamanlar, her biri aylarca çalışmaya değecek üç farklı gelişim kolunun bulunduğu bir projedeydim. Onları birleştirmek eğlenceli değildi. Bu hatadan çok şey öğrendim :)
amon

4
Evet - "sürekli entegrasyon" demek bu! Değişikliklerinizi sürekli olarak diğer geliştiricilerin değişiklikleriyle bütünleştiriyorsunuz!
Rob Crawford,

@Rob, kabul etti. İfadem sürekli entegrasyonun sürekli olmadığını göstermek değildi. Sadece idealini tam olarak yapmadık ve hala yaklaşmanın birçok faydasını gördük.
Daniel

12
  • Şubelerinizi kısa ömürlü tutun (zaten bunu yapıyormuşsunuz gibi).
  • Test sonuçlarınızın kendileri için konuşmasına izin verin.
  • Sprint sonu için beklemeyin.

Bunun için TDD'ye abone olmanıza bile gerek yok. İhtiyacınız olan tek şey, geliştiricilerinizin özelliklerinin doğru çalıştığını kanıtlayan bazı testlerdir. Bunlar, Birim Testleri ve Entegrasyon Testlerini içerebilir, ancak ideal olarak kritik özelliklerin otomatik olarak uçtan uca bir testi olacaktır. Standart regresyon paketi malzemesi.

Ardından, birleştirme işleminiz tamamlandığında, otomasyon test raporunu birlikte kontrol edebilir ve her şeyin başarılı bir şekilde entegre olduğunu doğrulayabilirsiniz.

Yazarın Git PR'lerin bu sorunu çözeceğini, her geliştiricinin kendi çalışmalarını birleştirmesini sağladığını söylediği diğer cevaplardan birine katılıyorum.

Son paragrafa kadar ayrılacak kadar önemli olduğuna inandığım bir diğer nokta. Sprintin sonuna kadar beklemek yerine, gecelik yapılarınız üzerinde manuel testler yapmanızı öneririm. Geliştiriciler, özellik tamamlandıktan hemen sonra bir araya gelmelidir, böylece en kısa sürede tümleştirilebilir, konuşlandırılabilir ve test edilebilir.


6

Yapma

Dilinize ve hangi dosyaları düzenlediğinize bağlı olarak, her geliştiricinin bunları kendi dallarında düzenlemeleri anlamlı olmayabilir. Örneğin, C # 'da, bir defada herhangi bir UI tasarımcı dosyasını düzenlemenin yalnızca bir kişinin en iyisi olduğunu gördüm. Bunlar otomatik olarak oluşturulan dosyalardır ve bu nedenle kod bazen görünürde bir sebep olmadan taşınır - ve bu çoğu birleştirme araçlarına zarar verir.

Bu, bazı hikayelerin UI çalışması yapılıncaya kadar diğer hikayeleri engelleyebileceği anlamına gelir. Ve / Veya, sadece işlevselliği uygulayan diğer öykülerle birlikte, kullanıcı arayüzünü düzene sokmak için yeni bir hikaye oluşturulur. Ya da belki bir geliştirici tüm kullanıcı arabirimini çalışır, diğerleri ise bu kullanıcı arabiriminin işlevselliğini uygular.

İlgili bir notta, birden fazla hikayenin hepsinin aynı dosyaya dokunacağını biliyorsanız, aynı anda bunların üzerinde çalışmaktan kaçınmak isteyebilirsiniz. Hepsini aynı sprint içine çekmeyin veya bir veya daha fazla bitene kadar hepsi üzerinde çalışmaya başlamayın.


Dürüst olmak gerekirse, kullanılan sürüm kontrol aracı başarılı dallanma ve birleşme için daha önemlidir. C # kodu ve muhtemelen WinForms veya WebForms koduyla bile çalışmanız gereken kod tipik olarak çok fazla değişmiyor . Eğer öyleyse, belki de kodla oynamadan önce bazı örnekler yapmanız gerekir. XAML tabanlı kullanıcı arayüzleri normal kod kadar kararlıdır ve ara kod kontrol edilmez.
Berin Loritsch

2
@BerinLoritsch WinForms tasarımcı kodu küçük görsel değişikliklerle bile gerçekten çok şey değiştirebilir. Kod satırlarının kendilerinin aynı olduğunu, ancak sıralamanın çok farklı olduğunu gördüm - özellikle birden çok geliştirici aynı anda düzenleme yaparken. Belki de VCS aracının bir sorunudur (birkaç tane kullandık, belki sadece yanlış olanları kullanıyoruz), ancak bizim için sürecimizi biraz değiştirmek çok daha kolaydır.
mmathis

2
@BerinLoritsch En azından kazanma formları için burada ikinci kez yazmam gerekiyor (hiç kullanılmamış web formları). Winforms UI tasarımcısı, formdaki bir yerde önemsiz bir değişikliğe yanıt olarak, tasarımcı dosyasındaki tüm kodu rastgele yeniden sıralamayı sever. Her bir taahhüt işleminden önce yeniden yapılanmaları manuel olarak geri almadığınız sürece (karmaşık bir formda kolayca 10 veya 15 dakika olabilen bir şey) tasarımcı dosyasının geçmişi kesinlikle işe yaramaz ve formun UI'sinde 2 kişi aynı anda çalışıyorsa cehennemden bir birleşme çatışması. Kilitleme genellikle çok kötü bir seçenektir, ancak winforms ile gerçekten en kötü şeydir.
Dan Neely,

@DanNeely, Bu, ekibimizin WinForms kodundan ayrılma nedenlerinden sadece biri. Başka bir neden de tasarımcının çok kırılgan olması ve karmaşık formlarımızdan bazılarının görsel olarak düzenlenememesi. Direk olarak kodbindde değişiklik yapmak zorunda kaldık - muhtemelen neden orada çok fazla karışıklık olduğunu hatırlamıyorum. Bu ve yüksek yoğunluklu ekranlarla çalışan kullanıcılarımız bizi gerçekten WPF'ye zorladı. Yüksek öğrenme eğrisi ile acı veren bir süreç, ancak sonunda güzel bir ödül. Biriktirme listesindeki çoğu hikaye, yine de uygulamanın farklı bölümleri içindi.
Berin Loritsch

@BerinLoritsch burada aynı. Win formları, önceki işimdeki on yıl boyunca faturalarımın büyük bir bölümünü ödedi, ancak gelecekte bir daha asla dokunmayacağım için mutlu olacağım.
Dan Neely,

2

Geç ve büyük birleşmelerden kaçınmak için olası bir başka yaklaşım da özellik bayraklarıdır : değişikliklerinizi amaçlanandan önce etkin olmalarını engelleyen (ideal olarak dinamik) yapılandırılabilir bir bayrakla korursunuz.

Bu, değişikliklerinizi erken ya masterda ortak geliştirme şubenize bir şey bozmadan birleştirmenizi sağlar . Diğer geliştiriciler daha sonra bu değişiklikleri özellik dallarında yeniden birleştirebilir (veya dallarını buna göre yeniden düzenleyebilir).

Diğer cevapların da belirttiği gibi, bunun sürekli bir entegrasyon çözümü ile birleştirilmesi gerekmektedir.

Özellik bayraklarının ek avantajları vardır (örneğin, A / B testleri yapmayı kolaylaştırırlar). Daha fazla bilgi için Martin Fowler'ın bu makalesine bakın .


0

Her özellik için ayrı bir geliştirme branşı yaklaşımını takip ediyoruz ve ardından entegrasyon test ortamında test etmek için şubeleri bir QA şubesiyle birleştiriyoruz.

Regresyon ve entegrasyon testi tamamlandığında, kullanıma hazır olan özellikleri serbest bırakma dalına kolayca taşırız.

Her şey yolunda giderse, serbest bırakma şubesini tekrar ana şubeye birleştiririz.


0

Basitçe söylemek gerekirse, taahhüt etmek ve birleştirmek çoğu zaman birleşme çatışmaları için fırsat penceresini azaltır ve çatışmaları büyük ölçüde azaltır. Diğer kısım ise, çalışmanın sorunsuz bir şekilde akmasını sağlayacak olan kurşun tarafından planlanmasıdır.

Diğer cevaplar, taahhütler için en iyi uygulamalar hakkında bazı bilgiler verir ve basitçe bunları takip ederek birleştirme sorunlarınızın büyük çoğunluğunu azaltabilirsiniz. Daha fazla birleşme neredeyse kesinlikle bir zorunluluktur, ancak daha küçük bir ekip için kişi başına düşen şube yaklaşımınız muhtemelen yeterince iyi çalışıyor. Tabii ki, yine de daha genişletilebilir uygulamalara girmenin zararı yok!

Bununla birlikte, hiç kimse en önemli sorularınızdan birini ele almamış gibi görünüyor - hepsi aynı kod alanlarına dokunduğunuzda ne yapmalı. Bu, kod tabanına aşina olan ve farklı görevlerin bağımlılıklarını tanıyan bir ipucuna sahip olmanın faydalı olduğu yerdir. İşin zamanlamasını düzenlemezler ve taahhüt ederlerse, büyük olasılıkla birleştirme çatışmaları ve satır satır çözünürlüğü ile sonuçlanırsınız. Görevlerin düzenlenmesi \ zamanlaması daha büyük bir ekip için çok daha zordur, ancak küçük bir ekiple bu çelişen görevleri tanımlamak mümkündür. Lider daha sonra çatışmayı tamamen önlemek için ilgili tüm görevleri aynı mühendise değiştirebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.