Basitleştirilmiş Git akışı için geliştirme dalından nasıl kurtulurum


20

Sürekli olarak geliştirilen bir web projesinde (bir ürün değil) şu anda git akışına dayanan şu dallanma stratejisine sahibiz :

  • şube geliştirmek: son çalışma sürümü
  • ana dal: serbest bırakılacak / serbest bırakılacak sürüm
  • özellik dalları: geliştirme özellikleri
  • düzeltme dalları: yayımlanan sürümünde acil hata düzeltmeleri

Master , salt okunur, geliştirme veya düzeltme dallarından çekme istekleri ile güncellenir . Her güncelleme, sürüm sistemine bir sürüm adayının oluşturulmasına ve dağıtılmasına neden olur. Serbest bırakılan adaylar manuel olarak onaylandıktan sonra üretime dağıtılır.

Özellik dalları , geliştirmeye dayalı olarak veya master ile birleştirilen son taahhütten oluşturulur. Özellik dalından geliştirilecek bir çekme isteği oluşturulur, entegrasyon testlerinin ve kabul testlerinin (otomatik ve manuel) yürütüldüğü ücretsiz bir test sistemine uygulanır. Başarılı bir şekilde test edildiğinde ve incelendiğinde, PR birleştirilir, böylece bir sonraki sürümün parçası olur (yani geliştirmeden ustaya birleştirilir).

Amacım

Bunu basitleştirmek ve geliştirme dalından kurtulmak istiyorum. Geliştirme dalının çoğunlukla tarihsel nedenleri vardır ve her zaman başarılı bir şekilde test edilmiş bir versiyon olduğu için, onu ustadan ayrı tutmanın gereksiz olduğunu düşünüyorum. Başka bir birleştirme olmadığından, kaldırılması da yayınlama işlemini basitleştirecektir.

Aşağıdaki kısıtlamalarım var:

  • sürümler planlanmıştır ve tam otomatikleştirilmemelidir
  • özellik dalları genellikle kısa ömürlü olsa da, bazıları birkaç hafta boyunca birleşmeden kalır (örn. yeniden tasarım), ancak test edilmesi gerekir (şu anda geliştirmek için açık çekme istekleri olarak)
  • bazen tek bir özellik normal sürümün dışında yayınlanmalı ve etkin bir şekilde düzeltmeye dönüştürülmelidir. Mevcut strateji ile bir özellik dalını yeniden temsilen ve doğrudan ana sisteme birleştirebilirim
  • evreleme üzerine harici sistemlerle yapılan kabul testlerinden sonra başarısız olmamız gerekir.

Geçiş hakkında emin değilim:

  • şu anda testler için çekme talepleri oluşturuyorum ve sürümler için birleştirme taahhütleri yapıyorum. Bunu birleştirebilir miyim?
  • Master en son sürümden önce olduğunda düzeltmelerle nasıl başa çıkılacağı. Sürümleri doğrudan düzeltme dallarından oluşturmalı ve dağıtmalı mıyım?
  • zaten birleştirildikten sonra bir sürümden hariç tutulması gereken özelliklerle başa çıkmanın mantıklı bir yolu var mı? Ayrı bir geliştirme dalı bu vakalar için gerçekten bir avantaj mıdır? Çoğu zaman geri döndürme ve geri döndürme işlemlerini manuel olarak yine de taahhüt ederim.

4
Bir yandan, DEV şubesine ihtiyacınız olmadığını söylüyorsunuz, ancak neden gerçekten ihtiyacınız olduğunu açıklamaya devam edin. Haftalarca yaşayan özellik dallarının bu kadar uzun süre ayrıldıktan sonra ustalaşmak için birleştirilmesi çok zor olacaktır. Eğer Are emin sen DEV ortadan istiyoruz?
Dave Swersky

@DaveSwersky iyi soru! Emin değilim, bu yüzden burada soruyorum :) Uzun ömürlü özellik dalları hakkında: birleştirme zorluğu zaten var olan ve sadece başka bir yere taşınacak bir sorundur. Ve ana daldan düzenli birleşme ile yapılabilir. Ana dalın efendisi olsaydı nasıl daha zor olurdu?
Fabian Schmengler

Uzun ömürlü dalları hep olsa belki bir meydan okuma olacak daha bir DEV dalına daha usta birleştirilirken bir meydan okuma. Bu sorunun çözümü, bu dalları kısa ömürlü tutmak için işi daha iyi parçalara ayırmak olabilir. Konu / özellik dallarının 24-48 saatten fazla yaşamasını önleyebiliyorsanız, DEV'i ortadan kaldırarak daha iyi şansınız olabilir.
Dave Swersky

1
@FabianSchmengler Geliştirici dalını kaldırmak istemenizin gerçek nedeni nedir? İşlerin planlandığı gibi gitmediği durumlar için gerçekten ihtiyacınız gibi görünüyor.
avi

master veya geliştirme olarak adlandırın ya da ne isterseniz, gerçek CI'ye sahip olmak istiyorsanız veya bir özellik dallarına delege ederseniz, bir entegrasyon dalına ihtiyacınız olacak, sadece mevcut sürümle tek başına dış entegrasyon olacaktır.
ᴳᵁᴵᴰᴼ

Yanıtlar:


6

IMHO baktığınız sorunlar ile başlayan yoksul şube stratejisinin sadece bir yan etkisi vardır: etkili yeni gelişmeyi çiftçilik ediyoruz develop(yani neyi doğru yakınsak gelecek üretim kodu) aracılığıyla akım üzerinde üretim kodu master. Bu, gelecekteki kod tipik olarak mevcut koddan farklı olduğundan, çelişkili gereksinimlere ve sorunlara yol açar:

  • birleştirdikten sonra görülen regresyon - yeni gelişme üretim destabilizes developiçinemaster
  • Üretimi stabilize etmek gelecekteki gelişimi yavaşlatır - developbirleşmek için yeterince iyi hale getirmek için stabilize etmeniz gerekirmaster

Düşürmek developyardımcı olmaz (çok) - sorunu ortadan kaldırmıyorsunuz, sadece developsorunun spesifik kısmını aktarıyorsunuz master.

Daha iyi bir yaklaşım üretimini taşımak olacaktır arkasından gelen bu görüntüde gösterildiği gibi, gelecek sürümleri için geliştirme etkileşimi önlemek için, akım / gelecekteki gelişimi Kişisel Dallanma Modeli nedir? :

resim açıklamasını buraya girin

Bagajda neler olduğuna değil, sadece yukarıdaki görüntüdeki serbest bırakma dallarına atıf yaptığımı lütfen unutmayın.

Bu sizin için nasıl çalışır?

  • developsiz istediniz şube dissapears, emilirmaster
  • masterşube geliştirme hiçbir hız kısıtlamalarına (o oluyor ile olur budur, sizin gövde olduğunu asla üretime birleşti).
  • üretim, üretim kalitesine yeterince yakın olduğu düşünülen releasebir masteretiket / etiketten alınan bir veya daha fazla koldur (gerekirse bu dalda kalan yapılacak iş öğelerinin kısa bir listesi ele alınabilir). Bu dallar yalnızca doğrudan sıcak düzeltmeler ve / veya kiraz toplanmış düzeltmeler alabilir master, asla birleştirilmez masterveya diğer şubelerle birleştirilmez
  • düzeltmeler doğrudan releaseşubelere taahhüt

Bir düzeltme yalnızca bir üretim sürümü için geçerliyse, bu düzeltme masterdoğrudan releaseşube için kullanılamazsa. Eğer her ikisi için de geçerliyse, tipik olarak dalda da masterilk ve kirazlı / çifte taahhütlüdür release.

Şimdi neyin içine girdiğine bakıldığında master(mevcut releasedalın çekildiği noktayı geçiyor ), 2 seçeneğiniz var:

  • onlar kapalı tabanlı olacak haricinde sizin gibi özellik dalları bugün do devam masterdeğil develop. Bunları düzeltmelere dönüştürmek mümkün olmaya devam ediyor - bunları releaseyerine ilgili şubeye yeniden adlandırmanız yeterli olacaktır.master
  • sürekli entegrasyona geçin ve aşamalı olarak da dahil olmak üzere faydalarını elde edin (her zaman yapılabilir) - yavaş yavaş daha az ve daha az özellik dalı çekin.

Bu yaklaşımı beğendiyseniz, bugün bulunduğunuz yerden oraya nasıl gideceğiniz aşağıda açıklanmıştır:

  • bir sürüm adlandırma stratejisi oluşturun:
    • aynı ada sahip devam eden bir sürüm şubeniz olamaz
    • bir üretim sürümü şubesini yeniden adlandıramaz veya senkronize edemezsiniz
  • bu adlandırma stratejisini izleyerek bir releaseXşubeyi masterhemen çekin
  • Taahhütleri durdurun develop, yakında doğruca gidecekler master.
  • birleştirme developiçinemaster
  • geliştiricilere masterbunun yerine çalışma alanlarını yeniden oluşturmaları talimatını verin develop.
  • mastertaahhütlere açık
  • developİsterseniz silin (veya referans olarak kalıcı olarak kilitli / salt okunur bırakın)

Ayrıntılı öneriler için teşekkür ederiz. Sürüm dallarının ürün geliştirme dışında iyi bir fikir olup olmadığından henüz emin değilim, ancak tekrar
düşüneceğim

Ayrıca, gelişimi üretim ile aynı yere koyan sürekli dağıtım alternatifine de sahipsiniz (onu itmek veya ondan önce), ancak bunun için bir kültür değişikliğine ihtiyacınız var (tüm entegrasyon ve özellik dallarını düşürmeyi ima ettiği için).
Dan Cornilescu

Bu diyagramı tanıyorum :)
paul_h

11

Diyelim ki ana dalı çıkardınız (daha sonra isterseniz ekibinizi karıştırmak için geliştirmeyi master olarak yeniden adlandırabilirsiniz) ve geliştirme veya düzeltme dallarındaki sürümler için etiketleri kullanın. Bir dal çıkardınız, ancak fark sadece sözdizimindeki bir değişiklik. Değişiklik uğruna değişiklik.

Şimdi diyelim ki kilitli ana dalı tutarak gelişmeye başladınız. Olan şey, kod entegrasyonunun yavaşlayacağı, özellik dallarında, özellikle yayınlanma tarihlerine yakın olarak daha uzun süre ayrı kalacağıdır. Bu, her seferinde birleştirme zorluğunu artıracak ve süreci yavaşlatacaktır.

Belirlediğiniz kısıtlamalar dahilinde böyle bir değişiklik yapmanın herhangi bir olumlu etkisini görmüyorum. Kısıtların, özellikle de ilkinin rahatlatılmasını gerektirir.


5

Çekme isteği ve hot-fix dallarının her birine kod oluşturuyorsunuz ve test ediyorsunuz. Bu, toplamda, çekme isteğinde bekleyen tüm dalların toplamının sanal developdalınız olduğu anlamına gelir.

Bir test ortamında birkaç çekme isteği ana depoda yayınlanmayan geçici bir dala seçildiğinde bir sistem oluşturabilirsiniz. Bu dal, içeren masterve birkaç ek çekme isteği içeren bir test ortamını entegre etmek için kullanılır , ancak test yapıldıktan sonra, bu dal artık hiçbir yerde mevcut değildir.

Adlı kişiden bir sürüm oluşturduğunuzda master, genellikle bu sürümde bir etiket oluşturursunuz. Daha sonra düzeltmeler, kenarını masterönceden olsa da, dağıtımın yapılacağı yeni bir düzeltme dalı oluşturmak için bu etiketi kullanabilir . Bu düzeltme dalında, muhtemelen küçük bir sürümü de etiketlersiniz ve değişikliklerin birleştirildiğinden emin olursunuz master.

Birleştirilmiş özelliklerin bir sürümden kaldırılması git ile oldukça zordur. Bunun için en iyi mekanizma git revertbirleştirme taahhüdünde kullanmak olacaktır . Ancak bu, bu özelliklerin / değişikliklerin geri alınmasını neredeyse imkansız hale getirir ve tarih karıştırılır.

Kod dağıtımı ve özelliklerin serbest bırakılması için ayırmayı işlemenin çok daha iyi bir yolu özellik bayraklarıdır . Geliştiricileriniz özelliklerini kodun kendisindeki bazı koşulların arkasına gizleyebilirlerse, kodlarını dağıtabilir, ancak özelliği kapatabilirsiniz. Bu ayrı bir konudur, ancak bununla ilgili çok fazla bilgi bulunmaktadır (devops.SE ile ilgili bir Soru-Cevap dahil).


2

@ Dan-cornilescu sorununuz için iyi diyor, ancak Trunk Tabanlı Geliştirme (Sürekli Teslimat, Yalın İşletme ve The DevOps El Kitabı'nda bahsedilen) için daha genel bir durum burada yapılır: https://trunkbaseddevelopment.com/

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.