← Tüm yazılar

CI/CD nedir ve neden her ekibin buna ihtiyacı var?

Burncode Team 3 dk okuma

CI/CD tek bir moda kelime gibi ortalıkta dolaşıyor, ama aslında birbirine yapıştırılmış iki ayrı fikirden oluşuyor: sürekli entegrasyon (continuous integration) ve sürekli teslimat (continuous delivery; ya da sürekli dağıtım). İkisini ayrı ayrı anlamak, konuyu çok daha somut hâle getirir.

Sürekli entegrasyon, kodu sık sık (haftada bir değil, günde birkaç kez) birleştirmek ve biri her değişiklik gönderdiğinde otomatik bir derleme ve test paketi çalıştırmakla ilgilidir. Amaç sıklığın kendisi değildir. Asıl mesele şu: Küçük ve sık birleştirmeleri anlamak kolaydır; üç haftadır main'den uzaklaşan devasa bir branch ise patlamaya hazır bir merge çakışmasıdır. CI; çakışmayı, bozulan testi ya da dikkatsizlikle yapılmış bir yazım hatasını, kimsenin o satırın neden orada olduğunu hatırlamadığı iki hafta sonra değil, ortaya çıktığı birkaç dakika içinde yakalar.

Sürekli teslimat bunu bir adım ileri taşır: Kod CI'dan geçtiğinde otomatik olarak paketlenir ve yayına hazır hâle getirilir; bazen bir staging ortamına, bazen doğrudan canlı ortama kadar. Sürekli dağıtım (continuous deployment) ise daha iddialı sürümdür: Tüm otomatik kontrollerden geçen kod, hiçbir insanın bir butona tıklamasına gerek kalmadan canlıya alınır. Çoğu ekip ikisinin arasında bir yerde konumlanır: Staging'e kadar otomatik, canlı ortamdan önce manuel onay.

Gerçek bir hat gerçekte ne yapar?

CI/CD hattı, kod her değiştiğinde çalışan otomatik adımlar dizisinden ibarettir. Tipik bir hat kabaca şöyle görünür:

  • Yeni kodu çek ve bağımlılıkları yükle
  • Bariz hataları hızla yakalamak için linter'ları ve statik analizi çalıştır
  • Otomatik test paketini çalıştır: önce maliyeti düşük olduğu için birim testleri, ardından daha yavaş entegrasyon testleri
  • Dağıtılabilir çıktıyı (artifact) derle: bir Docker imajı, derlenmiş bir binary, statik bir site paketi
  • Bunu bir staging ya da canlı ortama dağıt
  • Sistemin gerçekten sağlıklı biçimde ayağa kalktığını doğrulamak için canlıdaki dağıtıma karşı bir smoke test çalıştır

Herhangi bir adımdaki herhangi bir hata hattı durdurur ve değişikliği gönderen kişiyi bilgilendirir. Bütün sır bu: Testleri çalıştırmayı, derlemeyi ve dağıtımı her seferinde doğru ve sırasıyla yapmayı bir insanın hatırlaması yerine, bir makine bunu her seferinde aynı şekilde yapar.

Bu neden sanıldığından daha önemli?

CI/CD olmadan dağıtımlar birer olaya dönüşür. Biri bir “dağıtım günü” planlar, herkes biraz gerilir ve bir şey bozulursa, son dağıtımdan bu yana yapılan yirmi değişiklikten hangisinin buna yol açtığını bulmak tam bir işkencedir. CI/CD ile her değişiklik küçüktür, tek başına test edilir ve kendi başına canlıya alınır. Böylece bir şey bozulduğunda, bunu hangi beş satırlık değişikliğin yaptığını tam olarak bilirsiniz; çünkü yayına giden tek şey odur.

Ayrıca belirli bir tür insan hatasını da ortadan kaldırır: Bir mühendisin dizüstü bilgisayarında çalışıp ince bir ortam farkı yüzünden canlıda çalışmayan dağıtım ya da birinin önce migration'ları çalıştırmayı unuttuğu sürüm. Bir hat her seferinde aynı adımları aynı sırayla çalıştırır; böylece “Ben elle yaptığımda çalışmıştı” cümlesi, canlı ortamın neden alev aldığına dair geçerli bir açıklama olmaktan çıkar.

Ekiplerin yanıldığı noktalar

En yaygın hata CI/CD'yi tamamen atlamak değildir; çoğu ekibin artık bir şekilde bir hattı var. Asıl hata, hatta iliştirilmiş zayıf ve güvenilmez bir test paketine sahip olmaktır; öyle ki “testler geçti” aslında pek bir şey ifade etmez. Gerçek hataları yakalamayan yeşil bir hat, hiç hat olmamasından daha kötüdür, çünkü sahte bir güven yaratır. Diğer yaygın hata ise çalışması kırk dakika süren bir hattır; bu, mühendisleri sessizce değişiklikleri biriktirmeye ve daha seyrek birleştirmeye iter ve sürekli entegrasyonun bütün amacını boşa çıkarır.

CI/CD'yi doğru kurmak, seçtiğiniz araçtan (GitHub Actions, GitLab CI, Jenkins, CircleCI'ın hepsi yeterince yetenekli) çok; hızlı ve güvenilir testlere gerçekten yatırım yapmak ve hattın kendisini, insanların etrafından dolaşmak yerine ona güveneceği kadar basit tutmakla ilgilidir.

Bu, Burncode'da yürüttüğümüz altyapı çalışmalarının temel bir parçasıdır: Mühendislerin gerçekten güvenebileceği kadar hızlı CI/CD hatları kurmak ve hattın kendisinin yakalayamadığı hataları yakalayacak izlemeyi de devreye almak.