Sürekli entegrasyon: her kod değişikliğini otomatik doğrulamak
Sürekli entegrasyon, kod değişikliklerinin sık sık ortak koda eklenip her seferinde otomatik derleme ve testten geçirilmesidir. Akış, örnek ve yaygın hatalar.
Sürekli entegrasyon nedir?
Sürekli entegrasyon (continuous integration, CI), geliştiricilerin kod değişikliklerini küçük parçalar halinde ve sık sık ortak koda eklemesi, her eklemede de projenin otomatik olarak derlenip test edilmesi uygulamasıdır. Amaç, hataları değişiklik yapıldığı anda yakalamak ve ekibin kodunun her zaman çalışır durumda kalmasını sağlamaktır.
CI bir araçtan çok bir çalışma disiplinidir. Araç (Jenkins, GitHub Actions, GitLab CI gibi) bu disiplini otomatikleştirir; ama disiplinin özü, uzun süre ayrı dallarda yaşayan değişikliklerin sonradan acı verici birleşmelere dönüşmesini engellemektir.
Bir CI akışı nasıl çalışır?
Tipik akış, geliştirici değişikliğini versiyon kontrol sistemine gönderdiği anda başlar:
- Tetikleme: Bir gönderim (push) ya da birleştirme isteği (pull request) CI sunucusunu uyandırır.
- Ortam hazırlığı: Temiz bir çalıştırıcı ayağa kalkar, kod çekilir, bağımlılıklar kurulur.
- Derleme: Proje derlenir ya da paketlenir.
- Otomatik testler: Birim testleri ve gerekirse entegrasyon testleri çalışır.
- Kod kalitesi kontrolleri: Biçim denetimi, statik analiz ve güvenlik taramaları devreye girer.
- Geri bildirim: Sonuç, geliştiriciye ve birleştirme isteğine yeşil ya da kırmızı olarak döner.
Bu adımlar genellikle projeyle birlikte saklanan bir yapılandırma dosyasında tanımlanır. Böylece boru hattı da kod gibi sürümlenir ve incelenir.
Örnek: küçük bir değişikliğin yolculuğu
Örneğin bir geliştirici sipariş toplamını hesaplayan fonksiyonda indirim kuralını düzeltiyor olsun. Değişikliği yeni bir dalda yapar, yerelde testi çalıştırır ve birleştirme isteği açar. CI hemen devreye girer: bağımlılıkları kurar, projeyi derler, testleri koşar.
Bir test başarısız olursa birleştirme isteğinde kırmızı işaret görünür ve ekip ana koda hatalı bir değişiklik girmeden uyarılır. Geliştirici hatayı düzeltip yeniden gönderir, boru hattı yeniden çalışır. Her şey yeşil olduğunda ve kod incelemesi tamamlandığında değişiklik ana koda katılır. Burada kritik olan, geri bildirimin dakikalar içinde gelmesi ve geliştiricinin bağlamı henüz unutmamış olmasıdır.
CI, sürekli teslimat ve sürekli dağıtım farkı
Ölçüt: Kapsam. CI: kodu birleştirmek, derlemek ve test etmek. Sürekli teslimat (continuous delivery): doğrulanmış kodun her an yayına çıkarılabilir bir pakete dönüşmesi. Sürekli dağıtım (continuous deployment): bu paketin onay beklemeden otomatik olarak üretime çıkması.
Ölçüt: İnsan onayı. CI: birleştirme için kod incelemesi gerekebilir. Sürekli teslimat: üretime çıkış kararı insandadır. Sürekli dağıtım: testleri geçen her değişiklik doğrudan yayına gider.
Ölçüt: Başlangıç noktası. CI, bu zincirin ilk halkasıdır ve çoğu ekip önce onu oturtur. CI/CD kısaltması bu zincirin tamamını ifade eder.
CI'ı işe yarar kılan ilkeler
CI'ın değeri araca değil, ekibin onu nasıl kullandığına bağlıdır. Şu ilkeler boru hattının gerçekten güven ürettiği ekiplerde ortaktır.
- Sık birleştir: değişiklikler küçük ve kısa ömürlü olsun; ana kola en az günlük düzende katkı yapılsın.
- Derleme hızlı kalsın: yavaş bir boru hattı geliştiricilerin onu beklemeyip aşmasına yol açar. Uzun testler gerekiyorsa aşamalara bölünür ve paralel çalıştırılır.
- Kırık derleme öncelik taşır: ana kol kırmızıyken yeni iş eklenmez, önce düzeltilir.
- Testler güvenilir olsun: kimi zaman geçip kimi zaman kalan kararsız (flaky) testler ekibin sonuca olan güvenini bitirir.
- Herkes aynı ortamda doğrulansın: 'bende çalışıyordu' durumunu bitirmek için bağımlılıklar ve araç sürümleri sabitlenir, çoğu zaman konteyner kullanılır.
Sık yapılan hatalar
En yaygın hata, CI aracını kurup testleri yazmamaktır. Otomatik test yoksa boru hattı yalnızca derlemenin geçtiğini söyler ve yanlış güven verir. İkinci yaygın hata, uzun ömürlü dalları sürdürmektir; haftalarca birleşmeyen bir dal, entegrasyon sorununu sadece ertelemiş olur.
Boru hattını tek bir kişinin bilgisine bırakmak, sırları (parola, anahtar) yapılandırma dosyasına açık yazmak ve başarısız testleri geçici olarak kapatıp sonra unutmak da sık görülen sorunlardır. Çözümü basittir: boru hattı yapılandırması ekibin ortak kod tabanında durur, sırlar araç içindeki güvenli depolamada tutulur ve kapatılan her test bir iş kaydıyla izlenir.
Mindset programlarında sürekli entegrasyon
'CI/CD Pipeline Tasarımı (GitHub Actions)' programı sürekli entegrasyon boru hattını, konteyner ve imaj yönetimini ve çok ortamlı dağıtımı uygulamalı işler; boru hattını kuran DevOps ve platform mühendisleri için uygundur. 'DevOps Temelleri' sürekli entegrasyonu kültür ve izleme bağlamıyla tanıtır, 'SAFe DevOps Practitioner' ise ölçekli çevik ortamlarda kod kalitesi ve sürekli dağıtım başlıklarına odaklanır.
'AWS DevOps Engineer Professional Hazırlık' programında sürekli entegrasyon ve yapı süreçleri ayrı bir modüldür; bulut tabanlı boru hatlarını sertifika hedefiyle çalışmak isteyen ekipler için yönlendirici olabilir.
İlgili Mindset programı
CI/CD Pipeline Tasarımı (GitHub Actions)
Sık sorulan sorular
Ana dalda derleme ya da test bozulursa ne yapılır?
Kırık derleme önceliklidir: yeni birleştirmeler durur, sorumlu ekip değişikliği ya da hızlı bir düzeltmeyi geri alır, ana dal yeniden yeşile dönene kadar başka iş birleştirilmez. Kuralın amacı, bozuk bir ana dalın herkesin çalışmasını yavaşlatmasını önlemektir. Başarısız testin nedeni kayıtlardan okunur ve tekrarını önleyecek bir kontrol eklenir.
CI için hangi araçlar kullanılır?
Yaygın örnekler arasında GitHub Actions, GitLab CI, Jenkins ve bulut sağlayıcılarının kendi boru hattı hizmetleri vardır. Hangisinin seçileceği genellikle kodun nerede tutulduğuna, ekibin mevcut altyapısına ve güvenlik gereksinimlerine bağlıdır. Hepsinin ortak noktası, boru hattının yapılandırma dosyasıyla tanımlanması ve çalıştırıcıların temiz ortamda iş yapmasıdır.
Testi olmayan bir projede CI faydalı olur mu?
Sınırlı olur. Yalnızca derleme ve biçim kontrolü yapılabilir, bu da yalnızca bazı hataları yakalar ve davranış bozulmalarını görmez. Asıl değer otomatik testlerle gelir. Bu yüzden CI'a başlarken en kritik iş akışlarına birkaç güvenilir test eklemek, boru hattının kendisini kurmak kadar önemlidir.
Sürekli entegrasyon yalnızca yazılımcıları mı ilgilendirir?
Doğrudan uygulayanlar geliştiriciler ve DevOps mühendisleridir, fakat sonuçlar ürün yöneticilerini ve test ekiplerini de etkiler. Yayın sıklığı, hata geri bildirim süresi ve kalite görünürlüğü CI düzeninden beslenir. Veri bilimi ve altyapı ekipleri de model ve altyapı kodu için aynı yaklaşımı kullanır.