Sürekli tümleştirme ile yazılım geliştirmenizi modernleştirme

Kod geliştirildikçe, güncelleştirildikçe, hatta kaldırıldıkçe, bu değişiklikleri ana kod dalı ile tümleştirmek için sezgisel ve güvenli bir yönteme sahip olmak geliştiricilerin değer sağlamasına olanak tanır.

Geliştirici olarak, küçük kod değişiklikleri yapabilir, bu değişiklikleri bir kod deposuna gönderebilir ve kalite, test kapsamı hakkında neredeyse anında geri bildirim alabilir ve hataları ortaya çıkarabilirsiniz. Bu işlem daha hızlı ve daha fazla güven ve daha az risk ile çalışmanızı sağlar.

Sürekli tümleştirme (CI), yazılım geliştirme ekipleri için otomatik derleme, test ve geri bildirim mekanizmaları sağlamak üzere kaynak denetim sistemlerinin ve yazılım dağıtım işlem hatlarının tümleştirildiği bir uygulamadır.

Sürekli tümleştirme süreci, bir mühendis GitHub’da bir pull isteği oluşturarak CI sistemine kod değişikliklerinin tümleştirmeye hazır olduğunun sinyalini verdiğinde başlar. İdeal olarak, tümleştirme işlemi kodu birkaç temel hat ve teste karşı doğrular. Ardından, talep eden mühendise bu testlerin durumu hakkında geri bildirim sağlar.

Temel denetimler ve test iyi giderse, tümleştirme işlemi güncelleştirilmiş yazılımı dağıtacak varlıkları üretir ve hazırlar. Bu varlıklar derlenmiş kod ve kapsayıcı görüntüleri içerir.

Sürekli tümleştirme, aşağıdaki eylemleri gerçekleştirerek yüksek kaliteli yazılımları daha hızlı bir şekilde sunmanıza yardımcı olabilir:

  • Son değişiklikleri önceden saptamak için koda karşı otomatikleştirilmiş sınamalar çalıştırın.
  • Kod standartlarını, kaliteyi ve yapılandırmayı sağlamak için kod analizini çalıştırın.
  • Yazılımın bilinen güvenlik açıkları olmadığından emin olmak için uyumluluk ve güvenlik denetimleri çalıştırın.
  • Yazılımın beklendiği gibi çalışmasını sağlamak için onay veya işlev testlerini çalıştırın.
  • Algılanan sorunlarla ilgili hızlı geri bildirim sağlayın.
  • Uygulanabilirse, güncelleştirilmiş kodu içeren dağıtılabilir varlıklar veya paketler üretin.

Terminoloji

Sürekli tümleştirmeyi uygulamaya başlamadan önce bu önemli terimleri tanıyın.

Süre Tanım
yapıt Derleme işleminden derlenmiş kod, kapsayıcı görüntüleri veya dağıtım paketleri gibi dağıtılabilir bir çıkış.
Otomatik test Kod kalitesini doğrulamak ve el ile müdahale olmadan sorunları algılamak için CI işlem hattının bir parçası olarak otomatik olarak çalışan bir test.
İnşa Et Kaynak kodu derleyen, testleri çalıştıran ve dağıtım için yapıtlar üreten işlem.
Derleme Temsilcisi CI işlem hattı içindeki görevleri ve işlemleri çalıştıran şirket içinde veya bulutta barındırılan bir hesaplama kaynağı.
Sürekli tümleştirme (CI) Kod değişikliklerini otomatik olarak derlemek, test etmek ve doğrulamak için kaynak denetim sistemlerini otomatik işlem hatları ile tümleştiren bir uygulama.
CI işlem hattı Geliştiriciler kaynak denetimine kod değişikliklerini kaydedildiğinde, bu değişiklikleri derleyen, test eden ve doğrulayan otomatik bir çalışma süreci.
Tümleştirme testi Farklı bileşenlerin veya hizmetlerin birlikte nasıl çalıştığını doğrulayan ve genellikle birim testlerinden daha kapsamlı olan bir test.
Gece buildı Tümleştirme ve UI testleri gibi daha uzun süre çalışan test paketlerini çalıştırmak için düzenli aralıklarla (genellikle gece) çalışan zamanlanmış bir derleme.
Çekme isteği Kod birleştirme isteği, bir daldan diğerine değişir. Tümleştirmeden önce önerilen değişiklikleri doğrulamak için CI işlem hattını tetikler.
Yayın derlemesi Derleme, testler, belgeler, uyumluluk raporları ve imzalamayı içeren kapsamlı bir derleme. Üretim dağıtımı için son sürümü üretir.
Kaynak denetimi Zaman içinde kodda yapılan değişiklikleri izleyen ve yöneten bir sistem. Örnek olarak Git, Azure Repos ve GitHub verilebilir.
Durum rozeti Derlemelerin veya testlerin geçerli durumunu görüntüleyen ve genellikle depo belgelerinde gösterilen görsel gösterge (genellikle bir görüntü).
Test temelli geliştirme (TDD) Geliştiricilerin bu testleri karşılayan kodu yazmadan önce testleri yazdığı bir geliştirme uygulaması.
Birim testi Tek tek işlevleri veya bileşenleri, beklendiği gibi davrandığından emin olmak için yalıtarak doğrulayan bir test.

Boru hatları ile sürekli tümleştirmeyi otomatikleştirme

Sürekli tümleştirme elde etmek için, süreci yönetmek, tümleştirmek ve otomatikleştirmek için yazılım çözümlerini kullanın. Yaygın bir uygulama, sürekli tümleştirme işlem hattı kullanmaktır.

Sürekli tümleştirme işlem hattı, şunları sağlayan bir yazılım parçası (genellikle bulutta barındırılan) içerir:

  • Otomatikleştirilmiş testleri çalıştırmaya yönelik bir platform.
  • Uyumluluk taramaları.
  • Raporlama.
  • Sürekli tümleştirme işlemini oluşturan diğer tüm bileşenler.

Çoğu durumda, işlem hattı yazılımı, çekme istekleri oluşturulduğunda veya yazılım belirli bir dalda birleştirildiğinde sürekli entegrasyon işlem hattı çalıştırılacak şekilde kaynak kontrolüne eklenir. Kaynak denetimi entegrasyonu ayrıca, çekme isteklerine doğrudan CI geri bildirimi verme fırsatı sağlar.

Azure Pipelines veya GitHub Actions gibi birçok çözüm, sürekli tümleştirme kanallarının yeteneklerini sunar.

İşlem hatlarını kaynak denetimiyle tümleştirme

Sürekli tümleştirme süreçlerinizin kaynak kontrol sisteminizle entegrasyonu, hızlı ve kendi kendine hizmet sunan kod katkılarının sağlanmasında anahtardır.

CI iş akışı, yeni oluşturulan bir çekme isteği üzerinde çalışır. İş akışı tüm testleri, güvenlik değerlendirmelerini ve diğer denetimleri içerir. CI testi sonuçları kaliteyle ilgili neredeyse gerçek zamanlı geri bildirim sağlamak için doğrudan pull isteğinde görünür.

Diğer bir popüler uygulama da mevcut yapı durumlarını görünür kılmak için kaynak kontrolünde sunulabilecek küçük raporlar veya rozetler oluşturmaktır.

Aşağıdaki resimde GitHub ve bir Azure DevOps kanal arasındaki tümleştirme gösterilmektedir. Bu örnekte, çekme isteği oluşturulması bir Azure DevOps işlem hattını tetikler. Boru hattı durumu, çekme isteğinde görünür.

GitHub deposundaki Azure DevOps durum rozetinin ekran görüntüsü.

Otomatikleştirilmiş testleri birleştirme

Sürekli tümleştirmenin anahtar bir öğesi, geliştiriciler kod katkıları sağlarken kodun sürekli olarak oluşturulması ve test edilmesidir. Çekme isteklerinin oluşturuldukları şekilde test edilmesi, işlemenin hataya neden olan değişiklikler yapmadığına ilişkin hızlı geri bildirim sağlar. Bunun avantajı, sürekli tümleştirme ardışık düzenindeki testlerin, test odaklı geliştirme sırasında çalışan testlerin aynı olmasıdır.

Aşağıdaki kod parçacığında Azure DevOps işlem hattından bir test adımı gösterilmektedir. Bu adımda iki görev vardır:

  • İlk görev, CI testlerini çalıştırmak için popüler bir Python test çerçevesi kullanır. Bu testler Python koduyla birlikte kaynak denetiminde bulunur. Test sonuçları test-results.xmladlı bir dosyaya gider.
  • İkinci görev, test sonuçlarını tüketir ve bunları tümleşik bir rapor olarak Azure DevOps işlem hattında yayımlar.
- script: |
    pip3 install pytest
    pytest azure-vote/azure-vote/tests/ --junitxml=junit/test-results.xml
    continueOnError: true

- task: PublishTestResults@2
    displayName: 'Publish Test Results'
    inputs:
    testResultsFormat: 'JUnit'
    testResultsFiles: '**/test-results.xml'
    failTaskOnFailedTests: true
    testRunTitle: 'Python $(python.version)'

Aşağıdaki görüntüde Azure DevOps portalında görüntülenen test sonuçları gösterilmektedir.

Azure DevOps portalında Azure DevOps işlem hattı testlerinin ekran görüntüsü.

Başarısız testler

Başarısız olunan testler bir dağıtımı geçici olarak engellemeli ve ne olduğunu daha derin bir çözümlemeye götürmelidir. Başarısız olan testlerin ya gözden geçirilmesi ya da testlerin başarısız olmasına neden olan değişiklikte iyileştirme yapılması gerekir.

Derleme durumunu yayımlama

Birçok geliştirici, depolarında durum rozeti görüntüleyerek kod kalitesinin yüksek olduğunu gösterir. Aşağıdaki görüntü, GitHub'daki bir açık kaynak projesinin benioku dosyasında görüntülenen Azure Pipelines rozeti göstermektedir.

GitHub'daki bir README dosyasındaki Azure Pipelines rozetinin ekran görüntüsü.

Derleme sürelerini iyileştirme

Daha hızlı derlemeler gerçekleştirmek için şunları yapabilirsiniz:

  • Performans gereksinimlerinizi karşılayan aracıları seçin: Doğru derleme makinelerini seçerek derlemelerinizi hızlandırın. Hızlı makineler saat ve dakikalar arasında fark oluşturabilir. İşlem hatlarınız Azure Pipelines'daysa, Microsoft tarafından barındırılan bir aracı kullanarak işlerinizi çalıştırabilirsiniz. Microsoft tarafından barındırılan aracıları kullandığınızda bakım ve yükseltme işlemleri sizin için yapılır. Daha fazla bilgi için bkz. Microsoft tarafından barındırılan aracılar.

  • Derleme sunucusu konumunu iyileştirme: Kodunuzu oluştururken veriler kablo üzerinden gönderilir. Yapılar için girdiler, bir kaynak kontrol deposundan ve bir yapıt deposundan getirilir. Derlenen yapıtlar, test raporları, kod kapsamı sonuçları ve hata ayıklama simgeleri dahil olmak üzere derleme işleminden elde edilen çıktının kopyalanması gerekir. Bu kopyalama eylemlerinin hızlı bir şekilde çalıştırılması önemlidir. Kendi derleme sunucunuzu kullanıyorsanız, derleme sunucusunun kaynakların ve hedef konumun yakınında bulunduğundan emin olun. Hızlı yüklemeler ve indirmeler genel derleme süresini kısaltabilir.

  • Derleme sunucularının ölçeğini genişletme: Küçük bir ürün için tek bir derleme sunucusu yeterli olabilir. Ürünün boyutu ve kapsamı ile ürün üzerinde çalışan ekiplerin sayısı arttıkça tek bir sunucu yeterli olmayabilir. Sınıra ulaştığınızda altyapınızı birden çok makine üzerinde yatay olarak ölçeklendirin. Daha fazla bilgi için bkz. Aracı havuzları oluşturma ve yönetme.

  • Derlemeyi iyileştirme:

    • Derleme işlemini hızlandırmak için paralel işler ekleyin. Daha fazla bilgi için bkz. Paralel işlerin yapılandırılması ve ödenmesi.

    • Özellikle tümleştirme ve ui testlerini çalıştırırken genellikle büyük miktarda zaman kazandıran paralel test paketi çalıştırmalarını etkinleştirin. Daha fazla bilgi için bkz. Herhangi bir test çalıştırıcısı için testleri paralel çalıştırma.

    • Derlemelerinizi birden fazla derleme aracısı ile ölçeklendirebileceğiniz bir çarpan kavramını kullanın. Daha fazla bilgi için bkz. İşlem hattınızda işleri belirtme.

    • Tümleştirme, kullanıcı arabirimi ve duman testlerini bir yayın işlem hattına taşımayı göz önünde bulundurun. Yayın işlem hattına geçmek, derleme hızını ve derleme geri bildirim döngüsünün hızını artırır.

    • Derleme yapıtlarını NuGet veya Maven gibi bir paket yönetimi çözümünde yayımlayın. Paket yönetimi çözümüne yayımlama, derleme yapıtınızı daha kolay yeniden kullanmanıza olanak tanır.

İş akışlarınıza uyacak derleme türlerini uygulama

Kuruluşunuz, derleme sürelerini iyileştirmek için birkaç farklı tür derleme oluşturmayı seçebilir. Olası derlemeler şunlardır:

  • Sürekli tümleştirme (CI) derlemesi: Bu derlemenin amacı kodun derlendiğinden ve birim testlerinin çalıştırıldığından emin olmaktır. Bu yapı her yapılan işlemde tetiklenir. Projenin can damarı olarak görev yapar ve hemen takıma kaliteli geri bildirim sağlar. Daha fazla bilgi için bkz. İşlem hatlarını tetikleyen olayları belirtin.

  • Gecelik derleme: Gecelik derlemenin amacı yalnızca kodu derlemek değil, aynı zamanda her derleme için düzenli bir tempoda verimsiz olan daha büyük test paketlerinin çalıştırılmasını sağlamaktır. Bu testler genellikle tümleştirme, kullanıcı arabirimi veya duman testlerini içerir. Daha fazla bilgi için bkz İşlem hatları için zamanlamaları yapılandırma.

  • Yayın derlemesi: Bu derleme, testleri derlemeye ve çalıştırmaya ek olarak API belgelerini, uyumluluk raporlarını, kod imzalamayı ve kod her oluşturulduğunda gerekli olmayan diğer adımları da derler. Bu yapı, son olarak üretim ortamında dağıtılmak üzere süreç hattına gönderilen altın kopyayı sağlar.

Kuruluşunuzun ihtiyaç duyduğu derleme türleri, ekibinizin ve kuruluşunuzun olgunluğu, üzerinde çalıştığınız ürün türü ve dağıtım stratejiniz gibi faktörlere bağlıdır.

GitHub veya Azure DevOps kullanarak sürekli tümleştirme işlem hattı oluşturmayı öğrenin:

Depolarınızda rozetleri görüntülemeyi öğrenin: