Bu doküman, sample_ci_cd_project projesinde kullanılan Flutter flavors yapılanmasını ve temel proje mimarisini açıklar.
- Genel Bakış
- Flavors Nedir?
- Projede Flavor Yapısı
- Flavor Tanımları
- Firebase Entegrasyonu
- Firebase Flavor Konfigürasyon Komutları
- Versiyonlama (pubspec.yaml)
- Build ve Çalıştırma Komutları
- App Distribution Script Kullanımı
- Ekstra Notlar
Bu projede CI/CD süreçleri ve çoklu ortam yönetimi için Flutter Flavors mimarisi kullanılmaktadır. Her ortam (dev, staging, prod) için ayrı uygulama adı, paket adı ve Firebase konfigürasyonu tanımlanmıştır.
Flavors, bir uygulamanın farklı ortamlar (ör. geliştirme, test, üretim) için farklı ayarlarla derlenmesini ve çalıştırılmasını sağlayan bir yapıdır. Her flavor, kendi uygulama adı, paket/bundle ID'si ve backend ayarlarına sahip olabilir.
- Yapılandırma dosyası:
flavorizr.yaml - Enum ve flavor yönetimi:
lib/flavors.dart - Ana giriş noktası:
lib/main.dart - Firebase ortam dosyaları:
lib/firebase_options_dev.dartlib/firebase_options_staging.dartlib/firebase_options_prod.dart
- Android flavor klasörleri:
android/app/src/dev,android/app/src/staging,android/app/src/prod - iOS flavor klasörleri:
ios/flavors/dev,ios/flavors/staging,ios/flavors/prod
flavorizr.yaml dosyasında tanımlı flavorlar:
flavors:
dev:
app:
name: "Dev-Sample-App"
android:
applicationId: "com.example.sample.dev"
ios:
bundleId: "com.example.sample.dev"
prod:
app:
name: "Prod-Sample-App"
android:
applicationId: "com.example.sample.prod"
ios:
bundleId: "com.example.sample.prod"
staging:
app:
name: "Staging-Sample-App"
android:
applicationId: "com.example.sample.staging"
ios:
bundleId: "com.example.sample.staging"Her flavor için ayrı Firebase projesi ve konfigürasyonu kullanılır.
Güvenlik Notu: Firebase konfigürasyon dosyaları güvenlik nedeniyle repository'den kaldırılmıştır:
lib/firebase_options_dev.dart(kaldırılmış - yeniden oluşturulmalı)lib/firebase_options_staging.dart(kaldırılmış - yeniden oluşturulmalı)lib/firebase_options_prod.dart(kaldırılmış - yeniden oluşturulmalı)
lib/init_firebase.dart dosyasında flavor'a göre doğru Firebase konfigürasyonu seçilir ve başlatılır.
Her flavor için FlutterFire CLI ile Firebase konfigürasyon dosyalarını oluşturmak için aşağıdaki komutları kullandım:
flutterfire config \
--project=dev-sample-app \
--out=lib/firebase_options_dev.dart \
--ios-bundle-id=com.example.sample.dev \
--ios-out=ios/flavors/dev/GoogleService-Info.plist \
--android-package-name=com.example.sample.dev \
--android-out=android/app/src/dev/google-services.jsonflutterfire config \
--project=prod-sample-app \
--out=lib/firebase_options_prod.dart \
--ios-bundle-id=com.example.sample.prod \
--ios-out=ios/flavors/prod/GoogleService-Info.plist \
--android-package-name=com.example.sample.prod \
--android-out=android/app/src/prod/google-services.jsonflutterfire config \
--project=staging-sample-app \
--out=lib/firebase_options_staging.dart \
--ios-bundle-id=com.example.sample.staging \
--ios-out=ios/flavors/staging/GoogleService-Info.plist \
--android-package-name=com.example.sample.staging \
--android-out=android/app/src/staging/google-services.jsonFlutter projelerinde versiyonlama, pubspec.yaml dosyasındaki version alanı ile yönetilir:
version: 1.0.0+5- Soldaki kısım (
1.0.0) versiyon numarasıdır (major.minor.patch) - Sağdaki kısım (
+5) ise build number'dır (her build için artan sayı)
- Major (1.x.x): Büyük, geriye dönük uyumsuz değişiklikler (ana özellik, mimari değişiklik)
- Minor (x.1.x): Yeni özellikler, geriye dönük uyumlu eklemeler
- Patch (x.x.1): Hata düzeltmeleri, küçük iyileştirmeler
- Build Number (+X): Her market/dağıtım build'inde artırılır
-
Dev ve Staging:
- Sık sık build alınır, genellikle sadece build number (
+X) artırılır - Versiyon numarası (1.0.0) sabit kalabilir, build number ile ayırt edilir
- Örnek:
1.0.0+15→1.0.0+16
- Sık sık build alınır, genellikle sadece build number (
-
Prod (Canlı/Release):
- Her yeni market sürümünde versiyon numarası (major/minor/patch) artırılır
- Build number da artırılır (App Store/Google Play zorunlu kılar)
- Örnek:
1.0.0+16→1.1.0+17veya2.0.0+18
- App Store ve Google Play'e yüklerken build number her zaman bir önceki sürümden büyük olmalı
- Her ortamda (dev, staging, prod) farklı build number kullanmak karışıklığı önler
- Versiyon ve build number'ı artırmayı CI/CD pipeline'ında otomatikleştirmek mümkündür
- Dev/Staging build:
- Sadece build number artırılır
flutter build ... --build-number=YENI_NUMARA
- Prod build (market):
- Versiyon ve build number birlikte artırılır
flutter build ... --build-name=YENI_VERSIYON --build-number=YENI_NUMARA
flutter build apk --flavor dev -t lib/main.dart --release
flutter build apk --flavor staging -t lib/main.dart --release
flutter build apk --flavor prod -t lib/main.dart --releaseflutter build ipa --flavor dev -t lib/main.dart --release
flutter build ipa --flavor staging -t lib/main.dart --release
flutter build ipa --flavor prod -t lib/main.dart --releaseflutter run --flavor dev -t lib/main.dart
flutter run --flavor staging -t lib/main.dart
flutter run --flavor prod -t lib/main.dartProjenizde CI/CD ve manuel test süreçlerini kolaylaştırmak için scripts/appdistribution.sh scripti kullanılır. Bu script ile Android/iOS için istediğiniz flavor'ı seçip, Firebase App Distribution'a kolayca build gönderebilirsiniz.
- Android/iOS için ayrı ayrı veya birlikte build alıp dağıtım yapmak
- Hangi flavor'a (dev, staging, prod) build göndereceğinizi seçmek
- Release notu girerek build'i test grubuna göndermek
- Tüm işlemleri renkli ve interaktif bir terminal arayüzüyle kolaylaştırmak
-
Script'e çalıştırma yetkisi verin:
chmod +x scripts/appdistribution.sh
-
Script'i başlatın:
./scripts/appdistribution.sh
-
Açılan menüde:
- Platform seçin (Android/iOS)
- Ortam (flavor) seçin (dev, staging, prod)
- Release notu girin
- Script otomatik olarak build alır ve Firebase App Distribution'a gönderir
- Seçim menüleri (platform, flavor)
- Release notu girişi
- Otomatik build ve dağıtım
- Hatalı seçimlerde uyarı ve tekrar deneme
$ ./scripts/appdistribution.sh
1) Android (apk)
2) iOS (ipa)
3) Çıkış :(
Ortam seçiniz [1-3]: 1
1) dev --> Geliştirici
2) staging --> Test
3) prod --> Canlı
4) Çıkış :(
Ortam (flavor) seçiniz [1-4]: 2
Release Notu için açıklama giriniz Iwallet ekip üyesi: QA test buildi
APK yolu: build/app/outputs/flutter-apk/appdistribution.apk
Success android (staging)scripts/config.shdosyasında her flavor için App ID ve tester group tanımlanmalıdır.- Script, Firebase App Distribution'a gönderim için gerekli tüm adımları otomatikleştirir.
- Renkli terminal desteği ile kullanıcı dostu bir deneyim sunar.
- Her flavor için ayrı Firebase projesi ve GoogleService-Info.plist / google-services.json dosyası gereklidir.
- iOS için Xcode'da her flavor'ın Bundle ID'si ve provisioning profile'ı doğru ayarlanmalıdır.
- Android için her flavor'ın applicationId'si Firebase ve build ayarlarıyla uyumlu olmalıdır.
flavorizrile otomatik flavor dosya ve yapılandırma yönetimi sağlanır.