Cake Build ile .Net Core Uygulamaları için CI Pipeline Oluşturmak

Adem Catamak
5 min readAug 2, 2020

--

.Net Core 3 ile bir WebApi projesi oluşturacak ve Cake Build ile CI (Continuous Integration) pipeline’ı kurgulayacağız.

Bu yazıdan önce Cake Build Nedir? isimli yazının ilk kısmına göz atmanızı tavsiye ederim.

Oluşturacağımız Cake Build script’inin son haline ve örnek uygulamaya bu link üzerinden erişebilirsiniz.

Origin: https://github.com/cake-build/frosting/blob/develop/cake-medium.png / https://commons.wikimedia.org/wiki/File:.NET_Core_Logo.svg

Cake Ortamının Hazırlanması

Cake sayfasında belirtilen yöntemi kullanarak indirilen başlangıç scriptlerinin (bootstrap) Mono üzerinde çalıştığını belirtmem gerekmektedir. Geliştirdiğiniz uygulama, Mono veya .Net Framework üzerinde çalışıyorsa, zaten bu bağımlılıklara sahip olduğunuz için bir sorun yaşamazsınız. Buna karşın .Net Core ile uygulamanızı geliştirmiş ve sadece Cake dosyasını çalıştırmak için Mono veya .Net Framework kurmak istemiyorsanız, aşağıdaki yöntemi kullanabilirsiniz.

Öncelikli olarak “build.config” adında bir dosya üretip içerisine kullanmak istediğimiz Cake Versiyonunu ve .Net Core versiyonunu belirtiyoruz. Bu dosyayı uygulamanızın ana dizinine yerleştirmelisiniz.

#!/usr/bin/env bash
CAKE_VERSION=0.35.0
DOTNET_VERSION=3.0.100

Linklenmiş olan .sh script’i .Net Core ile çalışacak şekildedir. .Net Core üzerinde geliştirdiğimiz uygulamanın derleme adımlarını yürütmek için oluşturacağımız “build.cake” dosyasını tetiklemek için bu script dosyasından yararlanacağız. Bu sh scriptini de build.config dosyasının olduğu dizine yerleştiriyoruz.

Not: CI adımlarınızı build.cake yerine XYZ.cake isimli bir dosya içerisinde tanımlamak isterseniz, sh script’inin son adımında değişiklik yapmanız gerekmektedir.

.Net Core WebApplication Projesi Oluşturmak

Bu makalenin konusu olmadığı için bu kısmı hızlıca geçeceğiz. Yapmamız gereken şey, bir WebApi projesi hazırlamak ve adını WebApplication (varsayılan değer bu zaten) koymak olacaktır. Bunun ardından bir de WebApplicationTest adından “birim testi” projesi oluşturmak yeterli olacaktır. Vs Code üzerinde dosya hiyerarşiniz aşağıdaki gibi görünecektir.

WebApi Projesi için Örnek Cake Build Dosyası Hazırlama

Farklı projeler için farklı CI pipeline yapıları tasarlanması gerekebilmektedir. Cake’e ait bazı özellikleri tanıtmaya devam edebilmek adına basit ama genel geçer bir yapı kurmaya çalışacağım.

Check Env Variable: Ortam kontrolü

İlk olarak Check Env Variable adını vereceğimiz görev ile işe başlayalım. Bu görev ile hangi git-branch için çalışmaya başladığımıza dair bilgi elde edecek ve bu bilgiye göre bir ortam seçeceğiz. Örneklemek gerekirse, dev/develop branch’leri test ortamına işaret ederken, master branch’inin stage ortamına işaret ettiği bir yapı üzerinde çalıştığımızı düşünelim. Böyle bir durum söz konusu olduğunda Cake dosyamızda aşağıdaki gibi değişiklikler yapmamız gerekecektir.

  • Cake dosyamıza çalıştığımız branch’in bildirilmesi için bir argüman tanıtmak
  • Çalıştığımız git-branch değerine göre hangi ortamı seçtiğimiz bilgisini saklayacak -SelectedEnvironment- değişkenini oluşturmak
  • Check Env Variable adında bir görev oluşturmak ve içerisinde gerekli kontrolleri yapmak
  • Hedef görevimizin, oluşturduğumuz yeni görevi tetiklemesi için IsDependOn metodu ile görevler arasında bağımlılık oluşturmak

IsDependOn metodu ile görevlerimizin yürütülmesinden önce çalışması gereken başka bir görev varsa onu işaret edebiliriz. Bu şekilde görevler arasında istediğimiz ilişkiyi kurabilmekteyiz. Final Stage görevinden önce Check Env Variable görevinin yürütülmesi için bu metottan yararlanacağız.

Herhangi bir parametre sağlamadan Cake dosyamızı çalıştırırsak, kodun içerisinde yazmış olduğumuz throw new Exception kısmı çalışacak ve aşağıdaki ekran görüntüsü ile karşılaşacağız. Bir hata alındığı taktirde -özel olarak belirtilmediği sürece- daha sonraki görevler çalıştırılmaz. İş hattımız bu noktada kırılır ve devam etmez.

bash build.sh

Not: Linux ve MacOs işletim sistemlerinde “chmod +x build.sh” script’i tetiklenmelidir.

Gerekli parametre ile script’imizi tekrar tetiklersek hata almadan işlemler yürütülebilecektir.

bash build.sh –branchName=“test”

Remove Directories: Temiz bir başlangıç

Bu adımda iş hattımızın çalışmaya başlamadan önce silmesi gereken dizinlerin ortadan kaldırılmasını sağlayacağız. Bu görevi tanımlarken farklı olarak Does metodu yerine DoesForEach metodunu kullanacağız. Böylece silinmesini istediğimiz her bir dizin için tanımlanan işler birbiri ardına tetiklenecek. Göreceğiniz üzere dosyalara ve dizinlere erişebilir, onlar üzerinde istediğiniz değişiklikleri yapabilirsiniz.

Bu görevi tanıttıktan sonra yapmamız gereken bir şey daha var; bu görevin çalışması için iş hattının çalışmaya başladığı Final Stage ile olan ilişkisini belirtmek. Final Stage görevi tetiklendiği zaman Check Env Variable ve Remove Directories görevinin tamamlanmasını beklemelidir.

DotNet Clean : Framework tarafından yürütülen temizlik

IDE üzerinde yaptığımız Clean görevini Cake Build ile de yürütebilmekteyiz. sln uzantılı dosyamızı parametre olarak kullanarak temizliği başlatalım.

Yeni görevimizi Final Stage için bağımlı olunan tek görev haline getirirken, Check Env Variable ve Remove Directories görevlerini DotNet Clean görevine bağlayacak şekilde değişiklik yaptığımızı yukarıdaki kod parçasında görebilirsiniz. Bu noktadan sonra build script’imizin akışı şu şekilde değişmiş olacaktır:

  • FinalStage görevimiz varsayılan olarak çalıştırılmak istenecek.
  • Bu görev kendinden önce DotNet Clean işleminin yürütülmesinin gerekliliğini bildiği için öncelikli olarak sırasını o göreve aktaracak.
  • Bu görev ise kendinden önce çalışması gereken iki görevin varlığını bildiği için öncelikli olarak onların tamamlanması için sırasını diğer iki göreve bırakacak. Bu görevler belirtilen IsDependOn sırası ile çalışacaktır.

DotNet Test: Her şey yolunda mı?

Birim testlerin (unit testlerin) çalıştığı bir adım ile yolumuza devam edelim. Bunun için Unit Test adında bir görev tanımlayabiliriz. Test projelerinin bulunması ve bu projelerin test senaryolarının çalıştırılması için DotNetCoreTest metoduna başvuru yapıyoruz. Projelere ait .csproj dosyaları bu metoda verildiği durumda test projeleri ve bağımlılığı bulunan projeler -varsayılan olarak- derlenmektedir. Eğer projelerin derlenmesini test aşamasında yapmak yerine öncesinde bir “Build” görevi tanımlamak isterseniz, DotNetCoreTestSettings sınıfı üzerinde bulunan “NoBuild” ve “NoRestore” alanlarını değiştirebilirsiniz.

DotNet Publish: Paketiniz hazır

Bu görev içerisinde belirtilecek projeler, belirlenecek yürütme zamanı ayarları ile yayınlanacaktır. Cake dosyası içerisinde sınıf tanımlamaları da yapılabilmektedir. Biz de bu özellikten faydalanarak, proje isimlerini ve hangi yürütme zamanı ayarıyla yayınlanacağına dair bilgileri bir arada tutabilecek bir sınıf tasarlayalım.

Ayrıca global bir şekilde tanımlayıp kullanabileceğimiz metotlar tanımlamamız da mümkündür.

Şimdi yeni tanımlamış olduğumuz metodumuzu ve sınıfımızı kullanarak DotNet Publish işlemini yürütecek görevimizi tanıtalım. Bunun için öncelikle yayınlayacağımız projeleri sakladığımız bir değişken tanımlayalım.

var ProjectToBePublished = new Project[]
{new Project("WebApplication", "linux-x64")};

Bu kod satırı ile WebApplication adındaki projemizin linux sisteminde çalışacak şekilde derlenmesini istediğimizi belirtmiş olduk. İsterseniz win-x64, win7-x86 vb. farklı seçenekleri de kullanabilirsiniz.

Bunun ardından görevimizi tanımlayalım.

Bu adımı da tamamladığımız durumda artık kodumuz, otomatik olarak bütün birim testleri yürütülecek ve bu testlerden başarılı bir şekilde geçmesi halinde paketlenmeye hazır halde bir dizine çıkarılacak.

Artık ortamdan bağımsız çalıştırabileceğimiz bir CI pipeline betiğine sahibiz. Bu betik sonucunda kuruluma hazır olan uygulama paketlerine oluşturmuş olduk. Bu betiğin Jenkins, Travis, AppVeyor, BitBucket-pipeline gibi farklı CI platformlarından nasıl tetiklenebileceğinizi merak ediyorsanız yazının üçüncü kısmına göz atabilirsiniz.

Not: Linux ve MacOs sistemlerde aşağıdaki script aracılığı ile build.sh dosyasının çalışma modunda yaptığınız değişikliğin git üzerine de yansıtılmasını sağlayabiliriz.

git update-index — add — chmod=+x build.sh

Diğer yazılarıma göz atmak için bu linke tıklayabilirsiniz.

--

--