Nasıl ve neden bir C # derleme makinesi kurabilirim? [kapalı]


144

Bir C # projesinde küçük (4 kişilik) bir geliştirme ekibi ile çalışıyorum. Projenin gece yapılarını ve testlerini yapacak bir yapı makinesi kurmayı önerdim, çünkü bunun iyi bir şey olduğunu anlıyorum. Sorun şu ki, burada çok fazla bütçemiz yok, bu yüzden bu güçlerin masrafını haklı göstermeliyim. Bu yüzden bilmek istiyorum:

  • Ne tür araçlara / lisanslara ihtiyacım olacak? Şu anda, kaynak kontrolü için Visual Studio ve Akıllı Montaj'ı ve Performans için kullanıyoruz. Başka bir şeye ihtiyacım olacak mı yoksa otomatik komut dosyalarını çalıştırmak için bir cron işi eşdeğeri var mı?
  • Tam olarak, bu beni kırık bir yapının göstergesi dışında ne getirecek? Bu çözümlerde (sln dosyası) bu komut dosyaları tarafından çalıştırılacak test projeleri oluşturmalı mıyım, böylece belirli işlevleri test edebilir miyim? Şu anda böyle iki testimiz var, çünkü iyi birim testleri yapmak için zamanımız yoktu (veya açıkçası, deneyimimiz).
  • Bunun için ne tür bir donanıma ihtiyacım olacak?
  • Bir yapı tamamlandıktan ve test edildikten sonra, bu yapıyı bir ftp sitesine koymak veya dahili erişim için başka bir yol bulmak yaygın bir uygulamadır? Fikir bu makine sağlamasıdır yapı ve hepimiz buna gitmek, ama biz gerekirse hata ayıklama oluşturur yapabilirsiniz.
  • Bu tür bir yapıyı ne sıklıkla yapmalıyız?
  • Alan nasıl yönetilir? Her gece inşa edersek, tüm eski binaların etrafında mı kalmalıyız, yoksa yaklaşık bir hafta sonra onları terk etmeye mi başlayalım?
  • Burada görmediğim başka bir şey var mı?

    Bunun çok büyük bir konu olduğunun farkındayım ve daha yeni başlıyorum. Burada bu sorunun bir kopyasını bulamadım ve eğer dışarıda bir kitap varsa, lütfen bana bildirmeliyim.

    EDIT: Sonunda işe başladım! Hudson tamamen harika ve FxCop uygulandığını düşündüğümüz bazı özelliklerin aslında eksik olduğunu gösteriyor. Ayrıca yükleyici türünü Old-And-Busted vdproj yerine New Hotness WiX olarak değiştirmek zorunda kaldık.

    Temel olarak, dikkat edenler için, yapınızı komut satırından çalıştırabilirseniz, hudson'a koyabilirsiniz. Yapıyı MSBuild üzerinden komut satırından çalıştırmak, kendi başına yararlı bir alıştırmadır, çünkü araçlarınızı güncel olmaya zorlar.


  • 5
    Müthiş, Hudson'ı sevdiğini duyduğuma sevindim :) CI platformu olmadan hayatı hayal etmek zor değil mi?
    Allen Rice

    2
    Çok zor. Değişiklik çok değdi.
    mmr

    Yanıtlar:


    147

    Güncelleme: Jenkins , Hudson'ın en güncel sürümüdür. Herkes şimdi Jenkins'i kullanmalı. Bağlantıları buna göre güncelleyeceğim.

    Hudson ücretsizdir ve yapılandırılması son derece kolaydır ve bir sanal makinede kolayca çalışır.

    Kısmen eski bir görevimden:

    Biz kullanmak için

    • Windows hizmetlerini dağıtma
    • Web hizmetlerini dağıtma
    • MSTest'leri çalıştırın ve herhangi bir junit testi kadar bilgi görüntüleyin
    • Düşük, orta, yüksek görevleri takip edin
    • trendgraf uyarıları ve hataları

    İşte Hudson'ın desteklediği yerleşik .net şeylerinden bazıları

    Ayrıca, tanrı görsel kaynağı güvenli kullandığınızı yasaklar, bunu da destekler . Redsolo'nun Hudson kullanarak .net projeleri oluşturma hakkındaki makalesine göz atmanızı tavsiye ederim.

    Sorularınız

    • S : Ne tür araçlara / lisanslara ihtiyacım olacak? Şu anda, kaynak kontrolü için Visual Studio ve Akıllı Montaj'ı ve Performans için kullanıyoruz. Başka bir şeye ihtiyacım olacak mı yoksa otomatik komut dosyalarını çalıştırmak için bir cron işi eşdeğeri var mı?

    • C: Windows Studio işletim sisteminin yeni, yamalı bir yüklemesini çalıştıran bir VM'nin yeni bir kopyasına visual studio yükledim. Yani bunun için lisanslara ihtiyacınız olacak. Hudson kendini bir windows hizmeti olarak kuracak ve 8080 bağlantı noktasında çalışacak ve güncellenmiş kod için kod havuzunuzu ne sıklıkta taramasını istediğinizi ya da belirli bir zamanda inşa etmesini söyleyeceksiniz. Tümü tarayıcı aracılığıyla yapılandırılabilir.

    • S: Tam olarak, bu beni kırık bir yapının göstergesi dışında ne getirecek? Bu çözümlerde (sln dosyası) bu komut dosyaları tarafından çalıştırılacak test projeleri oluşturmalı mıyım, böylece belirli işlevleri test edebilir miyim? Şu anda böyle iki testimiz var, çünkü iyi birim testleri yapmak için zamanımız yoktu (veya açıkçası, deneyimimiz).

      Y: İlk derleme başarısız olduğunda veya kararsız hale geldiğinde bir e-posta alacaksınız. Bir birim testi başarısız olursa veya karar verdiğiniz herhangi bir ölçütle kararsız olarak işaretlenebilirse, yapı kararsızdır. Bir birim testi veya derlemesi başarısız olduğunda size e-posta gönderilir ve size nerede, neden ve nasıl başarısız olduğunu bildirir. Yapılandırmamla şunları elde ederiz:

      • Son çalışma derecesinden bu yana yapılan tüm taahhütlerin listesi
      • bu taahhütlerin notlarını ver
      • işlemlerde değiştirilen dosyaların listesi
      • hata veya test hatasını gösteren derlemenin kendisinden konsol çıkışı
    • S: Bunun için ne tür bir donanıma ihtiyacım olacak?

      C: Bir VM yeterli olacaktır

    • S: Bir yapı tamamlandıktan ve test edildikten sonra, bu yapıyı bir ftp sitesine koymak veya dahili erişim için başka bir yol bulmak yaygın bir uygulamadır mı? Fikir şu ki, bu makine inşa ediyor ve hepimiz ona gidiyoruz, ancak eğer yapmamız gerekiyorsa hata ayıklama yapıları yapabilir.

      C: Hudson, md5 karma yoluyla ID'leme, yükleme, kopyalama, arşivleme, vb. Gibi istediğiniz her şeyi yapabilir.

    • S: Bu tür bir yapıyı ne sıklıkla yapmalıyız?

      C: Bizimki SVN'yi her saat anket yapıyoruz, kod değişiklikleri arıyor, sonra bir yapı çalışıyoruz. Her gece ok, ama dün işe yaradı ne zaman sen almak sabah zihninde taze olmayacak beri biraz değersiz IMO.

    • S: Alan nasıl yönetilir? Her gece inşa edersek, tüm eski binaların etrafında mı kalmalıyız, yoksa yaklaşık bir hafta sonra onları terk etmeye mi başlayalım?

      C: Bu size bağlı, bu kadar uzun bir süre sonra yapı eserlerini uzun süreli depolama alanına taşıyorum veya siliyorum, ancak etrafımda sakladığım metin dosyalarında / xml dosyalarında saklanan tüm veriler, bu değişiklik günlüğünü, trend grafiklerini, vb verrrry az yer kapladı sunucuda. Ayrıca Hudson'ı, sadece sondaki yapıların eserlerinden korumak için ayarlayabilirsiniz

    • S: Burada görmediğim başka bir şey var mı?

      A: Hayır, git şimdi Hudson'ı al, hayal kırıklığına uğramayacaksın!


    1
    Mükemmel cevap! Ben sadece CruiseControl kullandım, ama Hudson için iyi bir satış var.
    Ben S

    1
    İşaretçiler için teşekkürler - Hudson Doğru Alet'e benziyor.
    mmr

    1
    Bağlantıyı ilk kelimeye koyabilir misiniz lütfen?
    Jhonny D. Cano -Yazılım-

    Hudson'a bir bağlantı mı istiyorsunuz? Eğer öyleyse, ekledim, iyi çağrı :)
    Allen Rice

    5
    Herhangi birinin kaçırması durumunda, Hudson orijinal geliştiricileri tarafından Jenkins olarak çatallandı / yeniden adlandırıldı . Şimdi en iyisi Jenkins'i seçmektir, çünkü bu soru muhtemelen sizi ikna edecektir.
    Jonik

    26

    Aşağıdaki komboda büyük şansımız oldu:

    1. Visual Studio (özellikle, MSBuild.exe komut satırı aracını kullanarak ve çözüm dosyalarımızı ileterek. Msbuild komut dosyalarına olan ihtiyacı kaldırır)
    2. NAnt (XML sözdizimi / görev kütüphanesi gibi MSBuild'den daha iyi. Ayrıca P4 src kontrol işlemleri için seçenekler var)
    3. CruiseControl.net - yapıları izlemek / başlatmak için dahili web panosu.

    CCNet, derlemeler başarılı / başarısız olduğunda e-posta göndermek için yerleşik bildiriciler içerir

    Gerekçelendirme: Bu, manuel derlemeler yapan geliştiricilerin yükünü alır ve insan hatasını denklemden çıkarmak için çok şey yapar. Bu etkiyi ölçmek çok zor, ama bir kez yaptıktan sonra asla geri dönmeyeceksiniz. Yazılım oluşturmak ve yayınlamak için tekrarlanabilir bir işleme sahip olmak çok önemlidir. Eminim yazılımı elle inşa ettikleri yerler oldunuz ve bu yazılım vahşi doğada sadece yapıcınızın "Hata! Bu yeni DLL dosyasını eklemeyi unutmuş olmalıyım!"

    Donanımda: alabildiğiniz kadar güçlü. Daha fazla güç / bellek = daha hızlı üretim süreleri. Ödeyebiliyorsanız, grup ne kadar küçük olursa olsun, birinci sınıf bir makine almaktan asla pişman olmayacaksınız.

    Alanda: Bol miktarda sabit disk alanınızın olmasına yardımcı olur. Bir derleme her başlatıldığında NAnt komut dosyalarınızı ara dosyaları silmek için oluşturabilirsiniz, böylece asıl sorun günlük geçmişlerini ve eski uygulama yükleyicilerini tutmaktır. Disk alanını izleyen ve uyarı gönderen bir yazılımımız var. Ardından sürücüyü manuel olarak temizleriz. Genellikle her 3-4 ayda bir yapılması gerekir.

    Derleme bildirimlerinde: Bu, CCNet'te yerleşiktir, ancak ek bir adım olarak otomatik test ekleyecekseniz, bunu başlangıçtan itibaren projeye ekleyin. Bir proje büyüdükten sonra uygunluk testlerini desteklemek son derece zordur. Test çerçeveleri üzerinde tonlarca bilgi var (muhtemelen SO hakkında da bir ton bilgi), bu yüzden belirli araçları adlandırmayı erteleyeceğim.


    Evet, CC.NET ile de harika deneyimler yaşadım :)
    cwap

    Donanım gereksinimleri dışında mükemmel yanıt. Her gece inşa ediyor, bu yüzden derlemek ve test etmek birkaç saat sürüyorsa umursadığından şüpheliyim. Zaten sahip oldukları donanım üzerinde bir VM'de her şeyi kurmanızı bile öneririm.
    Ben S

    İpuçları için teşekkürler. Bunu gerekçelerimde kullanacağım.
    mmr

    1
    Burada C # ve C ++ derlemeleri için NAnt / Subversion / CC.Net ile bir derleme makinesi kullanıyoruz ve başka bir projeyi kırmadığınızdan emin olmak için gerçekten harika bir araç. Bir kütüphaneyi değiştirirken başka bir projeyi kırma korkusunu ortadan kaldırır, çünkü her şeyi kırdıysa yakında göreceksiniz
    Julien Roncaglia

    11

    Önceki iş yerimde TeamCity kullandık . Kullanımı çok kolay ve güçlü. Bazı kısıtlamalarla ücretsiz olarak kullanılabilir. Dime Casts hakkında bir eğitim de var . CruiseControl.NET'i kullanmamamızın nedeni, çok sayıda küçük projemiz olması ve her birini CC.NET'te kurmak oldukça acı verici olmasıdır. TeamCity tavsiye. Açık kaynağa doğru olup olmadığınızı özetlemek için CC.NET biraz daha yüksek öğrenme eğrisine sahip büyük baba. Bütçeniz kesinlikle TeamCity ile gitmek izin verirseniz veya ücretsiz sürümü kontrol edin.


    10

    Nasıl? Carel Lotz'in bloguna bir göz atın .

    Neden? Düşünebileceğim birkaç neden var:

    • Çalışan bir yapı, düzgün bir şekilde uygulandığında, tüm geliştiricilerin yapı yeşil olduğunda makinelerini inşa edebilecekleri anlamına gelir
    • Çalışan bir yapı, düzgün bir şekilde uygulandığında, istediğiniz zaman konuşlandırmaya hazır olduğunuz anlamına gelir
    • Düzgün bir şekilde uygulandığında çalışan bir yapı, bıraktığınız her şeyin kaynak kontrol sisteminize bir yolculuk yaptığı anlamına gelir.
    • Düzgün bir şekilde uygulandığında çalışan bir yapı, erken ve sık sık entegrasyon anlamına gelir ve entegrasyon riskinizi azaltır.

    Martin Fowler'in Sürekli Entegrasyon makalesi kesin metin olmaya devam ediyor. Şuna bir göz at!


    5

    Ana argüman, geliştirme sürecinizin maliyetini, en kısa zamanda kırık bir yapıya veya başarısız testlere sahip olduğunuz konusunda uyararak indirecektir.

    Birden fazla geliştiricinin çalışmasını entegre etme sorunu, bir takım yetiştirmenin ana tehlikesidir. Takım büyüdükçe, çalışmalarını koordine etmek ve birbirlerinin değişiklikleriyle uğraşmalarını durdurmak daha zorlaşır. Tek iyi çözüm, tamamlandıkça küçük iş birimlerini (bazen "öykü" olarak da adlandırılır) kontrol ederek "erken ve sık sık entegre olmalarını" söylemektir.

    İnşaat makinesinin gün boyunca bazı kontrolleri tekrar inşa etmesini sağlamalısınız. Cruise Control ile görev çubuğunuzda, yapı bozulduğunda kırmızıya dönen (hatta sizinle konuşur!) Bir simge alabilirsiniz.

    Ardından, paydaşlarınıza (ürün yöneticileri, KG çalışanları) yayınlamayı seçebileceğiniz, kaynak sürümün etiketlendiği (benzersiz bir yapı numarası verilir) her gece tam temiz bir yapı yapmanız gerekir. Bu, bir hata bildirildiğinde, bilinen bir yapı numarasına karşıdır (bu son derece önemlidir).

    İdeal olarak, yapıların indirilebileceği dahili bir siteniz olmalı ve önceki gece yapısını yayınlamak için tıklayabileceğiniz bir düğmeye sahip olmalısınız.


    1
    Downvoter neden (ler) duymak çok ilgi olurdu!
    Daniel Earwicker

    1
    Bende olduğu gibi, bu soruya iyi bir cevap. Özellikle yayın ve versiyonlama konusunu seviyorum.
    mmr

    5

    Sadece mjmarsh'ın söylediklerine biraz inşa etmeye çalışıyorum, çünkü büyük bir temel attı ...

    • Görsel stüdyo. MSBuild iyi çalışıyor.
    • NAnt .
    • NantContrib . Bu, Performans işlemleri gibi ek görevler sağlayacaktır.
    • CruiseControl.net . Bu yine temelde sizin "gösterge panonuzdur".

    Yukarıdakilerin tümü (VS için kaydet) açık kaynaktır, bu nedenle herhangi bir ek lisanslamaya bakmazsınız.

    Earwicker'ın belirttiği gibi, erken inşa edin, sık inşa edin. Bir şeyin kırıldığını bilmek ve bir çıktı üretebilmeniz, şeyleri erken yakalamak için yararlıdır.

    NAnt, nunit / nunit2 için de görevler içerir , böylece birim testinizi otomatikleştirebilirsiniz. Daha sonra sonuçlara stil sayfaları uygulayabilirsiniz ve CruiseControl.net tarafından sağlanan çerçevenin yardımıyla, her yapı için okunabilir, yazdırılabilir birim test sonuçları elde edebilirsiniz.

    Aynı şey ndoc görevi için de geçerlidir . Her yapı için belgelerinizi hazırlayın ve hazır bulundurun.

    Örneğin, InstallShield kullanarak bir Windows Installer üretmek gibi diğer komutları yürütmek için exec görevini kullanabilirsiniz .


    Fikir, yapıyı mümkün olduğunca otomatikleştirmektir, çünkü insanlar hata yapar. Ön tarafa harcanan zaman yolda biriken zamandır. İnsanlar, inşa sürecinden geçerek binaya bebek bakımı yapmak zorunda değiller. Yapınızın tüm adımlarını tanımlayın, her görev için NAnt komut dosyaları oluşturun ve tüm oluşturma işleminizi tamamen otomatikleştirinceye kadar NAnt komut dosyalarınızı tek tek oluşturun. Daha sonra tüm yapılarınızı tek bir yere koyar, bu da karşılaştırma amaçları için iyidir. Yapı 426'da Yapı 380'de işe yarayan bir şey kırıldı mı? Test için hazır teslimatlar var - onları yakalayın ve test edin.


    Ndoc'u unutmuştum. Dokümantasyon, ele almamız gereken bütün 'balmumu topu' - ​​hatırlatma için teşekkürler.
    mmr

    4
    • Lisans gerekmez. CruiseControl.net serbestçe kullanılabilir ve sadece .NET sdk oluşturmak gerekir.
    • Otomatik birim testleri olmasa bile bir yapı sunucusu, bina sürümleri için kontrollü bir ortam sağlar. Artık "John genellikle makinesinin üstüne inşa ediyor ama hastalandı. Nedense makineme dayanamıyorum"
    • Şu anda bir Sanal PC oturumunda bir tane ayarladım.
    • Evet. Yapının erişilebilir bir yere dökülmesi gerekir. Geliştirme yapılarında hata ayıklama açık olmalıdır. Sürüm derlemesi kapalı olmalıdır.
    • Ne sıklıkta size kalmış. Doğru şekilde ayarlanırsa, her check-in işleminden sonra çok az yük oluşturabilirsiniz. Ünite testlerini uyguladıysanız (veya yapmayı planlıyorsanız) bu harika bir fikirdir.
    • Kilometre taşlarını ve sürümleri gerektiği kadar saklayın. Başka bir şey ne sıklıkta inşa ettiğinize bağlıdır: sürekli mi? atmak. Günlük? Bir hafta değerinde ol. Haftalık? İki aylık değere sahip olun.

    Projeniz ne kadar büyük olursa, otomatik bir yapı makinesinin faydalarını o kadar çok göreceksiniz.


    3

    Her şey yapının sağlığı ile ilgilidir. Bunun size getirdiği şey, yapılarda olmasını istediğiniz her türlü şeyi ayarlayabilmenizdir. Bunlar arasında testler, statik analiz ve profiler çalıştırabilirsiniz. Uygulamanın bu bölümünde yakın zamanda çalıştığınızda, problemler çok daha hızlı çözülür. Küçük değişiklikler yaparsanız, neredeyse nerede kırdığınızı söyler :)

    Bu elbette her check-in (sürekli entegrasyon) ile inşa etmek için ayarladığınızı varsayar.

    Ayrıca KG ve Dev'in daha da yakınlaşmasına yardımcı olabilir. Profiler ve geliştirici ekibine geri bildirimi artıran herhangi bir şeyle birlikte çalışmak için fonksiyonel testler ayarlayabileceğiniz gibi. Bu, her testte (biraz zaman alabilir) işlevsel testlerin yapıldığı anlamına gelmez, ancak tüm ekip için ortak olan araçlarla derlemeler / testler ayarlarsınız. Duman testlerini otomatikleştiriyorum, bu yüzden benim durumumda daha da yakın işbirliği yapıyoruz.


    1

    Neden: 10 yıl önce yazılım geliştiricileri olarak nihayet bir şeyi analiz ederdik (insan dilinde yazılan) belgeleri 'imzaladı' ve sonra kod yazmaya başladık. Birim testi, string testi ve daha sonra sistem testini vuracağız: sistem ilk kez bir araya getirildiğinde, bazen belgeleri imzaladıktan hafta veya ay sonra çalıştırılacaktı. Ancak o zaman her şeyi analiz ederken sahip olduğumuz tüm varsayımları ve yanlış anlamaları ortaya çıkarırdık.

    Sürekli Entegrasyon ve fikir, eksiksiz (başlangıçta çok basit olmasına rağmen) uçtan uca bir sistem oluşturmanıza neden olur. Zamanla sistem işlevselliği dikey olarak oluşturulur. Tam bir derleme yaptığınızda, sistem testini erken ve sık sık yapıyorsunuz. Bu, hataları düzeltmek için en ucuz zaman olduğunda hataları ve varsayımları olabildiğince erken bulup düzelttiğiniz anlamına gelir.

    Nasıl: Nasıl gelince, biraz önce bu konuda blog yazdım: [ Buraya Tıklayın ]

    8'den fazla yayın, .NET çözümleri için Windows ortamında bir Jenkins sunucusunun nasıl kurulacağı konusunda adım adım ilerliyor.


    1
    Bu bağlantı soruyu cevaplayabilse de, cevabın temel kısımlarını buraya eklemek ve bağlantıyı referans olarak sağlamak daha iyidir. Bağlantı verilen sayfa değişirse, yalnızca bağlantı yanıtları geçersiz olabilir.
    TLama

    Bu soruya bir cevap sağlamaz. Bir yazarın eleştirisini yapmak veya açıklama istemek için yazılarının altına bir yorum bırakın - her zaman kendi yayınlarınıza yorum yapabilirsiniz ve yeterli bir üne sahip olduğunuzda herhangi bir yazı hakkında yorum yapabilirsiniz .
    Danilo Valente

    Yorumum geri bildirime dayalı olarak güncellendi.
    Andrew Gray
    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.