CI/CD Nedir? Sürekli Entegrasyon ve Sürekli Dağıtım Kavramları Sade Bir Dille

CI/CD nedir, Sürekli Entegrasyon ile Sürekli Dağıtım arasındaki fark ve pipeline aşamaları sade bir dille örneklerle anlatılıyor.

Yazı boyutu
CI/CD Nedir? Sürekli Entegrasyon ve Sürekli Dağıtım Kavramları Sade Bir Dille

Fotoğraf: ThisIsEngineering / Pexels

Bir bakışta

  • CI/CD, kod entegrasyonu ve dağıtım süreçlerini otomatikleştirerek hataları erken yakalamayı sağlar.
  • Sürekli Teslim son adımda onay gerektirirken, Sürekli Dağıtım her şeyi otomatik olarak canlıya taşır.
  • Pipeline; kod gönderimi, build alma, otomatik test ve dağıtım aşamalarından oluşan bir zincirdir.

CI/CD Nedir? Kısaca Tanıyalım

Yazılım geliştirme dünyasında sıkça karşılaşılan kısaltmalardan biri CI/CD'dir. CI, "Continuous Integration" yani "Sürekli Entegrasyon" anlamına gelir; CD ise bağlama göre "Continuous Delivery" (Sürekli Teslim) veya "Continuous Deployment" (Sürekli Dağıtım) olarak açılır.

Bu kavramların modern yazılım geliştirmede bu kadar öne çıkmasının nedeni aslında oldukça basit: yazılım projeleri büyüdükçe, birden fazla geliştirici aynı kod tabanı üzerinde çalıştıkça, elle yapılan test ve dağıtım süreçleri hem yorucu hem de hataya açık hale geliyor. CI/CD, bu süreçleri otomatikleştirerek geliştiricilerin asıl işine, yani kod yazmaya odaklanmasını amaçlıyor.

Bu yazıda önce CI'ın ne anlama geldiğine, ardından CD'nin CI'dan farkına bakacağız. Sonra tipik bir CI/CD hattının aşamalarını, versiyon kontrol sistemleriyle ilişkisini ve otomatik testlerin bu süreçteki yerini ele alacağız. Son olarak basit bir senaryo üzerinden akışı somutlaştırıp, uygularken nelere dikkat edilmesi gerektiğinden bahsedeceğiz.

Sürekli Entegrasyon (CI): Kod Değişikliklerini Sık Sık Birleştirmek

Bir ekip düşünün: birden fazla geliştirici aynı proje üzerinde çalışıyor, her biri kendi bilgisayarında farklı özellikler ekliyor. Eğer bu geliştiriciler yazdıkları kodu haftalarca kendi bilgisayarlarında tutup en sonunda tek seferde ortak depoya (repository) gönderirse, o gönderim anında büyük bir kaos yaşanabilir. Farklı kişilerin yaptığı değişiklikler birbiriyle çakışabilir, kim neyi ne zaman değiştirdi anlaşılamaz hale gelebilir. Bu duruma günlük dilde bazen "entegrasyon cehennemi" denir; çünkü parçaları bir araya getirmek, her birini ayrı ayrı yazmaktan çok daha zor bir hal alır.

Sürekli Entegrasyon (CI), tam olarak bu sorunu çözmeyi hedefler. Mantık şudur: geliştiriciler kod değişikliklerini küçük parçalar halinde, gün içinde defalarca ortak depoya gönderir. Her gönderim yapıldığında, sistem otomatik olarak devreye girer; kodu derler (build alır) ve önceden yazılmış testleri çalıştırır. Eğer bir sorun varsa, bu durum saatler ya da günler sonra değil, gönderimden hemen sonra fark edilir.

Bu yaklaşımın en büyük kazancı, hataların küçükken ve kaynağı belliyken yakalanmasıdır. Bir geliştirici sabah gönderdiği kodda bir hata yaptıysa, öğleden önce bunu öğrenip düzeltebilir; bu hata haftalarca fark edilmeden kalıp başka kodların üzerine inşa edilmez.

Sürekli Teslim ve Sürekli Dağıtım (CD): Kod Nasıl Canlıya Ulaşır?

CI, kodun doğru şekilde birleştirilip test edilmesini sağlar. Ama iş burada bitmez: test edilen kodun bir şekilde kullanıcıya ulaşması gerekir. İşte CD kısaltması burada devreye girer ve aslında iki farklı anlamda kullanılabilir.

Sürekli Teslim (Continuous Delivery), testlerden geçen kodun otomatik olarak bir test ortamına veya "canlıya çıkmaya hazır" bir noktaya kadar getirilmesi anlamına gelir. Ancak son adımda, yani gerçek kullanıcıların erişeceği canlı ortama alınması genellikle bir kişinin onayına bırakılır. Yani sistem her şeyi hazırlar, düğmeye basmak insana kalır.

Sürekli Dağıtım (Continuous Deployment) ise bir adım daha ileri gider: testlerden başarıyla geçen her değişiklik, insan onayı beklemeden otomatik olarak canlı ortama aktarılır. Bu, daha fazla otomasyona ve testlere duyulan daha yüksek güvene dayanan bir yaklaşımdır.

İkisi arasındaki fark küçük gibi görünse de önemlidir: biri son adımda bir kontrol noktası bırakır, diğeri tamamen otomatik akar. Her iki durumda da CD, CI'ın doğal bir devamıdır; CI kodu doğrularken, CD o doğrulanmış kodu kullanıcıya ulaştırma işini üstlenir.

CI/CD Neden Bu Kadar Önemli? Pratik Faydaları

CI/CD'nin sağladığı faydaları günlük geliştirme hayatına indirgediğimizde şunları görürüz:

  • Hataların erken yakalanması: Kod her gönderildiğinde otomatik testler çalıştığı için, bir hata kod tabanının derinliklerine gömülmeden fark edilir.
  • Manuel iş yükünün azalması: Elle build almak, elle test etmek, elle sunucuya kopyalamak gibi tekrarlayan işler otomatikleştiği için geliştiriciler zaman kazanır.
  • Daha sık ve güvenli sürüm çıkarma: Küçük değişiklikler sık sık ve güvenle canlıya alınabildiği için, aylarda bir çıkan büyük ve riskli sürümler yerine küçük, kontrollü güncellemeler tercih edilebilir.
  • Ekip içi güven ve şeffaflık: Herkes, ortak depodaki kodun sürekli test edildiğini ve çalışır durumda olduğunu bilir; bu da ekip içinde bir güven ortamı oluşturur.

Tipik Bir CI/CD Hattı (Pipeline) Nasıl İşler?

CI/CD sürecinin işlediği otomatik adımlar dizisine genellikle "pipeline" (hat) denir. Tipik bir pipeline şu aşamalardan oluşur:

  1. Kod gönderimi (commit/push): Geliştirici, yaptığı değişikliği versiyon kontrol sistemindeki ortak depoya gönderir.
  2. Otomatik build alma: Sistem, gönderilen kodu otomatik olarak derler veya çalıştırılabilir hale getirir. Bu aşamada temel sözdizimi hataları ya da bağımlılık sorunları ortaya çıkabilir.
  3. Otomatik test çalıştırma: Build başarılıysa, önceden hazırlanmış testler otomatik olarak çalıştırılır. Testler kodun beklenen şekilde davranıp davranmadığını kontrol eder.
  4. Dağıtım (deployment): Testler başarılıysa, kod bir test ortamına veya (CD'nin türüne göre) doğrudan canlı ortama aktarılır.

Bu aşamalar genellikle sırayla ve otomatik olarak tetiklenir; bir geliştiricinin tek yapması gereken kodu göndermektir, gerisini pipeline üstlenir. Herhangi bir aşamada bir sorun çıkarsa, süreç orada durur ve ilgili kişiye bildirim gider.

Versiyon Kontrol Sistemleri ve CI/CD İlişkisi

CI/CD'nin çalışabilmesi için bir başlangıç noktasına ihtiyaç vardır: kodun nerede tutulduğu ve değişikliklerin nasıl takip edildiği. İşte burada Git gibi versiyon kontrol sistemleri devreye girer. Versiyon kontrol sistemleri, CI/CD için adeta temel altyapıyı oluşturur; çünkü pipeline'ı tetikleyen olay genellikle "depoya yeni bir kod gönderildi" bilgisidir.

Ekiplerin kullandığı dal (branch) stratejileri de bu ilişkide önemli rol oynar. Örneğin bazı ekipler, ana dal (main/master) her güncellendiğinde otomatik olarak pipeline'ı tetikler; bazıları ise ayrı özellik dallarında (feature branch) çalışıp, bu dallar ana dala birleştirilmeden önce testlerin geçmesini şart koşar.

CI/CD araçlarının versiyon kontrol sistemleriyle entegre çalışmasının nedeni de tam olarak budur: pipeline'ın "ne zaman" çalışacağını belirleyen sinyal, versiyon kontrol sisteminden gelir. Bu iki kavram birbirinden bağımsız düşünülemez; CI/CD, versiyon kontrolü olmadan pratikte anlamını büyük ölçüde yitirir.

Otomatik Testlerin Pipeline İçindeki Rolü

CI/CD'nin güvenilirliği, büyük ölçüde otomatik testlerin kalitesine bağlıdır. Pipeline içinde genellikle birkaç farklı test türü yer alır:

  • Birim testleri (unit test): Kodun en küçük parçalarını (örneğin tek bir fonksiyonu) izole şekilde test eder. Hızlı çalıştıkları için pipeline'ın en başında yer alırlar.
  • Entegrasyon testleri: Farklı parçaların (örneğin bir fonksiyon ile bir veritabanı bağlantısının) birlikte doğru çalışıp çalışmadığını kontrol eder.

Bu testlerden biri başarısız olduğunda, pipeline genellikle orada durur ve kodun bir sonraki aşamaya (örneğin dağıtıma) geçmesine izin vermez. Bu, hatalı bir kodun yanlışlıkla canlı ortama ulaşmasını engelleyen kritik bir güvenlik katmanıdır. Yani CI/CD, aslında yazılım testi pratiklerinin otomatik ve düzenli şekilde uygulanmasının bir çerçevesidir denebilir.

Basit Bir Senaryo Üzerinden CI/CD Akışı

Somutlaştırmak için isimsiz, genel bir senaryo düşünelim. Bir geliştirici, üzerinde çalıştığı bir özelliği tamamlar ve kodunu ortak depoya gönderir. Bu gönderim anında, CI/CD sistemi otomatik olarak devreye girer:

Önce kod otomatik olarak derlenir; herhangi bir sözdizimi hatası varsa süreç burada durur ve geliştiriciye bildirilir. Derleme başarılıysa, sırasıyla birim testleri ve entegrasyon testleri çalıştırılır. Tüm testler başarıyla geçerse, kod otomatik olarak bir test ortamına aktarılır; burada isteğe bağlı olarak ek kontroller yapılabilir. Ekibin tercih ettiği yaklaşıma göre, bu noktadan sonra ya bir yetkilinin onayıyla ya da tamamen otomatik şekilde kod canlı ortama taşınır.

Tüm bu süreç, geliştiricinin tek bir "gönder" işleminden sonra, insan müdahalesi olmadan (ya da minimum müdahaleyle) birkaç dakika içinde tamamlanabilir. Geliştirici, kodunu gönderdikten sonra farklı bir işe geçebilir; sonucu bir bildirimle öğrenir.

CI/CD'nin Getirdiği Kültürel Değişim

CI/CD sadece bir araç kurulumu meselesi değildir; aynı zamanda bir alışkanlık ve kültür değişikliği gerektirir. Bunun en belirgin göstergesi, küçük ve sık commit alışkanlığıdır. Bir geliştiricinin haftalarca sürecek büyük bir değişikliği tek seferde göndermesi yerine, işi küçük parçalara bölüp her parçayı ayrı ayrı ve sık sık göndermesi beklenir. Bu, hem entegrasyon sorunlarını azaltır hem de hataların kaynağını bulmayı kolaylaştırır.

Bunun yanında, ekipler arası iletişim ve sorumluluk paylaşımı da değişir. Kod artık tek bir kişinin bilgisayarında "gizli" kalmaz, sık sık ortak depoya aktarıldığı için herkes birbirinin çalışmasından haberdar olur. Bir testin bozulması durumunda bunu düzeltmek, sadece o kodu yazan kişinin değil, genellikle tüm ekibin önceliği haline gelir.

Bu nedenle CI/CD'yi yalnızca bir yazılım aracı olarak değil, ekip çalışma biçimini şekillendiren bir pratik olarak görmek daha doğru olur.

CI/CD Uygularken Dikkat Edilmesi Gerekenler

CI/CD'yi uygularken göz önünde bulundurulması gereken birkaç önemli nokta vardır.

Öncelikle, test kapsamının yeterliliği kritik önemdedir. Pipeline ne kadar hızlı ve otomatik çalışırsa çalışsın, eğer testler kodun önemli davranışlarını kapsamıyorsa, hatalı kod yine de testlerden geçip canlıya ulaşabilir. Bu yüzden CI/CD'nin gücü, büyük ölçüde arkasındaki testlerin kalitesiyle sınırlıdır.

İkinci olarak, pipeline karmaşıklığı zamanla artabilir. Proje büyüdükçe, daha fazla test aşaması, daha fazla ortam ve daha fazla kural eklenebilir. Bu karmaşıklık yönetilmezse, pipeline'ın kendisi bakımı zor bir yük haline gelebilir.

Bu nedenle, özellikle yeni başlayan ekipler için küçük başlayıp kademeli olarak genişletmek makul bir yaklaşımdır. Önce basit bir build ve temel testlerle başlanabilir, süreç oturdukça daha fazla test türü ve otomasyon eklenebilir.

Sonuç: CI/CD Yolculuğuna Nereden Başlamalı?

CI/CD, özünde kod değişikliklerinin sık sık birleştirilmesi (Sürekli Entegrasyon) ve bu değişikliklerin otomatik olarak test edilip kullanıcıya ulaştırılması (Sürekli Teslim/Dağıtım) fikrine dayanır. Bu yaklaşım, hataların erken yakalanmasını sağlar, manuel iş yükünü azaltır ve daha sık, daha güvenli sürüm çıkarmayı mümkün kılar.

Yeni başlayanlar için pratik bir ilk adım, önce versiyon kontrol alışkanlıklarını güçlendirmek olabilir: küçük, sık ve anlamlı commit'ler yapmak. Ardından basit bir otomatik build ve birkaç temel testle başlayıp, süreç zamanla genişletilebilir. CI/CD, bir gecede kurulup unutulan bir sistem değil, ekiple birlikte olgunlaşan bir pratiktir.

Kod Katmanı Editör Ekibi

Kodun özünü keşfetmek

Tüm yazıları

Sen ne düşünüyorsun?

Yorumlar onaylandıktan sonra yayınlanır. E-posta adresin yayınlanmaz.

Okumaya devam et

Tüm yazılar
Bülten

Haftanın fikirleri, gelen kutunda.

Teknoloji ve daha fazlası için hazırladığımız haftalık özeti kaçırma.