Tek şirket sürüm döngüsü: Dağıtılmış Kaynak Kontrolü'ne mi gidersiniz?


13

Bu uzun yazı için üzgünüm, ama buna değer olduğunu düşünüyorum.

Çalıştığım diğer yerlerden biraz farklı çalışan küçük bir .NET mağazasıyla başladım. Önceki pozisyonlarımdan farklı olarak, burada yazılan yazılım birden fazla müşteriyi hedefliyor ve her müşteri yazılımın en son sürümünü aynı anda alamıyor. Bu haliyle, "mevcut üretim versiyonu" yoktur. Bir müşteri bir güncelleme aldığında, son güncellemesinden bu yana uzun bir süre önce olabilecek tüm özellikleri yazılıma ekler. Yazılım son derece yapılandırılabilir ve özellikler açılıp kapatılabilir: "özellik geçiş yapar". Serbest bırakma döngüleri burada çok sıkı, aslında bir programda değiller: bir özellik tamamlandığında yazılım ilgili müşteriye dağıtılır.

Ekip sadece geçen yıl Visual Source Safe'ten Team Foundation Server'a taşındı. Sorun hala TFS'yi VSS gibi kullanıyor ve Checkout kilitlerini tek bir kod dalında uygular. Bir hata düzeltmesi (tek bir müşteri için bile) sahaya konulduğunda, TFS'de ne varsa oluştururlar, hatanın düzeltildiğini test edin ve müşteriye konuşlandırın! (Kendimi bir ilaç ve tıbbi cihazlar yazılım arka planından geliyor bu inanılmaz!). Sonuç, yarı pişmiş dev kodunun test edilmeden üretime girmesidir. Hatalar her zaman sürüm sürümlerine kayıyor, ancak genellikle yeni bir yapıya sahip bir müşteri, hatanın bulunduğu özelliği kullanmazsa bu hataları görmeyecek. Yönetmen, şirketin tüm büyümeye başladığı için bunun bir sorun olduğunu biliyor birdenbire büyük müşteriler ve daha küçük müşteriler geliyor.

Buggy veya bitmemiş kodun dağıtımını ortadan kaldırmak, ancak takımların serbest bıraktığı biraz eşzamansız doğayı feda etmemek için kaynak kontrol seçeneklerine bakmam istendi. Kariyerimde VSS, TFS, SVN ve Bazaar kullandım, ancak TFS deneyimimin çoğunun olduğu yer.

Daha önce birlikte çalıştığım çoğu ekip, bir ay boyunca geliştiricilerin doğrudan Dev'de çalıştığı ve daha sonra değişikliklerin Testten Sonra Prod ile birleştirildiği veya daha sonra yerine "tamamlandığında" tanıtıldığı iki veya üç dallı Dev-Test-Prod çözümü kullanıyor. sabit bir döngü. Otomatik Yapılar, Cruise Control veya Team Build kullanılarak kullanılmıştır. Bir önceki işimde Bazaar SVN'nin üstünde oturuyordu: devs kendi küçük özellik dallarında çalıştı ve daha sonra değişikliklerini SVN'ye (TeamCity'ye bağlı) itti. Bu, değişiklikleri izole etmenin ve diğer halkların şubeleriyle paylaşmanın kolay olması açısından güzeldi.

Bu modellerin her ikisinde de, kodun itildiği merkezi bir geliştirme ve prod (ve bazen test) dalı vardı (ve etiketler, sürümlerin yapıldığı eşyadaki yapıları işaretlemek için kullanıldı ... ve bunlar hata düzeltmeleri için dallara yapıldı. yayınlamak ve dev ile yeniden birleştirmek). Ancak bu, burada çalışma şekline tam olarak uymuyor: çeşitli özelliklerin ne zaman piyasaya sürüleceğine dair bir emir yok, tamamlandığında itiliyorlar.

Bu gereksinim ile gördüğüm gibi "sürekli entegrasyon" yaklaşımı bozulur. Sürekli entegrasyon ile yeni bir özellik elde etmek için, dev-test-prod ile itilmesi gerekir ve bu, dev.

Bunun üstesinden gelmek için, NO dev-test-prod dalları ile ağır bir özellikli dallı modelden aşağı gitmemiz gerektiğini düşünüyorum, daha ziyade kaynak, geliştirme çalışmaları tamamlandığında kilitlenen, test edilen, sabitlenen, kilitlenen bir dizi özellik dalı olarak var olmalıdır. , test edildi ve sonra serbest bırakıldı. Diğer özellik dalları, ihtiyaç duydukları / istedikleri zaman diğer dallardaki değişiklikleri alabilir, bu nedenle sonunda tüm değişiklikler herkesin içine çekilir. Bu, son işimde yaşadığım şeyden saf bir Bazaar modeline çok uyuyor.

Bu kadar esnek olduğu gibi, bir yerde dev bir gövde veya eşya dalı olmamak tuhaf görünüyor ve asla yeniden entegre edilmemeyi isteyen dallardan ya da şikayet etmekten başka dallara ve geliştiricilere asla çekilmeyen küçük geç değişiklikler konusunda endişeliyim felaketleri birleştir ...

Bu konuda insanların düşünceleri nelerdir?

İkinci bir son soru: Dağıtılmış kaynak kontrolünün kesin tanımı hakkında biraz kafam karıştı: Bazı insanlar bunun TFS veya SVN gibi merkezi bir depoya sahip olmama hakkında olduğunu düşünüyor, bazıları bunun bağlantısız olduğunu söylüyor (SVN% 90 bağlantısı kesildi ve TFS'nin mükemmel bir işlevsel çevrimdışı modu vardır) ve diğerleri bunun Özellik Dallanması ve ebeveyn-çocuk ilişkisi olmayan dallar arasında birleştirme kolaylığı ile ilgili olduğunu söyler (TFS'nin de temelsiz birleştirme vardır!). Belki de bu ikinci bir soru!


Yanıtlar:


5

Bir DVCS'yi ne tanımlar?

Dağıtılmış bir depo her klon tüm bilgilere sahip olduğunu DVCS içinde araçlar hiç dokunmadan, güncelleme, şube, birleştirme taahhüt veya depoda herhangi revizyon aramak için gerekli bir sunucu . Eğer çevrimdışı Yapabileceğiniz tek şey svnaslında olduğu dosyaları düzenlemek - neredeyse tüm sunucu erişmesi gereken svnbir grepping olarak basit olarak bir şey yapıyor gibi komutlar svn logbu% 90 daha doğrusu daha yakın% 0'a yani,!

Bir DVCS iş akışında ayarlayabileceğiniz herhangi bir yetkili merkezi depo sadece başka bir klondur ve onunla etkileşime girmeniz için gereken tek zaman , diğer insanların güncellemelerini aşağı çektiğinizde veya diğer kişilerin bunları görebilmesi için kendi değişikliklerinizi ittiğiniz zamandır. , hemen hemen her şey çevrimdışı yapılabilir.

Hangi dallanma modeli uygundur?

Şu an bulunduğunuz durumda bulundum. Bu tür sistemler gerçek bir acı olabilir, ancak böyle oldukları için pragmatik nedenleri anlamak ve kurtuluşun ötesinde olmadığını fark etmek zorundasınız . Bu tür karmaşıklığı yönetmeye yardımcı olabilecek birçok araç geliştirilmiştir .

Her şeyden önce, ne yaparsanız yapın, insanlara başarılı git dallanma modelini göstermeyin , sadece onları karıştırır ve kapatır. Bunun yerine, mevcut iş akışınızı yansıtan , ancak mevcut iş akışınızla ilgili sorunları çözen kendi modelinizi geliştirin .

Göz önünde bulundurmak isteyebileceğiniz bazı kaynaklar arasında , farklı müşteri sürümlerinin farklı müşteri yapılandırması, uygulama modülleri ve kitaplık kombinasyonlarını belirtmesine izin verecek git alt modülleri gibi şeyler bulunur . Başka bir seçenek, müşteri / ürüne özel yama kuyrukları uygulamak için bir yama yönetim sisteminin kullanılmasıdır .

Bu seçeneklerin her ikisi de mevcut iş akışınızdan çok daha fazla esneklik, şeffaflık ve güvenlik sağlayacaktır ve kullanımı yalnızca daha karmaşık bir dal stratejisinden daha kolay olabilir. Durumunuzdayken kesinlikle bu araçlara erişebilseydim.

Bu seçeneklerle ilgili daha fazla bilgi için benim cevaplar bkz Strateji modüler sistemde sürüm kontrolü , nasıl Kullanım Subversion Deposu İçinde Git havuzu için? ve birden fazla şirket tarafından kullanılan uygulama için Kaynak / Sürüm kontrolü .

Sonuçta, bu gerçekten ekibin geri kalanıyla birlikte geliştirmeniz gereken bir şey. Zaten sahip olduğunuzdan daha iyi çalışan bir şey önerme vizyonunuz varsa ve diğer geliştiricilerinizin satın alınmasını sağlayabiliyorsanız, o zaman çok daha kolay bir zamanınız olacaktır.

En önemli şey, meslektaşlarınıza önerdiklerinizin hayatlarını nasıl kolaylaştıracağını göstermektir . İkna olduktan sonra , TFS'ye yatırımlarını atmak ve çalışma yöntemlerinize daha uygun bir model kullanmaya başlamak için yönetim elde etme şansınız çok daha yüksektir .


1
Sizin için çalışan
jcmeloni 19:12

1
+1 "hayatlarını kolaylaştırır". Bu en büyük motivasyon kaynağı.

5

Birincisi, DVCS sahip olduğunuz problemler için kırmızı bir ringa balığıdır - kullanılan sürüm kontrol aracı, çözülmesi gereken sorunların kökü değildir. DVCS çözümlerinin TFS'den "daha iyi" yönleri olabilir, ancak bu noktada düzeltilmesi gerekenler olmayabilir.

Organizasyonunuza uyan uygulanabilir bir dallanma yapısına ihtiyacınız olduğunu belirlediniz - bence hala bir bagajınız olduğunu göreceksiniz, bir özellik tamamlandığında bagajda birleştirilir ve kapanır. Ortak bağımlılıkları nasıl uyguladığınız hakkında bazı güzel düşünceler var.

Ayrıca sürekli entegrasyon çalışması gerekir (bu dalı oluşturabileceğinize ve ilgili testleri geçtiğine dair size güven vermek için her aktif dal için otomatik bir yapıya sahip olmanız için hiçbir neden yoktur). Bir taahhüdün (veya en azından "itme") benim için bir yapı tetiklemediği durumlarda rahatsız oluyorum.

Ayrıca, tüm seviyelerde otomatik teste başlamanız gerekir, ancak yeni hataların vahşi doğaya kaçma olasılığını azaltmak için özellikle birim testleri ve entegrasyon testleri. Bu son derece büyük ve hala mücadele ettiğim bir şey ama bir kere bildiğinizde bir şeyler inşa edebileceğinizin en değerli olacağı açık.

Bunu, dağıtım paketlerinizin oluşturma sunucunuzdan geldiğinden ve dağıtımın olabildiğince otomatik olduğundan emin olmak için birleştirmeniz gerekir (sunucu sunucusu yapısından en az çaba ve minimum stresle canlı konuşlandırılmış koda geçebilmeniz gerekir).

Hmm, iyi düzenlenmiş bir sorun izleme kurulumunun olduğunu varsaydım ... buna da ihtiyacın var ve doğru kullanıldığından emin olmak için. İdeal olarak, canlı uygulamalarınızın hataları bu sisteme (veya triyaj için) otomatik olarak geri beslemesini istersiniz.

Son olarak, tüm sorunlarınızı bir anda çözmeye çalışmayın - derleyin ve test edin, önce odaklanmanız gereken yerler gibi görünüyor.


DVCS'nin de kırmızı bir ringa balığı olabileceğini kabul eden bir parçam var: Kesinlikle sorunun her şeyden çok süreçle ilgili olduğuna katılıyorum. Bence sürekli entegrasyon burada bir gerginlik olabilir ve ünite testi çok fazla iş olarak görüleceği için gerçekleşmeyecek. Kod tabanı, sıkıca bağlı monolitik bir sistem olduğu ve her şeyin beton türlerine dayandığı için zaten test edilemez: arayüz yok.
MrLane

@MrLane - Ben insanlara anlatmak zor olacak biliyorum, ama bir gelişen başladığından beri TDD arada, ben giderek ben vaktim olmadığını ikna ediyorum değil yazma testlerinde.
Mark Booth

1

İkinci soru daha kolay ve daha kısa, bu yüzden ondan başlamaya çalışacağım

DVCS, hiç kimsenin "yetkili" bir kod kaynağının (kullanıldığında "anlaşıldığında" hariç) ve P2P veri alışverişinin ek katmanlar olmadan (kişisel, standart olmayan tanım) mümkün olmadığı sistemdir.

Konuyla ilgili ilk soru

Korkarım, şirket "bir şekilde yönetilen ve öngörülebilir kod" elde etmek için iş akışını yeniden yapılandırmak ve stil hakkında yeniden düşünmek zorunda. TFS hakkında söyleyemem (kişisel görüş ve his hariç, Sürüm Kontrol kısmında zayıf sistem olduğunu / temelsiz birleştirme kötü /), ancak durumunuzdaki herhangi bir VCS için ("Ürün" bağımsız "Modüller" olarak ayarlanır, her "Müşteri" farklı olsun "Ürünler" - bu varsayım doğru mu?) Modüllerin ayrı dallara bölünmesini tercih edeceğim, "Supermodule" (ayrıca şube?) olarak Ürün var, her modül modülün özel revizyonuna bağlı şube, modül geliştirme görev başına şube paradigmasını kullanır (ve modül dalı yalnızca birleştirme kümelerinden oluşur).

Bu şekilde, her bir "Ürün" ün hangi "Koleksiyon" un (yani modül seti ve bunlara karşılık gelen revizyonlar) her zaman "CI" ( bitmiş ve birleştirilmiş görev dalları için), Birim testi ve Yapılar yapabileceğini bilebilirsiniz.


1

Reklamın ana sorusu: Bahsettiğiniz şeyin, git başarılı dallanma modelinin (ve bunu desteklemek için yardımcı araç git akışının ) tam olarak ne olduğuna inanıyorum . Her zaman konuşlandırılabilir durumda olan bir ana şubeye sahip olun ve özellik dallarında tüm işleri yapın.

Aynı temel ilkeden türetilen git'in kendisi tarafından kullanılan işlemi de kullanabilirsiniz. Git-core geliştirmede, tüm çalışmalar özellik dallarında gerçekleşir. Özellik dalları, adlandırılmış bir şube oluşturmak üzere tümünü pu(önerilen güncellemeler) oluşturmak üzere bir komut dosyası çalıştıran tümleştiriciye gönderilir . Çeşitli insanlar bu dalı alır ve test etmek için onunla birlikte çalışır.

Entegratör yerine, birleştirme başlangıcında bu birleştirmeyi sürekli entegrasyon sunucusuna yapabilirsiniz. Bu şekilde, takımdan herhangi biri merkezi depodaki değişiklikleri bir özellik dalı olarak ittiğinde (muhtemelen hangi dalların seçilmesi gerektiğini söylemek için bazı adlandırma kurallarını kullanarak).

GIT'de özellik hasılatı daha şube next, masterya maintbağlı hangi o (Maint akım-hazırlık serbest bırakılması ve bundan sonra biri için bir sonraki için geçerli salınımını, usta arıza giderme içindir) de hedef alıyor serbest, ancak birçok olmaz.

Özellikler puyerdeyken (git bakımcının terminolojisinde "pişirme"), geri sarılırlar ve puşube her seferinde atılır ve tekrar oluşturulur, bu da incelemeyi kolaylaştırır, ancak diğer çalışmaları dayandırmak için uygun değildir. Özellik dalı ana hatlardan birine birleştirildiğinde, geri sarmalar için kapatılır ve yeni taahhütler olarak başka düzeltmeler yapılır.

Şahsen giten iyi tavsiye ederim . Başlangıçta öğrenmek biraz daha zor, çünkü daha organik olarak büyüyor, ancak sonunda en esnek görünüyor. Ancak, dağıtılmış üç sistemden herhangi biri, git, mercurial ve çarşı size iyi hizmet edecektir (ve hatta sık sık bunları karıştırabilirsiniz, örneğin, mercurial git deposuna gidip gelen depodan itebilir ve ben de pazar yapabilirim).

İkinci soru: Bana "dağıtılmış" ın, nesneleri hareket ettirebileceğiniz ve kimliklerini koruyacağı anlamına geliyordu. Dağıtılmış sürüm kontrolünün yaptığı tam olarak budur: veri havuzunu klonlarsınız ve aynı taahhütleri içerir ve onlarla aynı şeyleri yapmaya izin verir. Dallanma kolaylığı ve bağlantısız operasyon, hareket etme prensibinden sonra gelen ana kullanıcı seviyesi özellikler ve buna izin veren yönlendirilmiş grafik düzenidir.


1

Ne yazık ki, kod hatalar için bilinen bir çözüm yoktur :)

Yani bitmemiş checkin'lerin ana sürümde yakalanmasını durdurmak istiyorsunuz ve bunun tek cevabı her geliştirici için şube-iş birleştirme. Clearcase kullanarak önceki bir şirkette bunu yaptım, (bir düzine clearcase yöneticileri olmasına rağmen) oldukça iyi çalıştı.

Şimdi, her müşterinin sahip olduğu ürünün sürümünde hata düzeltmesi yaptığınızı da varsayıyorum ... böylece A sürümünden Z sürümüne kadar hata düzeltmeleri getiren birleştirme sorununuz var. ancak, gönderilen her sürüm için bir şubeniz olması gerekir. Bununla başa çıkmanın en iyi yolu, özellik dallarını yalnızca en son sürümde tutmak ve müşterilerin yeni özellikleri almak için yükseltmelerini sağlamak, aynı zamanda doğrudan sürüm dalında hata düzeltme yapmak ve bunları diğer tüm yayın dallarıyla birleştirmektir. tamamlandığında.

Çok hoş değil, ama oldukça iyi çalışabilir. Kodu düzenli ve hoş bir şekilde ayrı tutarsınız. Diğer geliştiriciler için de anlaşılması kolaydır - doğrudan "kod" üzerindeki küçük hata düzeltmeleri, birkaç satırdan daha fazla bir şey, tamamlamak istedikleri sürece alabilecekleri özel bir dalda yapılır. (birleştirme sorunlarını sıralamak ve 2 geliştirici aynı anda 2 özellik üzerinde çalışıyorsa sorun olmadığını onlara güvence altına almak zorunda kalacaksınız!)

Bir süre sonra, hataların sabitlendiği ve daha sonra birleştirildiği serbest bırakma dallarına özellik dalları da ekleyebilirsiniz, ancak IMHO bu genellikle gerekenden daha fazla çaba gerektirir. Yine de eski sürümlere özellikler eklemeniz gerekiyorsa, bu yaklaşımı izlemeniz gerekir - bir sürüm şubesinin şubesi, daha sonra kodu bu sürüme geri birleştirin ve değişikliği daha sonraki sürümlerle de birleştirin. Bu, test ekibinizi çok sayıda mutsuz hale getirecektir, çünkü birkaç sürümü tekrar tekrar test etme ihtiyacı nedeniyle yayınlar ağır bir şekilde gecikecek ve dev ekibi yeni kodda başlamadan önce çok fazla birleştirme yapmak zorunda kalacaklarından mutsuz olacaklar (mevcut şirketimde) bu, esas olarak her zaman en kısa zamanda tamamlanması gereken iş miktarımız nedeniyle olur).

DVCS:

temel olarak bir DVCS herkesin sunucu deposunun kendi kopyasına sahip olduğu yerdir. Bazı avantajları vardır (özellikle sınırlı iletişim olan dağıtılmış takımlarda), ancak bazı dezavantajları vardır, bu yüzden bir DVCS'ye geçmeden önce bunları kontrol edin. Bir Windows mağazasıysanız muhtemelen Mercurial'ın sizin için en iyi DVCS olduğunu göreceksiniz.

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.