Sürekli Entegrasyonun basit açıklaması


32

Sürekli Entegrasyonu nasıl tanımlıyorsunuz ve bir CI sunucusu hangi bileşenleri içeriyor?

Sürekli entegrasyonun ne olduğunu pazarlama departmanındaki birisine açıklamak istiyorum. Kaynak kontrolünü anlıyorlar - yani Subversion kullanıyorlar. Ama onlara CI'nin ne olduğunu tam olarak açıklamak istiyorum. Vikipedi Madde asla düzgün tanımlar, Martin Fowler makale sadece temelde 'entegrasyon' belirsiz bir açıklama izledi bir totolojidir aşağıdakileri verir:

Sürekli Entegrasyon, bir ekibin üyelerinin sık sık işlerini entegre ettiği, genellikle her kişinin en az günlük olarak bütünleştiği - günde birden fazla entegrasyona yol açan bir yazılım geliştirme uygulamasıdır. Her entegrasyon, entegrasyon hatalarını mümkün olan en kısa sürede tespit etmek için otomatik bir derleme (test dahil) ile doğrulanır.

Güncelleme : Onlara bu resmi gönderdim, daha basit bir resim bulamadım.

görüntü tanımını buraya girin

2. Güncelleme : Pazarlama bölümünden geri dönün (3 soru olduğu zaman için):

Aslında her 3 cevabı da beğeniyorum - farklı sebeplerden dolayı. Herkese teşekkür etmek için giriş yapmak istiyorum!

Açıkçası yapamaz - onun adına çok teşekkürler :)

Güncelleme 3 : Wikipedia makalesine baktığımda, sadece başlıkları aldığınızda oldukça iyi bir liste olan ilkeleri içerdiğini anladım :

  1. Bir kod deposu koruyun
  2. Yapıyı otomatikleştir
  3. Kendini test yap
  4. Herkes her gün başlangıç ​​çizgisine taahhüt eder
  5. Her taahhüt (temel çizgisine göre) yapılmalıdır
  6. Yapıyı hızlı tut
  7. Üretim ortamının bir klonunda test edin
  8. En son teslimatları almayı kolaylaştırın
  9. Herkes en son derlemenin sonuçlarını görebilir
  10. Dağıtımı otomatikleştir

3
oO Pazarlama departmanınız Subversion kullanıyor mu? "Çok Yerelleştirilmiş" olarak kapanmaya oy verme ... ... ;-)
Jeroen

@Jeroen Yep, gerçekten, web sitesindeki dosyalar için. Onları sunucudaki çöküşü güncellemek için 'Yap' yazan bir web sayfasında büyük kırmızı bir düğme yaptım. :)
icc97

Yanıtlar:


27

Birisi yazılım ürününü oluşturan dosyaları değiştirdikten sonra kontrol etmeye çalıştığında (başka bir deyişle, değişiklikleri ana ürün koduna entegre etmeye çalıştığında ), yazılım ürününün başarılı bir şekilde oluşturulduğundan emin olmak istersiniz.

Genellikle periyodik olarak veya her değişiklikte CI sunucusu olarak adlandırılan harici bir sistem vardır, kaynak dosyaları sürüm kontrolünden alır ve ürünü oluşturmaya çalışır (derleme / test / paket). CI sunucusu başarıyla bir yapı oluşturabiliyorsa, değişiklikler başarıyla entegre edildi.

Yapı başarısız olursa veya başarılı olursa CI sunucusunun da yayın yapabilmesi gerekir, böylece Jenkins (örneğin en çok kullanılan CI sunucusundan biri) gibi sistemler, e-postaları / metinleri ve gösterge panosuna benzer bir web arayüzünü bir e-postayla gönderme yollarına sahip olacaktır. check-in kod, işler vb kırdı mevcut ve geçmiş kurar hakkında bilgi demet (bu olurdu, yukarıdaki resmin üzerine geri bildirim mekanizması .)

CI önemlidir, çünkü sürekli olarak çalışan bir ürününüz olmasını sağlar. Bu, yazılım ürünü üzerinde çalışan tüm geliştiriciler için olduğu gibi QA gibi yazılım ürününün günlük yayınlarına erişmek isteyen tüm insanlar için önemlidir.


1
Sürekli Entegrasyon yapı durumunu değil, aynı zamanda testleri de önemser.
Quentin Pradet

1
ve dağıtım, testleri derlemek ve çalıştırmak için yeterli değildir, ancak ikili dosyaları bir ortama da göndermeniz gerekir; böylece insanlar (veya otomatik araçlar) tarafından da test edilebilir.
gbjbaanb

1
Soru basit bir açıklama istediğinden beri, CI sistemine girebilecek birçok (zamana göre proje / takıma özel) ayrıntı bırakmıştım.
c_maker

Bu test odaklı gelişime mi bağlı? Derleyen kod her zaman doğru çalışan kod değil midir? Kod hazır olmadığında testlerin başarısız olması durumunda, CI sistemi kodun gerçekten başarılı bir şekilde entegre edilip edilmediğini nasıl bilebilir?
mowwwalker 17:13

1
@ user828584: Benim cevabımda, 'test' yapısının bir parçası olduğunu ima ediyorum. Ayrıca bir not olarak, TDD kaliteyi kontrol etmek için test yapmaktan farklıdır. TDD'nin bir yan etkisi olarak, iyi yazılmış testlere sahip olacaksınız, ancak herhangi bir TDD yapmadan testlere sahip olabilirsiniz.
c_maker

33

Pazarlama departmanınız için CI'nin nasıl çalıştığı değil , CI'ın yazılımınızın yeni sürümleri için ne anlama geldiği önemli değil .

CI ideal olarak , bazı yeni özellikler, işlevler veya hata düzeltmeleri eklenmiş olarak, her gün yazılımınızın potansiyel olarak serbest bırakılabilir bir sürümünü , müşterinize sunulmaya veya satılmaya hazır hale getirebileceğiniz anlamına gelir . Bu, her gün yeni sürümü teslim etmeniz gerektiği anlamına gelmez , ancak isterseniz yapabilirsiniz.

Örneğin, yazılımınızın "2015" sürümü için resmi olarak piyasaya sürülmesi planlanan yeni bir özellik kümeniz varsa ve bu özellik kümesinin zaten kodlanmış ve entegre edilmiş bölümleri varsa, pazarlamacılar mevcut sürümünüzü alabilirler. yazılım ve göster - daha az ya da daha güvenli - bir sonraki konferansta şimdi 2013'te. CI olmadan, ekibinizden planlanmamış bir kod dondurması istemek zorunda kaldılar, her ekip üyesi üzerinde çalıştığı yarı pişmiş özelliği entegre etmek zorunda kaldı. ürün, yeterince otomatik sınava hazır olmayabilir ve konferansta ne olacağını tahmin etmeyebilir - 2015er sürümünüzün "alfa sürümü", özellikle de yeni özellikler gösterildiğinde, çökme riskini daha da yükseltir.


4
Sağladığı fayda perspektifinden yaklaşmak için +1.
dürtmek

17

Ne yaptığımızı bilmiyorsan CI'nin ne olduğunu bilemezsin. 3 parçalı bir sistem hayal edin. Veri toplayan ve veritabanına koyan bir kullanıcı arayüzü var. Veritabanından raporlar yapan bir raporlama sistemi var. Ayrıca, veritabanını izleyen ve belirli kriterler karşılanırsa e-posta uyarıları gönderen bir tür sunucu var.

Uzun zaman önce bu şu şekilde yazılırdı:

  1. Veri tabanı ve gereksinimler için şema üzerinde anlaşmaya varın - bu haftalar alacaktır, çünkü yakında göreceğiniz gibi mükemmel olması gerekiyordu.
  2. 3 parçaya 3 dev veya 3 bağımsız dev ekip ata
  3. Her dev kendi parçası üzerinde çalışacak ve kendi haftalarını veya aylarını kullanarak kendi veritabanı kopyasını kullanarak çalışmasını test edecek.

Bu süre zarfında devs birbirlerinin kodunu çalıştırmaz, başka birinin kodu tarafından yaratılmış olan veritabanının bir versiyonunu kullanmaz. Rapor yazarı yalnızca bir grup örnek veriyi ekleyecektir. Uyarı yazarı, rapor olaylarını simüle eden kayıtları ekleyecektir. GUI yazıcısı, GUI'nin ne eklediğini görmek için veritabanına bakar. Zamanla, devs, bir endeks belirtmemek ya da çok kısa bir alan uzunluğuna sahip olmak ve sürümlerinde bunu "düzeltmek" gibi bir şekilde yanlış olduğunu fark ederdi. Bunun üzerine hareket edebilecek diğerlerine söyleyebilirler, ama genellikle bunlar daha sonra bir listede olur.

Üç bölümün tamamı tamamen kodlandığında ve aygıtları tarafından test edildiğinde ve bazen kullanıcılar tarafından test edildiğinde (onlara bir rapor, ekran veya e-posta uyarısı göstererek) sonra "entegrasyon" aşamasına gelirdi. Bu, çoğu zaman birkaç ayda bütçelenmiştir, ancak yine de devam ederdi. Dev 1 tarafından bu alan uzunluğu değişikliği burada keşfedilecek ve dev kod 2 ve 3'ün devasa kod değişiklikleri ve muhtemelen kullanıcı arabirimi değişiklikleri de yapması gerekiyor. Bu ekstra endeks kendi tahribatına yol açacaktır. Ve bunun gibi. Cihazlardan birine kullanıcı tarafından bir alan eklemesi söylenirse ve yapıldıysa, şimdi diğer ikisinin de eklemesi gereken zaman olurdu.

Bu aşama vahşice acı vericiydi ve tahmin etmek neredeyse imkansızdı. Böylece insanlar "daha sık entegrasyon yapmalıyız" demeye başladı. “Baştan itibaren birlikte çalışmak zorundayız.” “Birimiz bir değişim isteğinde bulunduğunda [o zaman konuştuğumuz şey] diğerleri bunun hakkında bilmek zorunda.” Bazı ekipler, ayrı çalışmaya devam ederken entegrasyon testlerini daha erken yapmaya başladı. Bazı takımlar birbirlerinin kodlarını kullanmaya ve en başından itibaren her zaman çıktı almaya başladı. Ve bu Sürekli Entegrasyon oldu.

Bu ilk hikayeyi abarttığımı düşünebilirsiniz. Bir zamanlar bir şirkette çalışmıştım, temasım beni aşağıdaki kusurlardan muzdarip olan bazı kodları kontrol etmek için mahvetti:

  • üzerinde çalışmadığı bir ekran henüz bir şey yapmadı bir düğme vardı
  • hiçbir kullanıcı ekran tasarımında (kesin renkler ve yazı tipleri; ekranın varlığı, kabiliyetleri ve 300 sayfalık özelliğin hangi düğmeleri olduğunu) imzalamamıştı.

Done olana kadar işleri kaynak kontrolüne sokmamanız onun düşüncesiydi. Genelde bir ya da iki checkin yaptı. Biraz felsefe farkımız vardı :-)

Ayrıca, ekiplerin bir veritabanı gibi paylaşılan bir kaynakla bağlantısının kesileceğine inanmanın zor olduğunu düşünüyorsanız, aynı yaklaşımın kodlamaya alındığına gerçekten inanmayacaksınız (ancak bu doğru). Arayabileceğim bir fonksiyon yazacak mısın? Bu harika, devam et ve bunu yap, bu arada ihtiyacım olanı kodlayacağım. Aylar sonra, kodumu "entegre edeceğim", böylece API'nizi çağırır ve null'u geçersem patlar benim için artık yıl ve binlerce başka şeyle başa çıkamıyor. Bağımsız çalışmak ve daha sonra bir entegrasyon aşamasına sahip olmak normaldi. Şimdi delilik gibi geliyor.


2
SP 2003'te inşa edilen özel bir uygulamayı SP 2007'ye yükselttiğimiz benzer bir hikayemiz vardı. kodumuz, patlama, kodumuzdan bu yana sorun başladığında önemli ölçüde sapma olduğunu. Entegrasyon problemini bir ay boyunca düzelttik ve proje hafta içi çok uzak yaşayanları barındıracak bir otel kiraladı. O gün, kodları günlük olarak entegre etmeyi öğrendim :-)
OnesimusUnbound

@OnesimusUnbound VSS'den Clearcase'e ... tavadan ateşe çarptığımı hatırlıyorum. İçkiler için aynı şirkete döndükten yıllar sonra, "Git" adındaki bu yeni kaynak kontrolünden bahseden bir geliştiriciye gülen birisini hatırlıyorum, "Bunun için başka bir kaynak kontrol sistemine ne ihtiyacımız var?".
icc97

1
Teşekkür ederim - daha önce CI'yi anlamakta zorlandım çünkü alternatifin ne olduğunu bilmiyordum
Rhys

İlginç. Bana göre bu daha çok CI'yi şelaleye benzetmek gibi. Ancak, bu sorunları önleyen (yinelemeli gelişim gibi) şelale dışı bir metodoloji kullanabilirsiniz ve CI kullanmazsınız.
Dan

@DanMoulding çevik ve yinelendiriysem ve benim açımdan başka birinin yaptıklarıyla entegre olmayan daha büyük bir şeyin parçası olmasam, CI yapmıyorum. Heck, şelale ve CI yapabilirsiniz. Her şeyi tasarla, hepsini kodla, eğer istersen hepsini test et - eğer herkes her zaman herkesin kod / şema / dosya düzenlerini kullanıyorsa, şelale kullanıyor olsan bile CI olur. Bağlantı, CI olmadan BDUF tarafından yaşayıp ölmenizdir, çünkü makul bir uzunlukta bir entegrasyon aşamasına sahip olmak için tek umudunuz (ve hafif bir umut olduğu ortaya çıkar). CI'nın benimsenmesi BDUF'u bırakmamıza izin verdi.
Kate Gregory,
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.