Continuous Integration (CI), her ekip üyesinin değişikliklerini günde en az bir kez paylaşılan depoya entegre ettiği ve her entegrasyonun otomatik derleme ve testlerle doğrulandığı bir geliştirme pratiğidir. CI, kod çakışmalarını ve gerileme hatalarını erken aşamalarda tespit ederek düzeltme maliyetini azaltır. Puppet State of DevOps Report, 2025'e göre, CI kullanan ekipler, otomasyon kullanmayan ekiplere göre hataları 4 kat daha hızlı düzeltiyor.
Önemli Noktalar
Continuous Integration (CI), birden fazla katılımcının kodunu tek bir kod tabanına entegre etme sürecini otomatikleştiren bir geliştirme metodolojisidir. Terim, 2000'lerin başında Martin Fowler tarafından “entegrasyon cehennemi”ni önlemek için bir dizi pratik olarak tanıtıldı — geliştiricilerin haftalarca izole çalıştığı ve değişiklikleri birleştirirken sayısız çakışmanın ortaya çıktığı ve manuel çözümün günler aldığı bir durum.
CI olmadan, bir geliştirici bir özelliği bitirir, değişikliklerini main dalına birleştirmeye çalışır ve meslektaşlarının aynı dosyaları değiştirdiğini fark eder. Çakışmaları çözmek saatler alır ve genellikle çalışan kodu bozar. CI bu sorunu günde birkaç kez entegrasyonu zorunlu kılarak çözer: entegrasyon ne kadar sık olursa, çakışmalar o kadar az ve çözümleri o kadar kolay olur. Uygulama, günlük entegrasyonda çakışma çözümünün dakikalar sürdüğünü, haftalık entegrasyonda ise saatler sürdüğünü göstermektedir.
IBM Systems Sciences Institute'a göre, kodlama aşamasında bir hatayı düzeltme maliyeti 25 dolar, test aşamasında 100 dolar ve üretim aşamasında 2.500 dolardır. CI, hata tespitini mümkün olduğunca sola kaydırır (shift left) ve düzeltmenin neredeyse ücretsiz olduğu commit aşamasında hataları bulur. CI kullanan ekipler, hata ayıklamaya ortalama %15 zaman harcarken, CI kullanmayan ekipler %35 zaman harcar.
Martin Fowler, teknoloji yığınından bağımsız olarak geçerli kalan temel CI pratiklerini tanımladı. Bu ilkelere uymak, CI'ın bürokratik bir yük haline gelmek yerine değer getirmesini sağlar. Mobil geliştirme ek gereksinimler getirir, ancak çekirdek değişmez.
Tüm proje kodu, birleşik bir sürüm kontrol sistemi (Git) ile tek bir depoda saklanır. Tek gerçek kaynağı, bir özelliğin çatalda geliştirildiği ve haftalarca ana kod tabanıyla senkronize edilmediği durumu ortadan kaldırır. Mobil projelerde bu, Android, iOS ve backend parçalarının tek bir depoda (monorepo) veya paylaşılan bir sürümleme şemasına sahip ayrı depolarda bulunabileceği anlamına gelir.
Proje derlemesi tek bir komutla çalıştırılabilir olmalıdır. Android için bu ./gradlew assembleDebug, iOS için — xcodebuild veya fastlane build'dir. Derleme betiği tekrarlanabilirliği doğrular: CI sunucusundaki derleme, geliştiricinin makinesindekiyle aynı sonucu üretmelidir. Ortamdaki farklılıklar, konteynerizasyon veya IaC (Infrastructure as Code) ile giderilir.
Derlemeden sonra, tüm test seviyeleri yürütülür: birim, entegrasyon ve UI. Testler başarısız olursa, commit geçersiz sayılır. Yeşil durumu korumak ekibin ortak sorumluluğudur. Mobil projelerde, hızlı testler (commit başına 5 dakika içinde yürütülen) genellikle yavaş testlerden (gerçek cihazlarda UI testleri, daha seyrek çalıştırılan) ayrılır.
// CI dostu raporla birim testi örneği
class LoginViewModelTest {
private val repository = mock<AuthRepository>()
private val viewModel = LoginViewModel(repository)
@Test
fun loginWithValidCredentials_success() {
val email = "test@example.com"
val password = "ValidPass123"
whenever(repository.login(email, password))
.thenReturn(Result.success(User("token-xyz")))
val result = viewModel.login(email, password)
assertEquals(LoginState.Success, result)
verify(repository).login(email, password)
}
}
CI sonuçları tüm ekip için açıktır: herkes hangi commit'in derlemeyi bozduğunu görebilir. Şeffaflık, hesap verebilirlik kültürü yaratır: geliştiriciler push'tan önce değişikliklerini kontrol eder ve bozuk derlemeyi sıra beklemeden düzeltir. CI sunucusu, derleme durumu değiştiğinde Slack veya Telegram'a bildirim gönderir.
Eksiksiz bir CI sistemi, birbiriyle etkileşime giren birkaç bileşenden oluşur. Her bileşen, tetiklemeden rapora kadar boru hattının kendi kısmından sorumludur. CI mimarisini anlamak, sorunları teşhis etmeye ve performansı optimize etmeye yardımcı olur.
Derleme kuyruğunu, kaynak tahsisini ve sonuç yayınlamayı yöneten merkezi bileşen. Bir CI sunucusu bulut tabanlı (GitHub Actions, GitLab CI, CircleCI) veya kendi barındırılan (Jenkins, TeamCity) olabilir. Sunucu, webhook veya polling yoluyla depodaki değişiklikleri izler ve her push veya pull request'te boru hattını tetikler.
Runner'lar, derleme görevlerini yürüten sanal veya fiziksel makinelerdir. Bulut CI'da runner'lar sağlayıcı tarafından sağlanır ve kullanım süresine göre faturalandırılır. Kendi barındırılan runner'lar kendi altyapınıza kurulur ve bakım gerektirir. iOS derlemeleri macOS runner'ları, Android derlemeleri Linux veya Windows gerektirir.
Derlemeden sonra CI sistemi yapıtları (APK, IPA, test raporları) depolamaya kaydeder — bunlar indirme ve dağıtım için kullanılabilir. Çalıştırmalar arasında bağımlılık önbelleğe alma (Gradle önbelleği, CocoaPods önbelleği) sonraki derlemeleri 3–5 kat hızlandırır.
| Bileşen | Amaç | Örnek |
|---|---|---|
| CI Sunucusu | Derleme orkestrasyonu | Jenkins, GitHub Actions |
| Runner | Görev yürütme | iOS için macOS runner |
| Depo | Kod depolama | GitHub, GitLab |
| Yapıt Depolama | Yapıt depolama | AWS S3, Artifactory |
| Bildirim | Ekip bildirimi | Slack, Telegram, e-posta |
Mobil geliştirme, web veya backend projelerinden farklı olarak CI için özel gereksinimlere sahiptir. Uzun derleme süreleri (Android için 3–15 dakika, iOS için 5–20 dakika), birden çok yapıt türü (APK, AAB, IPA), imzalama ve karartma ihtiyacı — tüm bunlar özelleştirilmiş CI boru hattı yapılandırması gerektirir.
Android için tipik bir CI şunları içerir: linting (ktlint, detekt) ve statik analiz, JUnit ve MockK ile birim testleri, hata ayıklama ve sürüm APK/AAB derlemesi, CI içinde öykünücüde araçsal testler ve yapıt yayınlama. Gradle önbelleği tekrarlanan derlemeleri hızlandırır — onsuz her derleme bağımlılıkları sıfırdan indirir ve 3–5 dakika kaybeder.
iOS CI, Swift/Objective-C kodunu derlemek için bir macOS runner gerektirir. Boru hattı şunları içerir: CocoaPods veya SPM bağımlılıklarını kurma, stil kontrolü için SwiftLint, XCTest ile birim testleri, IPA derlemesi, Fastlane match ile kod imzalama ve TestFlight'a yükleme. Veri merkezindeki Mac mini veya Mac'te kendi barındırılan runner, bulut macOS runner'larına bir alternatiftir.
Flutter ve React Native, her iki platform için yerel derlemelere dönüştürülür. CI, iki runner'ı desteklemelidir: Android derlemeleri için Linux ve iOS derlemeleri için macOS. En uygun strateji, bölünmüş bir boru hattıdır: Linux runner'da Android derlemesi, macOS runner'da iOS derlemesi, ardından her iki yapıt tek bir sürümde birleştirilir.
CI aracı seçimi, ekip büyüklüğüne, gerekli performansa, bütçeye ve teknoloji yığınına bağlıdır. Aşağıda, mobil geliştirmeye odaklanan popüler çözümlerin bir karşılaştırması bulunmaktadır. Kendi barındırılan çözümler kontrol sağlar ancak yönetim gerektirir; bulut çözümleri rahatlık sağlar ancak yapılandırmayı sınırlar.
Herkese açık depolar için ücretsiz (ayda 2000 dakika). GitHub Actions, Android (gradle/actions) ve iOS (apple-actions) için hazır eylemler ekosistemi sunar. Dezavantajı, macOS runner'ların yalnızca ücretli planlarda kullanılabilmesidir. Açık kaynak ve halihazırda GitHub kullanan küçük ekipler için idealdir.
Kendi barındırılan açık kaynaklı bir CI sunucusu. Jenkins, Groovy Pipeline aracılığıyla yapılandırılır, yüzlerce eklentiyi destekler ve herhangi bir donanımda çalışır. Kurulum ve bakım için bir DevOps mühendisi gerektirir. Altyapı kontrolünün kritik olduğu kurumsal segmentte popülerdir.
Açık runner mimarisiyle GitLab'da yerleşik CI/CD. GitLab CI, ücretsiz planda kendi runner'larınızı (macOS dahil) kullanmanıza izin verir. YAML yapılandırması GitHub Actions'dan daha güçlüdür ancak öğrenmesi daha zordur. GitLab'ı tek bir DevOps platformu olarak kullanan ekipler için uygundur.
Hıza odaklanan bir bulut CI. CircleCI, Docker, macOS ve Android görüntülerini destekler ve bağımlılıkları otomatik olarak önbelleğe alır. Fiyatlandırma kredi tabanlıdır — küçük ekipler için GitHub Actions'dan daha pahalıdır ancak optimize edilmiş runner'lar sayesinde daha hızlıdır. Hız gereksinimleri olan üretim projeleri için önerilir.
GitHub Actions kullanarak bir Android projesi için CI kurulumunu inceleyelim. Boru hattı, main dalına her push ve pull request'te statik analiz, derleme ve test gerçekleştirir. Minimum yapılandırma 15 dakika sürer ve harici hizmet gerektirmez.
name: Android CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
java-version: 17
distribution: temurin
- run: ./gradlew ktlintCheck detekt
unit-tests:
needs: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
java-version: 17
distribution: temurin
- uses: gradle/actions/setup-gradle@v4
- run: ./gradlew testDebugUnitTest
- uses: actions/upload-artifact@v4
with:
name: test-results
path: app/build/reports/tests/
Boru hattı iki paralel işten oluşur: lint (statik analiz gerçekleştirir) ve unit-tests (lint'a bağlıdır — linting başarısız olursa testler çalışmaz). unit-tests işi, test raporunu bir yapıt olarak yükler — ekip, dosyaları yerel olarak indirmeden GitHub Actions arayüzünde inceleyebilir.
Önemsiz hatalar nedeniyle CI başarısızlıklarını önlemek için Git'te bir pre-push hook veya aynı kontrolleri yerel olarak çalıştıran bir Gradle görevi ayarlayın. Örneğin: ./gradlew ktlintCheck detekt testDebugUnitTest. Yerel kontroller 3 dakikadan fazla sürüyorsa, bunları hızlı (lint aracı) ve yavaş (testler) olarak ayırın, hızlı kontrolleri her commit'ten önce, yavaş kontrolleri yalnızca push'tan önce çalıştırın.
Sıkça Sorulan Sorular
CI, kod entegrasyonu ve doğrulamasına (derleme + testler) odaklanırken, CD dağıtım otomasyonunu ekler. CI, kodun doğru olduğunu doğrular; CD, bu doğru kodun kullanıcılara teslim edilebilmesini sağlar. CI, CD için bir ön koşuldur ancak CD, CI olmadan çalışmaz.
Minimum sıklık, geliştirici başına günde bir kezdir. İdeal uygulama, her tamamlanan mantıksal çalışma biriminde (her 1–4 saatte bir) depoya push yapmaktır. Entegrasyon ne kadar sık olursa, çakışmalar o kadar az ve çözümleri o kadar kolay olur. Entegrasyonlar arasında 2 günden fazla süre geçiyorsa, CI kullanmıyorsunuz demektir.
Android için GitHub Actions (ücretsiz, kurulumu kolay) veya GitLab CI (kendi runner'ları) idealdir. iOS için CircleCI (en iyi macOS desteği) veya Bitrise (mobil projeler için özel CI). Platformlar arası projeler için iki runner (Linux + macOS) ile GitLab CI.
Evet, ancak bazı uyarılarla. UI testleri yavaştır (10–30 dakika) ve kararsızdır (flaky). En uygun strateji: her push'ta hızlı testleri (birim + entegrasyon) çalıştırın ve UI testlerini pull request'lerde, gece veya sürümden önce çalıştırın. UI testleri için CI'da Device Farm veya öykünücüler kullanın.
Etkili CI metrikleri: derleme süresi 15 dakikadan az, yeşil derleme yüzdesi %85'in üzerinde, başarısızlık sonrası ortalama kurtarma süresi 30 dakikadan az. Derleme sık sık başarısız oluyorsa, CI yardımcı olmuyor, engelliyordur. Testleri gözden geçirin: kararsız testleri kaldırın, bağımlılıkları optimize edin, derleme süresini azaltın.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun