İçeriğe geç

CI/CD Pipeline Kurulumu: Hızlı ve Güvenilir Yazılım Teslimatı

Abi şimdi bu CI/CD denen şey var ya, hani şu sürekli entegrasyon, sürekli teslimat işleri… Bazen düşünüyorum da, ne kadar hayatımızı kolaylaştırmış ama aynı zamanda ne kadar da kafa karıştırıcı olabiliyor, değil mi? Hani ilk duyduğumda böyle ‘Vay be, her şeyi otomatik yapıyorlar, süper!’ falan demiştim ama sonra işin içine girince anladım ki, bu işler öyle ‘al eline klavyeyi, tak fişi, çalışsın’ gibi değilmiş. Biraz uğraşmak, öğrenmek gerekiyor tabi ki.

Neticede, bu CI/CD pipeline’ını kurmak, bizim gibi yazılımcılar için artık bir lüks değil, bir gereklilik haline geldi. Düşünsene, yazdığın bir kodu test ediyorsun, beğeniyorsun, sonra onu canlıya almak için saatlerce manuel işlem yapıyorsun. Bir hata yaptın mı, eyvah! Bütün o işler boşa gidiyor. İşte tam da burada bu pipeline’lar devreye giriyor. Kodunu yazdın, commit’ledin, gerisini ona bırakıyorsun. Testler otomatik çalışıyor, bir sorun varsa sana haber veriyor, her şey yolundaysa da alıp canlıya yolluyor. Ne güzel değil mi?

Tabi bu olayın temelinde birkaç tane önemli adım var. Öncelikle, kodunu saklayacağın bir yer lazım. Git gibi bir versiyon kontrol sistemi mutlaka kullanman gerekiyor. Ondan sonra da bu kodları otomatik olarak derleyecek, test edecek ve dağıtacak bir araç bulacaksın. Jenkins, GitLab CI/CD, GitHub Actions gibi bir sürü seçenek var piyasada. Hangisi sana daha uygunsa onu seçiyorsun işte.

Aslında bu işin en can alıcı noktalarından biri de testler. Eğer testlerin yoksa, CI/CD pipeline’ı da olsa boş bir kutu gibi olur. Çünkü neyi kontrol edeceğini bilemezsin. Birim testleri, entegrasyon testleri, hatta belki uçtan uca testler… Bunların hepsi pipeline’ın bir parçası olmalı. Yoksa ‘otomatik dağıtım yapıyorum’ dersin ama aslında ‘otomatik olarak hatalı kodu canlıya yolluyorum’ demiş olursun. Bu da pek hoş olmaz sanırım.

Şimdi gelelim o kod örneğine. Diyelim ki basit bir C# projen var ve bunu bir CI/CD pipeline’ına oturtmak istiyorsun. Genelde ilk etapta bir `Dockerfile` oluşturup uygulamanı konteynerize edersin. Sonra da CI/CD aracında bu `Dockerfile`’ı kullanarak bir imajı build edip, testlerini çalıştırıp, başarılı olursa da bu imajı bir registry’ye (Docker Hub, Azure Container Registry gibi) push edersin.

Örneğin, basit bir ASP.NET Core projesi için ilk başta şöyle bir durumumuz olabilir:

// YANLIŞ (Basit ve eksik senaryo)

public class Startup { public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapGet("/", async context => await context.Response.WriteAsync("Merhaba CI/CD!")); }); } } 

Bu kod çalışır, evet. Ama neyi test ediyor? Hiçbir şeyi. Yani pipeline’da bu kodu derleyip çalıştırsan bile, aslında sağlamlığını falan kontrol etmiş olmuyorsun. Sadece ‘çalışıyor’ diyorsun, o kadar. Bu da pek güven vermez insana, değil mi?

Şimdi bunu biraz daha CI/CD dostu hale getirelim. Diyelim ki birim testleri ekledik. Hani şu `xUnit` veya `NUnit` gibi kütüphanelerle yazdığımız testler var ya. Onları da pipeline’a dahil edeceğiz. Yani kod build edildikten sonra, otomatik olarak bu testler çalışacak. Eğer bir tane bile test başarısız olursa, pipeline orada duracak ve sana haber verecek. Bu da bize hem zaman kazandırır hem de hataların canlıya gitmesini engeller. Düşünsene, bir testin başarısız olduğunu pipeline’dan anladığında ne kadar rahatlarsın. Gerçekten güzel değil mi?

Şöyle bir şey ekleyebiliriz mesela: Bir tane `HealthCheck` endpoint’i olsun. Bu endpoint’in görevi de uygulamanın sağlıklı olup olmadığını kontrol etmek. Pipeline’da bu endpoint’i çağırıp, sağlıklı dönüp dönmediğini kontrol edebiliriz. Bu, basit ama etkili bir yöntem sanırım. Hani şu “Uygulama ayakta mı?” sorusunun cevabını otomatik alıyoruz gibi düşünebilirsin.

İşte daha doğru bir yaklaşım şöyle olabilir:

// DOĞRU (Health Check Endpoint ile daha güvenli)

public static class HealthCheckExtensions { public static IEndpointConventionBuilder MapHealthCheck(this IEndpointRouteBuilder endpoints) { return endpoints.MapGet("/health", async context => { // Gerçek bir uygulamada buraya veritabanı bağlantısı, cache durumu gibi kontroller eklenir. // Şimdilik sadece 'OK' döndürüyoruz. await context.Response.WriteAsync("OK"); }); } } 

Bu eklediğimiz endpoint, pipeline’ın bir parçası olarak çağrılabilir. Mesela, `curl` komutuyla bu `/health` adresine istek atılır ve dönen cevaba bakılır. Eğer ‘OK’ değilse, pipeline durdurulur. Bu arada, bu küçük snippet’i daha da geliştirebilirsin tabi ki. Mesela veritabanı bağlantısını, dış servislerle olan iletişimi de kontrol ettirebilirsin.

Neticede, bu CI/CD olayını hayatımıza entegre etmek başta biraz göz korkutucu gelse de, uzun vadede bize inanılmaz fayda sağlıyor. Hataları erken yakalamak, sürekli olarak güncel ve sağlam bir kod tabanı tutmak, deploy süreçlerini otomatikleştirmek… Bunlar gerçekten paha biçilmez şeyler. Zaten CI/CD’nin faydaları üzerine bir sürü kaynak var, istersen biraz daha araştırabilirsin. Hani şu’>Google’da denk geldim, ilginçti.

Bu arada, bu kadar teknoloji konuşunca aklıma geldi, bazen en basit araçlar bile hayat kurtarabiliyor. Mesela ben bazen kendi yazdığım küçük script’lerle bile pipeline’ları tetikleyebiliyorum. Ya da bir bakmışsın, bir arkadaşım çok daha karmaşık bir çözümü çok basit bir şekilde anlatmış, ben de onu uyguluyorum. Yani işin sırrı bazen en basit çözümü bulmakta gizli galiba. İnanın ki, bu konuda sürekli öğrenmek ve denemek gerekiyor.

Sonuç olarak, CI/CD pipeline’ı kurmak, sadece bir araç kurmak değil, aynı zamanda bir geliştirme kültürü oluşturmak demek. Sürekli geri bildirim almak, hataları hızla düzeltmek ve kullanıcıya en iyi deneyimi sunmak için bu yapıları benimsemek şart.

Unutma, bu işler biraz sabır istiyor. İlk denemede her şey tıkır tıkır çalışmayabilir, hatta kendi programım sınıfta kaldı 🙂 Ama pes etmeyince, üzerine düştükçe öğreniyorsun işte. Bu arada, eğer takıldığın bir yer olursa veya farklı bir yaklaşımın varsa, ne bileyim, Reddit’te falan bir araştır derim, oralarda da güzel muhabbetler dönüyor.

Ne diyeyim, umarım bu küçük anlatım CI/CD dünyasına adım atmak isteyenler için faydalı olmuştur. Hadi bakalım, bol şans! 🙂

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.