Geliştirme kodunu ve üretim kodunu nasıl koruyorsunuz? [kapalı]


136

Kod korunurken uygulanacak en iyi uygulamalar ve pratik kurallar nelerdir? Geliştirme dalında yalnızca üretime hazır kodun bulunması iyi bir uygulama mıdır, yoksa geliştirme dalında test edilmemiş en son kodun bulunması gerekir mi?

Geliştirme kodunuzu ve üretim kodunuzu nasıl koruyorsunuz?

Düzenleme - Ek soru - Geliştirme ekibiniz "mümkün olduğunca çabuk ve hatta sık sık kodlama içeriyorsa küçük hatalar" veya "eksik" protokolünü veya "taahhüt- SADECE-mükemmel kod "protokolü DEVELOPMENT şubesine kod işlerken?


Daha önce benzer bir soruyu (veya aynı alanda / yönde bir soruyu) yanıtladım, bu yüzden şu soruyu kontrol etmek isteyebilirsiniz: Konuşlandırılmış uygulamaların düzeltilebilir olmasına izin vermek için bazı iyi stratejiler nelerdir?
Till

@revo: bekleyin ... 2008 yanıtım güncel değil mi? :) Sanırım gerçekten de öyle. 10 yıldan fazla oldu: Cevabımı düzenledim.
VonC

Yanıtlar:


114

Güncelleme 2019:

Bu günlerde, soru Git'i kullanan bir bağlamda görülüyordu ve dağıtılmış geliştirme iş akışını (esas olarak GitHub aracılığıyla işbirliği yaparak ) kullanmanın 10 yılı genel en iyi uygulamaları gösteriyor:

  • master, herhangi bir zamanda üretime dağıtılmaya hazır olan şubedir: bir sonraki sürüm, seçilen bir dizi özellik dalı birleştirilir master.
  • dev(veya entegrasyon dalı veya ' next'), bir sonraki sürüm için seçilen özellik dalının birlikte test edildiği daldır
  • maintenance(veya hot-fix) şube, mevcut sürüm evrimi / hata düzeltmeleri için devvemaster

İş akışının Bu tür (eğer birleştirmezseniz deviçin master, ancak sadece özellik dalı birleştirme nerede devardından etmek, seçilmesi halinde masterGit uygulanan sırayla, bir sonraki sürüm için hazır değil dalları özelliği kolayca açılan edebilmek için) gitworkflow ( burada gösterilen bir sözcük ) ile kendini repo edin .
Daha fazla bilgi için rocketraman/gitworkflow. Bunu Trunk Tabanlı Geliştirme ile yapmanın tarihi, Adam Dymitruk tarafından yazılan yorum ve tartışmalarda belirtilmiştir .

https://github.com/rocketraman/gitworkflow/raw/master/docs/images/topicgraduation.png

(kaynak: Gitworkflow: Göreve Yönelik Astar )

Not: Bu dağıtılmış iş akışında, istediğiniz zaman işleyebilir ve herhangi bir sorun olmadan kişisel bir şubeye bazı WIP (İş Devam Ediyor) iletebilirsiniz: bir özellik dalının bir parçası haline getirmeden önce taahhütlerinizi yeniden düzenleyebilirsiniz (git rebase).


Orijinal cevap (Ekim 2008, 10+ yıl önce)

Her şey , sürüm yönetiminizin sıralı niteliğine bağlıdır

Birincisi, bagajınızdaki her şey bir sonraki sürüm için gerçekten mi? Halihazırda geliştirilmiş olan bazı fonksiyonların:

  • çok karmaşık ve hala rafine edilmesi gerekiyor
  • zamanında hazır değil
  • ilginç ama bu bir sonraki sürüm için değil

Bu durumda, gövde mevcut geliştirme çabalarını içermelidir, ancak bir sonraki sürümden önce tanımlanan bir ayırma dalı , yalnızca uygun kodun (bir sonraki sürüm için onaylanmış) birleştirildiği, ardından homologasyon aşamasında sabitlendiği bir konsolidasyon şubesi olarak hizmet edebilir , ve nihayet üretime geçtiğinde donmuştu.

Üretim kodu söz konusu olduğunda, yama dallarınızı da yönetmeniz gerekirken şunları da unutmayın:

  • ilk yama seti aslında ilk üretime geçmeden önce başlayabilir (yani, zamanında düzeltemeyeceğiniz bazı hatalarla üretime gireceğinizi biliyorsunuz, ancak ayrı bir dalda bu hatalar için çalışma başlatabilirsiniz)
  • diğer yama dalları, iyi tanımlanmış bir üretim etiketinden başlamak için lükse sahip olacak

Dev şubesine gelince , paralel olarak yapmanız gereken başka geliştirme çabalarınız yoksa, bir bagajınız olabilir :

  • büyük yeniden düzenleme
  • diğer sınıflardaki şeyleri arama şeklinizi değiştirebilecek yeni bir teknik kütüphanenin test edilmesi
  • önemli mimari değişikliklerin dahil edilmesi gereken yeni bir yayın döngüsünün başlangıcı.

Şimdi, geliştirme-bırakma döngünüz çok ardışıksa, diğer cevapların önerdiği gibi gidebilirsiniz: bir gövde ve birkaç serbest bırakma dalı. Bu, tüm gelişimin bir sonraki sürüme gireceği kesin olan küçük projeler için işe yarıyor ve sadece dondurulabilir ve yamaların yer alabileceği serbest bırakma dalı için bir başlangıç ​​noktası olarak hizmet edebilir. Bu nominal süreçtir, ancak daha karmaşık bir projeniz olur olmaz ... artık yeterli değildir.


Ville M.'nin yorumuna cevap vermek için:

  • geliştirici dalının 'geliştirici başına bir dal' (her bir geliştiricinin işlerini görmek / almak için başkalarının çalışmalarını birleştirmek zorunda kalacağı) anlamına gelmediğini, ancak geliştirme başına bir geliştirici dalın olduğunu unutmayın. çaba.
  • Bu çabaların yeniden gövdeye birleştirilmesi gerektiğinde (veya tanımladığınız herhangi bir "ana" veya serbest bırakma dalı), bu geliştiricinin çalışmasıdır, değil - tekrar ediyorum, DEĞİL - SC Yöneticisi (nasıl çözüleceğini bilemez) herhangi bir çelişki). Proje lideri birleşmeyi denetleyebilir, yani zamanında başlayıp / bitirdiğinden emin olabilirsiniz.
  • birleştirmeyi yapmak için gerçekte kim seçerseniz seçin, en önemlisi:
    • birleştirmenin sonucunu uygulayabileceğiniz / test edebileceğiniz birim testleri ve / veya montaj ortamına sahip olmak.
    • söz konusu birleştirme işleminin kendisini çok karmaşık veya oldukça uzun bir süre içinde kanıtladığında, önceki duruma geri dönebilmek için birleştirme işleminin başlangıcından önce bir etiket tanımlamış olması.

1
@Adam Düzenleme için teşekkür eder, uygun atıfları daha önce ayarlamadığınız için özür dileriz.
VonC

Ha! Hiç merak etmeyin. Burada topluluk için çok şey yaptın, hiçbir şey için suçlanamazsın. Sizin gibi insanların dünyadaki herkesin yararına bu kadar çok iş yaptığımız için mutluyum!
Adam Dymitruk

43

Kullanırız:

  • münhasıran geliştirme dalı

proje tamamlanıncaya kadar veya bir kilometre taşı sürümü (örneğin, ürün demosu, sunum sürümü) oluşturduktan sonra, mevcut geliştirme şubemizi (düzenli olarak) şu alanlara ayırırız:

  • serbest bırakma dalı

Sürüm dalına yeni özellik girmiyor. Serbest bırakma dalında yalnızca önemli hatalar sabitlenir ve bu hataları düzeltme kodu geliştirme dalına yeniden entegre edilir.

Gelişme ve istikrarlı (serbest bırakma) bir dalı olan iki parçalı süreç, hayatı bizim için çok daha kolay hale getiriyor ve daha fazla şube ekleyerek herhangi bir bölümünü geliştirebileceğimize inanmıyorum. Her dalın da kendi oluşturma süreci vardır, yani her birkaç dakikada bir yeni bir oluşturma işlemi ortaya çıkar ve bu nedenle bir kod kontrolünden sonra yaklaşık yarım saat içinde tüm yapı sürümleri ve dalların yeni bir yürütülebilir dosyası var.

Bazen, yeni ve kanıtlanmamış bir teknoloji üzerinde çalışan veya bir kavram kanıtı oluşturan tek bir geliştiricinin şubeleri de vardır. Ancak genellikle yalnızca değişiklikler kod tabanının birçok bölümünü etkiliyorsa yapılır. Bu ortalama her 3-4 ayda bir olur ve böyle bir dal genellikle bir veya iki ay içinde yeniden entegre edilir (veya hurdaya çıkarılır).

Genellikle kendi dalında çalışan her geliştirici fikrini sevmiyorum, çünkü siz "atlayın ve doğrudan entegrasyon cehennemine geçin". Buna karşı şiddetle tavsiye ediyorum. Ortak bir kod tabanınız varsa, hep birlikte çalışmalısınız. Bu, geliştiricileri checkin'leri hakkında daha dikkatli hale getirir ve her kodlayıcı hangi değişikliklerin yapıyı potansiyel olarak bozduğunu bilir ve bu nedenle testler bu gibi durumlarda daha titizdir.

Check-in erken sorusu hakkında:

Yalnızca MÜKEMMEL KOD'un kontrol edilmesi gerekiyorsa, aslında hiçbir şey kontrol edilmemelidir. Kod mükemmel değildir ve KG'nin bunu doğrulaması ve test etmesi için yeni bir yürütülebilir dosyanın oluşturulması için geliştirme dalında olması gerekir.

Bizim için bu, bir özellik tamamlandıktan ve geliştirici tarafından test edildikten sonra kontrol edilir. Bilinen (ölümcül olmayan) hatalar varsa bile kontrol edilebilir, ancak bu durumda hatadan etkilenecek insanlar genellikle bilgilendirilir. Eksik ve devam eden çalışma kodu da kontrol edilebilir, ancak yalnızca çökmeler veya mevcut işlevleri bozma gibi belirgin olumsuz etkilere neden olmazsa.

Arada sırada kaçınılmaz olarak birleştirilmiş kod ve veri girişi, yeni kod oluşturuluncaya kadar programı kullanılamaz hale getirecektir. Yaptığımız en az şey check-in yorumuna bir "YAPI BEKLE" eklemek ve / veya e-posta göndermektir.


1
Oy verdim. Bu, yaptığımızla benzer, ancak geliştirmede tüm değişiklikleri yapıyoruz ve daha sonra bu hata düzeltmelerini sürüm dalında birleştirmeye çalışıyoruz. Çalışmıyor. Ancak, sürümdeki tüm hata düzeltmelerini yapmak ve gelişmeyi birleştirmek için değiştirirsek, bunu düzeltiriz.
TheCodeMonk

2
KG'nin geliştirme dalını test ettiğini, serbest bırakma dalını kontrol etmeleri daha iyi olmaz mı? Bu şekilde, bir sonraki sürümde yer almayacak (ve bir şeyleri kırabilecek) yeni deli özelliğim üzerinde çalışmaya başlayabilirim, bu sırada KG yeni özellikimle etkileşime girmeden mevcut kodu test edecek mi?
BornToCode

15

Değeri için, biz böyle yapıyoruz.

Çoğu gelişim gövde içinde gerçekleştirilir, ancak deneysel özellikler veya sistemi kırabilecek şeyler kendi dallarını önemli ölçüde alma eğilimindedir. Bu, her geliştiricinin her zaman çalışma kopyalarındaki her şeyin en son sürümüne sahip olduğu anlamına gelir.

Bu, gövdeyi belirsiz bir şekilde çalışır durumda tutmanın önemli olduğu anlamına gelir, çünkü tamamen kırmak mükemmel bir şekilde mümkündür. Pratikte bu sık olmaz ve nadiren önemli bir sorundur.

Bir üretim sürümü için, gövdeyi branşlıyoruz, yeni özellikler eklemeyi bırakıyoruz ve serbest bırakılmaya hazır olana kadar dalı hata düzeltme ve test etme (düzenli olarak gövdeye geri dönüş) üzerinde çalışıyoruz. Hangi noktada, her şeyin orada olduğundan emin olmak için bagajda son bir birleşim yapıyoruz ve sonra serbest bırakıyoruz.

Daha sonra bakım gerektiğinde ayırma dalında gerçekleştirilebilir ve bu düzeltmeler kolayca gövdeye geri birleştirilebilir.

Bunun mükemmel bir sistem olduğunu iddia etmiyorum (ve hala bazı delikleri var - Sürüm yönetimimizin henüz yeterince sıkı bir süreç olduğunu düşünmüyorum), ancak yeterince iyi çalışıyor.


yeterince iyi çalışır ve vcs-druids dışındaki geliştiriciler için de yeterince basittir.
Matthieu

12

Neden hala kimse bundan bahsetmiyor? Başarılı bir Git dallanma modeli .

Benim için nihai dallanma modeli!

Projeniz küçükse, her zaman farklı dalları kullanmayın (belki de küçük özellikler için özellik dallarını atlayabilirsiniz). Ama aksi halde, bunu yapmanın yolu!

dallanma modeli


4
Evet, scottchacon.com/2011/08/31/github-flow.html'nin gösterdiği gibi, genellikle biraz fazla karmaşık / eksiksiz olması dışında .
VonC

Katılıyorum. Git akış dallanma modelini (birçok sorunu çözen) anlayın ve ihtiyaçlarınıza göre basitleştirin. GitHub akışı hızlı dağıtım gerektirir, ancak bu her zaman mümkün değildir ... Projemde kullandığımız dallanma modeli (işleri basit tutmak için) ama git-flow modelini kullanmayı çok seveceğimiz bir durumla karşılaştık: (ve bu bizi gerçekten büyük pisliğe soktu :(
Philippe

1
Gördüğüm gibi, bu temelde VonC'nin söylediği her şeyi yaklaşık 1 yıl önce (cevabında) kopyalar, ancak daha ayrıntılı bir şekilde ve güzel resimlerle!
cregox

6

Dallar üzerinde geliştirme kodu, Canlı kod Trunk etiketli.

"Sadece mükemmel kod uygula" kuralı olması gerekmez - geliştiricinin kaçırdığı her şey dört yerde toplanmalıdır: kod inceleme, şube testi, regresyon testi, son KG testi.

İşte adım adım daha ayrıntılı bir açıklama:

  1. Tüm gelişmeleri bir dalda yapın, gittikçe düzenli olarak taahhüt edin.
  2. Bağımsız Kod Tüm geliştirme tamamlandıktan sonra değişikliklerin gözden geçirilmesi.
  3. Ardından şubeyi Test'e geçirin.
  4. Şube testi tamamlandıktan sonra kodu Sürüm Adayı şubesine birleştirin.
  5. Bırakma Aday dalı, her bir birleştirme işleminden sonra regresyon testidir.
  6. Nihai KG ve UA Testi, tüm geliştirme dalları birleştirildikten sonra RC üzerinde gerçekleştirildi.
  7. KG ve UAT aktarıldıktan sonra, ayırma dalını ANA / TRUNK dalına birleştirin.
  8. Son olarak, Trunk'u o noktada etiketleyin ve bu etiketi Live'a dağıtın.


3

Bu sorunu, üretim kodunu (ana gövde) geliştirme kodundan (her geliştiricinin kendi şubesine sahip olduğu) tamamen ayırarak çözüyoruz.

Kapsamlı bir şekilde kontrol edilmeden önce üretim koduna hiçbir koda izin verilmez (KG ve kod inceleyenleri tarafından).

Bu şekilde hangi kodun çalıştığı konusunda bir karışıklık olmaz, her zaman ana daldır.


2

Oh evet - başka bir şey - cvs HEAD'de üretim dışı kodu (yani ASLA serbest bırakılmayacak şekilde - örn. Araç komut dosyaları, test yardımcı programları) tutuyoruz. Genellikle açıkça işaretlenmesi gerekir, böylece kimse "yanlışlıkla" serbest bırakmaz.


2
belki bu önceki cevaba yapılan bir düzenleme olarak daha iyi olurdu.
Richard Harrison

6
CVS dedi. :-)
Till

2

Daha sonra iki haftada bir dallanan ve üretime giren gövdede gelişiyoruz. Sadece kritik hatalar dalda sabitlenir, geri kalanı iki hafta daha bekleyebilir.

Gövde için tek kural, bir taahhüdün hiçbir şeyi kırmaması gerektiğidir. Silme kodunu ve test edilmemiş kodu yönetmek için sadece açıp kapatmayı kolaylaştıracak ifadeler ekleyin.

Temelde, herhangi bir zamanda gövdeyi kollamak ve üretime sokmak mümkün olurdu.


0

Git kullanıyorum ve 2 şubem var: ana ve maint

  • master - geliştirme kodu
  • maint - üretim kodu

Ben üretime kodu bıraktığınızda, bunu etiketlemek ve ben birleştirme ana kadar Maint dalı. Ben daima şubeden konuşluyorum . Geliştirme branşından yamalar I onları kiraz dalına alın ve yamaları dağıtın.


0

Şu anda üretimde olan veya kısa sürede dağıtılacak olan bir "sürüm" şubemiz var

Her projenin veya bazı durumlarda başka birimin serbest bırakılmasından ayrılan kendi dalı vardır.

Projedeki geliştiriciler tarafından projenin kendi dalında değişiklikler yapılır. Periyodik olarak, serbest bırakma bir geliştirme dalına birleştirilir.

Şube üzerindeki çalışma paketlerinin tümü KG (birim testi, sistem testi, kod incelemesi, KG incelemesi vb.) Olduğunda, şube sürüm şubesine birleştirilir. Yeni sürümler sürüm dalından oluşturulur ve son doğrulama bu sürümde gerçekleşir.

Birleştirme yapıldıktan sonra bir sorun bulunana kadar işlem temelde sorun değildir. Bir WP birleştirildikten sonra "takılırsa", düzeltilinceye kadar her şeyi tutar (sıkışmış olana kadar başka bir sürüm yapamayız).


Aynı zamanda biraz esnektir - çok kısa bir zaman diliminde (1-2 gün gibi) piyasaya sürülüyorsa, doğrudan serbest bırakma dalında çok önemsiz bir değişiklik olabilir.

Herhangi bir nedenle doğrudan üretimde bir değişiklik yapılmışsa (düzeltilmesi için derhal kod değişikliği gerektiren kritik bir müşteriyi etkileyen üretim sorunu), bu değişiklikler BRANCH_RELEASE'e geri konur. Bu neredeyse hiç olmaz.


0

Projeye bağlı. Web kodumuz oldukça tutarlı bir şekilde kontrol edilirken, uygulama kodumuz sadece derlendiğinde kontrol edilir. Bunun bir şeyleri nasıl serbest bıraktığımıza oldukça benzediğini fark ettim. Uygulamalar zor bir süre aşarken, web işleri mümkün olduğunda artar. Her iki yöntemde de kalite kaybı görmedim.

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.