Codemagic ile CI/CD Part2

Osman Yılmaz
Team Kraken
Published in
3 min readMay 25, 2021

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-cacheDart 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/*.xml
scripts:
- 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.com
slack:
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!

https://twitter.com/osmannyilmaz

https://twitter.com/_teamkraken_

--

--