Sürekli entegrasyonda birden çok şubeyi yönetme


86

Şirketimde CI ölçeklendirme sorunuyla uğraşıyorum ve aynı zamanda CI ve birden çok şubeye gelince hangi yaklaşımı benimsemeye çalışıyorum. Stackoverflow, Çoklu özellik dalları ve sürekli entegrasyonda benzer bir soru var . Yeni bir tanesine başladım çünkü daha fazla tartışma yapmak ve soruda bazı analizler yapmak istiyorum.

Şimdiye kadar, alabileceğim 2 ana yaklaşım olduğunu (veya belki başka bazılarını ???) buldum.

Görünüşe göre geliştiricilere kendi özel dalları için CI sağlamak istiyorsam, Jenkins için özel araçlara ihtiyacım var (API veya kabuk komut dosyaları veya başka bir şey?) Ve ölçeklendirmeyi halledebilirim. Veya onlara DEV ile daha sık birleşmelerini ve özel şubelerde CI olmadan yaşamalarını söyleyebilirim. Hangisini tercih edersiniz yoksa başka seçenekler var mı?

Yanıtlar:


70

CI'yi ölçeklendirmekten bahsettiğinizde, tüm özellik dallarınızı ana hattınızla birlikte idare etmek için CI sunucunuzun kullanımını ölçeklendirmekten gerçekten bahsediyorsunuz. Başlangıçta, bir şubedeki geliştiriciler CI işlerinin içerdiği otomatik testin tüm avantajlarını elde ettikleri için bu iyi bir yaklaşım gibi görünüyor. Ancak, CI sunucu işlerini yönetirken sorunlarla karşılaşırsınız (keşfettiğiniz gibi) ve daha da önemlisi, gerçekten CI yapmıyorsunuz. Evet, bir CI sunucusu kullanıyorsunuz, ancak tüm geliştiricilerinizin kodunu sürekli olarak entegre etmiyorsunuz.

Gerçek CI gerçekleştirmek, tüm geliştiricilerinizin ana hatta düzenli olarak taahhütte bulunduğu anlamına gelir. Söylemesi kolay, ancak işin zor kısmı uygulamanızı bozmadan bunu yapmaktır. Sürekli Teslime , özellikle Bölüm 13: Bileşenleri ve Bağımlılıkları Yönetme'deki Uygulamanızı Yayınlanabilir Tutma bölümüne bakmanızı şiddetle tavsiye ederim . Ana noktalar:

  • Tamamlanana kadar yeni işlevi gizleyin (AKA Feature Toggles ).
  • Tüm değişiklikleri, her biri serbest bırakılabilen bir dizi küçük değişiklik olarak aşamalı olarak yapın.
  • Kod tabanında büyük ölçekli değişiklikler yapmak için soyutlama yoluyla dalı kullanın.
  • Uygulamanızın farklı hızlarda değişen parçalarını ayırmak için bileşenleri kullanın.

Soyutlamayla dallanma dışında oldukça açıklayıcıdırlar. Bu sadece şunun için süslü bir terimdir:

  1. Sistemin değiştirmeniz gereken kısmı üzerinde bir soyutlama oluşturun.
  2. Soyutlama katmanını kullanmak için sistemin geri kalanını yeniden düzenleyin.
  3. Tamamlanana kadar üretim kodu yolunun parçası olmayan yeni bir uygulama oluşturun.
  4. Yeni uygulamanıza yetki vermek için soyutlama katmanınızı güncelleyin.
  5. Eski uygulamayı kaldırın.
  6. Artık uygun değilse soyutlama katmanını kaldırın.

Bölüm 14: Gelişmiş Sürüm Kontrolü'ndeki Dallar, Akışlar ve Sürekli Entegrasyon bölümündeki aşağıdaki paragraf , etkileri özetlemektedir.

Aşamalı yaklaşım, bir şube oluşturmaktan ve yeniden tasarlama ve yeni işlevsellik geliştirmeye hevesli bir şekilde dalmaktan kesinlikle daha fazla disiplin ve özen ve aslında daha fazla yaratıcılık gerektirir. Ancak değişikliklerinizin uygulamayı bozma riskini önemli ölçüde azaltır ve sizin ve ekibinizin birleştirme, kırılmaları düzeltme ve uygulamanızı konuşlandırılabilir bir duruma getirme konusunda önemli ölçüde zaman kazandıracaktır.

Özellik dallarından vazgeçmek oldukça zihinsel bir değişim gerektirir ve her zaman dirençle karşılaşırsınız. Tecrübelerime göre bu direnç, geliştiricilerin ana hattı kodlama konusunda kendilerini güvende hissetmemelerine dayanıyor ve bu makul bir endişedir. Bu da genellikle yukarıda listelenen tekniklerle ilgili bilgi, güven veya deneyim eksikliğinden ve muhtemelen otomatik testlerinize olan güven eksikliğinden kaynaklanır. İlki, eğitim ve geliştirici desteği ile çözülebilir. İkincisi, uğraşması çok daha zor bir sorundur, ancak dallanma ekstra gerçek bir güvenlik sağlamaz, sadece geliştiriciler kodlarına yeterince güvenene kadar sorunu erteler.


4
Tom, bu sadece 1) hem sürüm hem de güncelleme nispeten kolaysa 2) değişikliklerinizin çoğu iyi izole edilmişse işe yarar. Bu, web geliştiricileri için geçerlidir, ancak kutulu ürün sürümleri yapıyorsanız, kararlı sürümlerin her ne pahasına olursa olsun sabit kalması gerekir, çünkü büyük bir kurumsal ortamda düzeltmeler gerçekten pahalı ve hatta imkansızdır.
Jevgeni Kabanov

13
gerçek CI sadece entegrasyonla ilgili değil, aynı zamanda geri bildirimle de ilgili
Anton Arhipov

3
Bunu cevap olarak seçtim (en azından ödülü verdim, lütfen bir şekilde hala doğru olarak işaretlemem gerekiyorsa bana bildirin) ama sanırım bu benim sorunum için bir çözüm değil. Zeroturnaround.com/blog/…
toomasr

1
@Jevgeni Kabanov ve @toomasr İkiniz de doğru CI yapmanın kaliteden vazgeçmek anlamına geldiğini varsayıyorsunuz ve bu sadece Web dev için işe yarıyor çünkü düzeltmeleri zorlamak çok kolay. Tahminimce endişelendiğin şey, serbest bırakılmadan hemen önce tehlikeli bir taahhüt. Evet, bu, düzeltilmesi pahalı olabilecek kötü bir sürümle sonuçlanabilir. Ancak, yayınlanmadan hemen önce bir özellik dalında tehlikeli bir taahhüt de aynı derecede kötüdür. Bir fark olduğunu düşünüyorsanız, lütfen gerekçenizi paylaşın. Bununla mücadele etmenin bir yolu (taahhüt ana hatta veya bir özellik şubesiyse) Sürekli Teslimat yaklaşımını kullanmaktır.
Tom Howard

1
Oh, ve BTW, son 4 yıldan biraz fazla bir süredir ana geliştirme deneyimim finans kurumlarında oldu. Kararlı sürümlere sahip olma zorunluluğu ve bunu yanlış yapmanın maliyeti (bir düzeltmeyi göndermek için geçmeniz gereken değişiklik kontrol sürecinden bahsetmiyorum bile) bundan çok daha fazla olamaz. Kutulu bir ürün benim için rahatlatıcı bir değişiklik olur.
Tom Howard

4

Her şube için ayrı işler kurardım. Bunu daha önce yaptım ve Hudson / Jenkins'i doğru bir şekilde kurduysanız yönetimi ve kurulumu zor değil. Birden çok iş oluşturmanın hızlı bir yolu, benzer gereksinimleri olan mevcut bir işten kopyalamak ve gerektiğinde bunları değiştirmektir. Her geliştiricinin kendi şubeleri için kendi işlerini kurmasına izin vermek isteyip istemediğinizden emin değilim, ancak bu bir kişinin (yani bir yapı yöneticisi) yönetmesi için fazla bir iş değil. Özel dallar kararlı dallar halinde birleştirildikten sonra, karşılık gelen işler artık gerekli olmadığında kaldırılabilir.

CI sunucusundaki yükten endişeleniyorsanız, yükü birden çok sunucu arasında dengelemeye yardımcı olmak için ayrı CI örnekleri veya hatta ayrı bağımlı birimler kurabilirsiniz. Hudson / Jenkins'i çalıştırdığınız sunucunun yeterli olduğundan emin olun. Apache Tomcat kullandım ve derleme kuyruğunu işlemek için yeterli belleğe ve işlem gücüne sahip olduğundan emin olmam gerekiyordu.

CI kullanarak neyi başarmak istediğiniz konusunda net olmak ve daha sonra çok fazla manuel çaba veya tekrarlama olmadan bunu uygulamanın bir yolunu bulmak önemlidir. CI sunucunuz tarafından yürütülen ve genel yapı yönetimi sürecinizi basitleştirmeye yardımcı olan diğer harici araçları veya komut dosyalarını kullanmakta yanlış bir şey yoktur.


Sanırım bu alet eksikliği, bu departmanda bazı eklentilere / ürünlere yer olduğu anlamına geliyor. Kendi kendime yazmak istemezdim.
toomasr

1
Her dal için otomatik olarak derleme yapılandırması oluşturan Jenkins için yardımcı program var: entagen.github.com/jenkins-build-per-branch
kolen

3

Dev + kararlı dalları seçerdim. Ve hala özel dallar istiyorsanız ve yükten korkuyorsanız, neden bu özel dalları buluta taşımıyorsunuz ve geliştiricilerin bunu kendilerinin yönetmesine izin vermiyorsunuz, örneğin http://cloudbees.com/dev.cb Bu, Kohsuke'nin bulunduğu şirkettir. . Ayrıca bir Eclipse Tooling de vardır, bu nedenle Eclipse üzerindeyseniz, onu doğrudan geliştirme ortamına sıkıca entegre etmiş olursunuz.


Birden fazla şubeyi yönetme araçlarının eksikliğini, aynı soruna ancak bulutta mı sahip olacağım? Demek istediğim şimdi yükü yönetebilirim ama yine de şubeleri yönetemiyorum?
toomasr

Araçları unutmak ve yönetimi geliştiriciler arasında dağıtmak istemiştim - "özel bir kişisel yapı istiyorsanız, işte CB hesabınız". Ana sunucunun yapı performansını etkilemeden. API'leri oldukça basit olsa da, yönetim araçları oluşturmak muhtemelen bir-iki hafta meselesi olacaktır ve sonra orada ne istersen onu yaparsın. Hayatta olağan olduğu gibi, özel bir şey istiyorsanız, bunu kendiniz yapmaktan daha iyi olursunuz. Aynı zamanda hızla büyüyorlar ve topluluğu dinliyorlar, bu yüzden bir özellik isteği doldurun ve yakında görünebilir.
Anton Safonov

Oh, anlaşıldı. Şube sahibine, kirazın ilgilendiği işleri seçip istediği gibi özel şubesi için ayarladığını söyleyin. Bu fikri beğendim.
toomasr

1

Aslında gerçekten sorunlu olan şey, özellik dalları ile yalıtım oluşturmaktır. Şirketimizde, tümü daha büyük bir dağıtımın parçası olan bir dizi ayrı maven projemiz var. Bu projeler farklı ekipler tarafından sürdürülür, ancak her dağıtım için tüm projelerin yayınlanması gerekir. Bir özellik dalı artık bir projeden diğerine örtüşebilir ve bu, inşa izolasyonu acı verici bir şekilde olduğunda bu olur. Denediğimiz birkaç çözüm var:

  • her özellik dalı için bağlantı noktasında ayrı anlık görüntü havuzları oluşturun
  • özel slave'lerde yerel depoları paylaşın
  • havuz-sunucu-eklentisini yukarı akış havuzlarıyla birlikte kullanın
  • tek bir özel depo ile tek bir iş içinde oluşturun

Nitekim son çözüm en umut verici olandır. Diğer tüm çözümler şu veya bu şekilde eksiktir. Job-dsl eklentisi ile birlikte yeni bir özellik dalı kurmak kolaydır. sadece harika komut dosyasını kopyalayıp yapıştırın, dalları uyarlayın ve tohum işinin yeni işleri oluşturmasına izin verin. Başlangıç ​​işinin yönetilmeyen işleri kaldırdığından emin olun. Ardından, farklı maven projeleri üzerinde özellik dalları ile kolayca ölçeklendirebilirsiniz.

Ancak Tom'un yukarıda da söylediği gibi, özellik dallarının gerekliliğinin üstesinden gelmek ve geliştiricilere temiz bir şekilde entegre olmayı öğretmek daha iyi olurdu, ancak bu daha uzun bir süreç ve artık dokunmayacağınız birçok eski sistem parçasıyla sonuç net değil.

benim 2 sentim

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.