CI/CD pipeline, mobil uygulama geliştirme sürecinde kod kalitesini artırmanın ve dağıtım süresini kısaltmanın en etkili yoludur. GitHub Actions ile Android ve iOS için otomatik derleme, test ve dağıtım işlemlerini tek bir platformda yönetebilirsiniz. Bu yazıda, sıfırdan bir pipeline kurulumu için gerekli adımları, dikkat edilmesi gereken noktaları ve işinizi kolaylaştıracak bir kontrol listesini bulacaksınız.
Pipeline Öncesi Gereksinimler
Pipeline'ınızı oluşturmadan önce aşağıdaki hazırlıkları tamamlamalısınız:
- GitHub Repository: Projenizi barındıran bir GitHub reposu.
- Platform Hesapları: Google Play Console (Android) ve Apple Developer (iOS) hesapları.
- Secrets ve Keys: Keystore, signing certificate, API anahtarları gibi hassas bilgileri GitHub Secrets'e ekleyin.
- Test Ortamı: UI testleri için fiziksel cihaz veya emulator/simulator hazırlığı. Espresso ve XCUITest ile test framework seçimine göz atın.
GitHub Actions ile CI/CD Pipeline Kurulum Adımları
1. Repository Secrets Oluşturma
Repository ayarlarından "Actions secrets and variables" bölümüne gidin. Aşağıdaki bilgileri ekleyin:
ANDROID_KEYSTORE_FILE(base64 ile kodlanmış keystore)ANDROID_KEYSTORE_PASSWORDANDROID_KEY_ALIASAPPLE_APP_SPECIFIC_PASSWORD(App Store Connect için)MATCH_PASSWORD(Fastlane Match kullanılıyorsa)
APK ve AAB imzalama için gereken bu bilgileri asla doğrudan kod içine yazmayın.
2. Workflow Dosyası Oluşturma
Reponuzda .github/workflows klasörü oluşturun ve deploy.yml dosyasını ekleyin. İşte temel bir yapı:
name: Deploy to App Stores
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
with:
java-version: '17'
- name: Build Android
run: ./gradlew assembleRelease
- name: Sign APK
uses: r0adkll/sign-android-release@v1
with:
releaseDirectory: app/build/outputs/apk/release
signingKeyBase64: ${{ secrets.ANDROID_KEYSTORE_FILE }}
alias: ${{ secrets.ANDROID_KEY_ALIAS }}
keyStorePassword: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
keyPassword: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
- name: Upload to Google Play
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJsonPlainText: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_JSON }}
packageName: com.example.app
releaseFiles: app/build/outputs/bundle/release/app-release.aab
track: internal
iOS için macOS runner kullanmanız ve Fastlane gibi araçlardan yararlanmanız gerekir.
3. Test Aşamasını Ekleme
Pipeline'a birim ve UI testlerini dahil edin. Android için ./gradlew test ve ./gradlew connectedCheck; iOS için xcodebuild test komutlarını kullanın. Testler başarısız olursa dağıtımı durdurmak için fail-fast seçeneğini aktif edin.
4. Otomatik Dağıtım
Derleme başarılı olduktan sonra Google Play ve App Store'a gönderim yapın. Android için r0adkll/upload-google-play action'ı, iOS için ise AppleActions/upload-to-app-store veya Fastlane entegrasyonu kullanabilirsiniz. Dağıtım öncesi manuel onay almak için environment kilidi ekleyin.
Kontrol Listesi (Checklist)
- ☐ GitHub repository oluşturuldu ve korumalı branch ayarlandı.
- ☐ Tüm secret'lar (keystore, sertifika, API anahtarları) eklendi.
- ☐ Derleme komutları (Gradle/Xcode) sorunsuz çalışıyor.
- ☐ Birim testleri ve UI testleri (Espresso/XCUITest) pipeline'a entegre edildi.
- ☐ İmzalama (Android signing, iOS distribution certificate) yapıldı.
- ☐ Google Play ve App Store bağlantıları test edildi.
- ☐ İlk dağıtım internal/canary track üzerinden yapıldı.
- ☐ Bildirimler (Slack, e-posta) eklendi.
Sık Yapılan Hatalar ve Çözümleri
- Keystore hatası: Base64 kodlaması yapılırken dosya bozulabilir.
base64 -w0 keystore.jkskomutunu kullanın ve secret'a ekleyin. - iOS sertifika süresi: Apple geliştirici sertifikaları 1 yıl geçerlidir. Süre dolduğunda pipeline başarısız olur - takvim hatırlatıcısı ekleyin.
- Runner uyumsuzluğu: iOS derlemesi macOS gerektirir.
runs-on: macos-latestkullanın ve Xcode sürümünü belirtin. - Test bağımlılıkları: Emulator/simulator olmadan UI testleri çalışmaz. Android için
reactivecircus/android-emulator-runneraction'ını kullanın.
Cross-Platform Düşünenler İçin Ek İpuçları
React Native veya Flutter gibi cross-platform framework'ler kullanıyorsanız, React Native vs Flutter karşılaştırmasını inceleyin. Her iki framework de GitHub Actions için hazır action'lar sunar: expo/expo-github-action (React Native) veya subosito/flutter-action (Flutter). Ayrıca SwiftUI vs Jetpack Compose kararınız da pipeline'da native build adımlarını etkileyebilir.
Sonraki Adımlar
Pipeline'ınızı sürekli iyileştirin: kod kalitesi taramaları (SonarQube), güvenlik taramaları (MobSF) ve performans testleri ekleyin. Ayrıca API güvenliği konusunda da API key veya OAuth tercihinizi pipeline'a yansıtabilirsiniz.
Unutmayın: CI/CD sadece bir araçtır, asıl amaç kaliteyi artırmak ve dağıtım süresini kısaltmaktır. Kontrol listenizi düzenli olarak güncelleyin ve otomasyonu kademeli olarak geliştirin.
Sık Sorulan Sorular
GitHub Actions ile CI/CD pipeline kurmak için ücretli bir hesap gerekli mi?
Hayır, GitHub Actions tüm GitHub kullanıcılarına aylık belirli bir kullanım kotası sunar. Android ve iOS derlemeleri için yeterli süre genellikle ücretsiz planda bulunur. Ancak iOS derlemeleri macOS runner gerektirdiği için daha fazla kredi tüketebilir.
iOS uygulamasını GitHub Actions üzerinden App Store'a nasıl yüklerim?
Fastlane ve Xcode ile entegre bir workflow oluşturmanız gerekir. macOS runner'da Xcode'u ayarlayıp, App Store Connect API anahtarını secret olarak ekleyin. Fastlane 'upload_to_app_store' action'ı ile dağıtımı gerçekleştirebilirsiniz.
Pipeline'da emulator/simulator olmadan UI testleri çalıştırabilir miyim?
Hayır, UI testleri için cihaz benzetimine ihtiyaç vardır. Android için GitHub Actions'ta 'reactivecircus/android-emulator-runner' gibi bir action ile emulator başlatabilirsiniz. iOS için macOS runner üzerinde Xcode'un simulator'ünü kullanabilirsiniz.
Keystore dosyasını GitHub Actions'a güvenli bir şekilde nasıl eklerim?
Keystore dosyasını base64 ile kodlayıp bir secret olarak ekleyin. Derleme adımında base64'ü çözerek imzalama işlemini yapabilirsiniz. Dosyayı doğrudan repoya eklemek güvenlik riski oluşturur.






