2011-12-27 23 views
5

Belki bu sadece bir deli adamın rüyasıdır Sürekli Entegrasyon compiletime ama .. benim şirketteoptimize

biz ~ 3.5 mio ~ 25 çözümleri (çok eski) ile, büyük bir C# .NET projesi var ve. loc. Karşılaştığım sorunlar: çok yavaş yapım süreleri, şu anda SSD (dev makineler) ile 7 dakika, normal harddrives ile VM'de 15 dakika + (konuşlandırılmak istiyorum TeamCity yapı sistemi olurdu). Biliyorum, yapı sistemi en hızlı olmalı, ama kısa vadede değiştirebileceğim bir şey değil.

Devreler için (özellikle şu anda Teamcity makinesinde) taahhüt oluşturma-güvensiz geri besleme döngüsünü kısaltmak istiyorum; sadece son taahhütte bulunan proje (ler) i derleyerek diğer tüm montajları örn. yerel bir nuget sunucusu (sürüm 7.0 ile birlikte teamcity sunucusu).

Şimdi bu gayet (bir dakikadan kısa bir sürede 15 dakika gerçek birim testleri verilen) geri besleme döngüsü kesmek küçük kaydedilmesini için olacaktır.

Böyle bir kısmi derleme problemi, derleme hatalarını atlama olasılığını (uyumsuz arabirimler fark edilmeden gidebilir) biliyorum, ancak bu, tüm enchilada çalıştıran bir ikinci (Teamcity?) Yapı sunucusu örneği çalıştırılarak azaltılabilir. paralel. Ama hemen ilk geri bildirim almak benim için önemli çok olduğunu.

Şimdi benim sorum: bu görevi halledebilecek herhangi bir yapı sistemi/sürekli entegrasyon sistemi var mı? Yoksa kendi taahhütlü arka plan hizmetimi yazmam mı gerekir? FinalBuilder Scripts'i kullandığımıza göre, bu biraz kötü olur ve Format'ın herhangi bir API tarafından okunabilir görünmüyor (ancak bunun derinliklerine bakmadığı).

P.S .: Ayrıca, sadece en son taahhüdün değiştiği veya en azından öncelik verdiği projelerin ünite testlerini yapmak istiyorum. Ama bu bir sonradan geldi.

+0

[Çok yavaş Visual Studio üzerinde derleme kez] olası yinelenen (http sonuçları döndürebilir : //stackoverflow.com/questions/55517/very-slow-compile-times-on-visual-studio) – Oded

+0

evet, gördü, ama .. 1) çok eski, 2) birçok cevap C# ile kullanılamaz, 3) yardımcı olacak birkaç kişi (özel VS Addin ile olan gibi) herhangi bir bağlantıyı desteklemiyor ve bu kadar derin gömülü zaman içinde bazı değerli geribildirim için umut olamazdı zaman – hko

+0

@hko Ben hayal edilemez bir sayı gibi görünüyor biliyorum Kaybedecek çok puan var, ama diğer soruya bir ödül vermeyi ve/veya cevaplardaki her bağlantıyı takip etmeyi tercih ederim. o tarafta. –

cevap

0

MSBuild, yapı betiği hedefleri için "derleme" ve "yeniden oluşturma" arasında ayrım yapar - normal yapı, yalnızca önceki yapılardan beri değişmiş olarak gördüğü projeleri oluşturur. Kaynak, kaynak kontrolünden kaynak aldığında (SCM'ye bağlı olarak, Mercurial ile işe yaramış gibi görünebilir) ve TeamCity ajanının derleme dizininin temizlenmemesi yeterlidir. bir inşa tetiklemek, bir yeniden değil.

Birim testleri ile ilgili olarak, TeamCIty önce başarısız olanları uygulayabilir, ancak hangi testlerin hangi kaynak kod parçalarının benim için zor bir görev gibi göründüğünü belirleyerek, TeamCity AFAIK tarafından desteklenmez.

+0

hrm .. Tamam sesler, ama: Ben onlar "kararlı" başlangıç ​​çizgisine (hg kullanarak) için alamadım başarısız olarak, yamaları test etmek için kullanırdım ... bu yüzden yapı dizinleri "sıfırlamak" gerekir gbaseline dan son taahhüt .. yapması çok zor değil, ama hala bir bitmiş çözüm var gibi görünmüyor hala hayret ediyorum .. – hko

3

Mevcut CI motorların çoğu, geliştirme döngüsündeki geri bildirim süresini azaltmak için özel olarak tasarlanmış bir dağıtım boru hattı işlemini benimser. Bu, herhangi bir adım yanlış giderse hemen FAIL durumuyla çalışır.

En zorlu projeler için bile, ilk 4 adımın 2-5 dakika daha az olması gerektiği önerilmektedir (by this book), eğer yukarıda belirtilirse, yapılandırmanızla ve CI kullanma biçiminizle ilgili bir sorun vardır. süreci.

 
Code commit 
triggers ---> 

Step 1. Automatic checkout on CI side 
Step 2. Compile code, ideally 1-2 mins 
Step 3. Save binaries to the artifact repository 
Step 4. Unit test, ideally 1-2 mins 
Step 5. Deploy to staging 
Step 6. Automated integration testing 
Step 7. Automated acceptance testing 
------------------------------------ 
Manual testing 
Manual deploy to production 

Özellikle yapabilirsiniz 2. Adıma:

a. Büyük çözümü ayrı katmanlara ayırın.Her bir katmanın kendi Visual Studio çözümüne sahip olması ve sadece bu katmanla ilgili projeler olması, bir anlamda ilk hantal çözümün ademi merkezileştirilmesini gerçekleştirmenizdir. 5. adımda, katmanları kullanılabilir uygulamaya nasıl monte edeceğinizi bilirsiniz.

b. TeamCity konfigürasyonunda, temiz bir ödeme yapılıp yapılmayacağını veya halihazırda mevcut olan kaynağı kullanacağınızı belirtebilirsiniz (1. adımda zamandan tasarruf edebilirsiniz). MSBuild hedefinin Yapı Yapılandırmasına ayarlandığından emin olun, bu yalnızca son yapıdan bu yana değişen kaynak dosyaları alır (2. adımda zaman kazanın).

Kişisel deneyim seçeneğinden a) en iyisidir, ancak gerekirse, hem a) hem de b) öğelerini de kullanabilirsiniz; ancak, eski dosyalara ihtiyaç duyulmadığından daha uzun süre saklanan bazı gizli hatalar getirebilirsiniz. Teamcity, görevleri paralel olarak yürütmenize izin veren birkaç aracı (ücretsiz sürümde en fazla 3) destekler.

+0

Bilmek güzel, ama bu sorunun cevabı benim problem adım 2'de yatıyor. :) "Ayrıca, büyük projeleri daha küçük olanlara ayırarak ve yalnızca değişmiş olan kütüphaneleri derleyerek derleme süresini kısaltabilirsiniz." -> bu problemimi tam olarak çözecek, tamamen otomatikleştirilmiş bir sistemde bunun nasıl yapılacağını açıklamaya dikkat et, sadece taahhütlere dayanarak, kurmak niyetindeyim. Teamcity, sadece bir certian projesinin nasıl değiştiğini nasıl bilebilirdi? Belki olabilir, ama ne yazık ki değil .. – hko

+0

@hko Ben cevabın altını güncelledim, pls yardımcı olup olmadığını bakın. – oleksii

1

Bir bağımlı sistemler sistemi kullanın. Her bir proje ile kendi klasöründe SVN kullanıyorsanız, bu projeyi oluşturan her bir proje için CI projesi oluşturabilir ve başarılı olup olmadığını çok hızlı bir şekilde bildirirsiniz.

Oluşturma Tetikleyicisine sahip ikinci bir CI projesi oluşturun, böylece ilk CI projesi başarılı olur ve ikinci projeniz de deneme durumunuzu çalıştırırsa oluşturulur. Bunu Jenkins'i kullanarak başarılı bir şekilde başardım.

Tam bir derleme için, kök klasörünü herhangi bir değişiklik için izleyen ve tüm çözümün oluşturulmasını başlatan başka bir CI projeniz olabilir.

şöyle kurma her proje yapı var ve kod kontrol ve proje için testlerinde daha yavaş bir dönüş olduğunda çabucak

+0

Mercurial kullanıyoruz. Teamcity'nin repo değişimlerinde otomatik olarak özel bir yapı (repo alt klasörüne dayalı olarak) veya herhangi bir CI sisteminin yapıp yapamayacağından emin değil. – hko