Codemagic ile CI/CD Part2
Merhaba bu yazımda, Codemagic CI/CD süreçleri üzerine biraz daha detaylı konfigürasyonları anlatmaya çalışacağım. Bildiğiniz üzere bir önceki yazımda standart derleme entegrasyonundan bahsetmiştim.
Erişmek için: https://medium.com/teamkraken/codemagic-ile-ci-cd-part1-f321046a6a32
Bu kısımda kendi iş akışlarınızı oluşturabilmeniz için kullanacağız kısımları tek tek anlatacağım. Bu iskelet yapısını anlamak çok önemli! Bir sonraki makalem bu parçaları kullanacağımız karmaşık CI/CD entegrasyonu olacak.
Codemagic YAML entegrasyonu (İskelet Yapısı)
Aşağıda gördüğünüz yapı, standart Codemagic yaml şablonu. Açıklamarını özet şeklinde yanlarına ekledim.
workflows:
my-workflow: # akış ID
name: # akışınızın İsmi
instance_type: # derleme makinası
max_build_duration: # maksimum derleme süresi
environment: # Şifreli değişkenleriniz(Store keys)
cache: # cache dosyasınızın uzantısı
triggering: # Otomatik tetikleme,hooklar
scripts: # Farklılaştırabileceğiniz kodlar
artifacts: # oluşturulan paketlerin uzantısı
publishing: # Paket yayınlama kanallarınız
Şimdi tek tek bunları anlamaya çalışalım!
1- instance_type
Kodunuzun derleneceği makinayı seçeceğiniz kısımdır.
Codemagic’in bize önerdiği makina tipler:
mac_mini, mac_pro, linux, linux_x2
2- max_build_duration
Her bir derleme akışı için maksimum derleme süresi belirlememiz gerekir.
CI/CD sürecinde iş akışlarımızı geliştirme , derleme, yayınlama, gibi farklı farklı akışlara bölmekte fayda vardır.
3- environment
Projenizin platform değişkenlerini (Api keys)güvenli bir şekilde .yaml dosyanızda saklayabildiğimiz kısımdır.
Derlemek istediğiniz platform versiyonunu bu kısımda tanımlayabilirsiniz.
Codemagic web arayüzünden Secret variables kısmından önemli anahtarlarınızı şifreleyip buraya taşıyabilirsiniz.
Örneğin bir Google haritalar anahtarınız var, konsoldan tanımlayıp, aşağıdaki gibi değişkenleri kullanabiliriz.
defaultConfig {
// Other values set here
resValue "string", "maps_api_key", "$System.env.MAPS_API_KEY"
}<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/maps_api_key"
/>
Örneğin Flutter versiyonlarından (https://flutter.dev/docs/development/tools/sdk/releases)2.0.0 ‘da derlemek istiyorsunuz, bu kısımda sabit bir versiyonu ekleyebilirsiniz. Firebase anahtarlarınızı buraya taşıyabilirsiniz.
environment:
vars:
PUBLIC_ENV_VAR: "değer giriniz"
SECRET_ENV_VAR: Encrypted(...)
# Android
# Anahtarlarınızı kısımları encrypted hale getirip ekleyebiliriz.
FCI_KEYSTORE: Encrypted(...)
FCI_KEYSTORE_PASSWORD: Encrypted(...)
FCI_KEY_PASSWORD: Encrypted(...)
FCI_KEY_ALIAS: Encrypted(...) # iOS
APP_STORE_CONNECT_ISSUER_ID: Encrypted(...)
APP_STORE_CONNECT_KEY_IDENTIFIER: Encrypted(...)
APP_STORE_CONNECT_PRIVATE_KEY: Encrypted(...)
CERTIFICATE_PRIVATE_KEY: Encrypted(...) # iOS
FCI_CERTIFICATE: Encrypted(...)
FCI_CERTIFICATE_PASSWORD: Encrypted(...)
FCI_PROVISIONING_PROFILE: Encrypted(...)
# Firebase anahtarlarımız
ANDROID_FIREBASE_SECRET: Encrypted(...)
IOS_FIREBASE_SECRET: Encrypted(...) flutter: stable # flutter derleme versiyonu(örn: v1.13.4)
xcode: latest # En son versiyon veya belirlenen (örn:11.2)
cocoapods: 1.9.1
ndk: r21d
java: 1.8
4- cache
Derleme süresini kısaltmak ve sürekli aynı dosyalarını oluşturmamak için bazı derleme dosyalarınızı cachelemekte fayda vardır.
$FLUTTER_ROOT/.pub-cache
Dart cache$HOME/.gradle/caches
Gradle cache. Note: do not cache $HOME/.gradle
cache:
cache_paths:
- ~/.gradle/caches
- ...
5-triggering
Bu kısımda projenizin ne zaman derlemeye başlayacağını ayarladığımız kısım. Projenize gelen commitlere bakarak derlemeyi başlatabilirsiniz.
triggering:
events: # List the events that trigger builds
- push
- pull_request
- tag
branch_patterns: # Include or exclude watched branches
- pattern: '*'
include: true
source: true
- pattern: excluded-target
include: false
source: false
- pattern: included-source
include: true
source: true
6-scripts
Bu kısımda unit testlerinizi koşturabilir, uygulama versiyonunu yönetebilir, akışınızı istediğin gibi özelleştirerek tüm derleme komutlarınızı çalıştırabilirsiniz.
Bir kaç script örneği inceleyelim
Flutter entegrasyon test
flutter emulators --launch apple_ios_simulator
flutter drive --target=test_driver/my_drive_target.dart
IOS için unit test koşturma
- name: iOS test
script: |
xcode-project run-tests \
--workspace Parasut.xcworkspace \
--scheme Parasut \
--device "iPhone 12"
test_report: build/ios/test/*.xmlscripts:
- name: Unit tests
script: |
mkdir -p test-results
flutter test --machine > test-results/flutter.json
test_report: test-results/flutter.json
uygulama versiyonunu artırmak için
scripts:
- &increment_build_number
name: Increment build number
script: agvtool new-version -all $(($PROJECT_BUILD_NUMBER +1))
Flutter ios derleme
scripts:
- name: Build for iOS
script: flutter build ios
7- artifacts
Uygulama paketlerinizin çıkaracağınız dizini, paket isimlerini yönetebilirsiniz.
artifacts:
- build/**/outputs/**/*.apk
8- publishing
Bu kısımda derlemesi başarılı olan bir paketi store hesaplarınıza gönderebilirsiniz.
Android : bir servis hesabı oluşturmamız gerekiyor. Aşağıdaki makalededetaylı play servis entegrasyonunu inceleyebilirsiniz.
publishing:email:
recipients:
- benosmanyilmaz@gmail.comslack:
channel: '#channel-name'
notify_on_build_start: true
notify:
success: false
failure: false
Bu kısımda Codemagic Yaml dosyasındaki bölümleri tek tek anlatmaya çalıştım. Bir sonraki makalemde biraz daha karmaşık akışları anlatacağım.
Merak ettiğiniz konular veya aklınıza takılan sorular var ise bizimle iletişime geçmekten çekinmeyin. Bir sonraki makalede görüşmek üzere.
Bizi takip etmeyi unutmayın!