Press ESC to close

CodeMagic ile CI/CD Deneyimi

Merhabalar arkadaşlar, bu yazımda Swift ile geliştirdiğim native iOS uygulamalarımda kullandığım CI/CD toolundan bahsedeceğim. Bu yazıyı yazarken önceki deneyimlerden bahsederek ilerleyeceğim ama öncesinde neden CI/CD toolu kullanıyorum ondan bahsedeyim;

  • Eğer birden fazla projeniz var ve bu projelere aktif olarak geliştirme yapıp güncelleme çıkıyorsanız, sizi büyük bir zaman kaybından kurtarır. Her archive işleminde bilgisayarınızın hızına bağlı olarak 10 ila 20 dakika arasındaki süreyi size bırakır.
  • Yeni teknolojiler denemeyi seviyorsanız ama canlıya da aynı zamanda uygulama çıkmak zorundaysanız stabil Xcode versiyonları kullanmak zorundasınız. Örnek vermek gerekirse ben işletim sistemi olarak Sonoma kullanıyorum ve minimum Xcode 15 destekliyor. Xcode 15’in ilk versiyonunda archive etmeye çalıştığınızda Xcode crash yaşıyor. Böyle durumlardan etkilenmemek için build aldığınız makinenin stabil olması lazım. Bu CI/CD toolu ile kolaylıkla halledebiliyorum.
  • Branch’e yeni bir commit geldiğinde veya yeni bir Tag eklendiğinde trigger edip, tüm prosesi kendiliğinden başlatabiliyorum. 
  • Çoklu bir ekipte çalışıyorsanız bu işin birisine kalmasına gerek kalmadan uzaktaki makinelerle yapabilirsiniz.

Bu ve bunun gibi bir çok sebepten dolayı CI/CD tool’u kullanıyorum.

Önceki Deneyimlerim

Daha öncesinde farklı toollarda deneyimim oldu. Bunlardan en çok kullandığım AppCenter. AppCenter ile belli bir noktaya kadar çok güzel bir ilişkim vardı. Yaklaşık olarak 4 sene aktif olarak kullandık. Gerek eski şirketimde gerekse de kendi projelerimde. Sertifikalar eklenmesi, proje oluşturması, profiller eklenmesi, keystore dosyaları, distribute etmesi her şey çok basit bir şekilde yapabiliyordu. İsterseniz Xamarin projelerinizi isterseniz de native projelerinizi kolaylıkla derleyebiliyordu. Her uygulama için organizasyon oluşturduğunuzda ise aylık olarak size 4 saatlik bir build süresi veriyordu. Makineleri biraz eski olsa da build edebiliyordu. Peki neden yeni bir tool arayışına girdim?

Artık Xamarin projelerini derlememe gerek kalmamıştı. Yani AppCenter bağımlılığından kurtulmuştum. 6 yıldır sektör içindeyim bir gün renk bile değiştirmediler 😄 ve Swift ile geliştirdiğim projelerimdeki SPM paketleri sürekli resolve statüsünde kalıyordu. Ücretsiz planda ise 30 dakikalık bir timeout süresi vardı. 30 dakikadan sonra bu statüde kalıp build failed oluyordu. Bu sebeplerden dolayı AppCenter’ı bırakmak kararı aldım.

Neden CodeMagic

Yeni CI/CD toolu ararken öncelikle free planı olması lazımdı. Ekstra bir maliyet oluşturmasını istemiyordum. Bu sebeple Bitrise‘ı eledim. Xcode Cloud kullanabilirdim ama 2024 yılında ücretli olacak ve Android projelerimde de kullanmak istiyordum. Bu arada Xcode Cloud hakkında yazdığım yazıya da buradan ulaşabilirsiniz. Circle CI denediğimde ise kullanımı zor geldi. Bu sebeple CodeMagic’e yöneldim. CodeMagic ile M1 cihazlarda ücretsiz bir şekilde build alabilmek beni çeken noktalardan birisi oldu. Daha fazla bilgi almak istiyorsanız buradan ulaşabilirsiniz.

Nasıl Kullanılır?

İlk olarak CI/CD için sizden bir proje oluşturmanızı istiyor. Ardından bu CodeMagic projenize projenizin kaynak kodlarını vermelisiniz. Bunun için erişimleri verdikten sonra bir yaml dosyası oluşturmalısınız. Bu yaml dosyasıyla aslında Xcode versiyonunuzu, cocoapods versiyonunuzu, maximum build sürenizi, profillerinizi ve diğer bir çok şeyi ayarlayabiliyorsunuz. Ben kendi projemde aşağıdaki yaml dosyasını oluşturup kullandım ve şu ana kadar işimi gördü. Siz de kendinize göre editleyebilir ve kullanabilirsiniz.

 

workflows:
    ios-native-workflow:
      name: iOS Native
      integrations:
        app_store_connect: CodeMagic
      max_build_duration: 120
      instance_type: mac_mini_m1
      environment:
        xcode: latest
        cocoapods: default
        ios_signing:
          distribution_type: app_store # or: ad_hoc | development | enterprise
          provisioning_profiles:
            - Project_Profile
            - Project_Profile_2
          certificates:
            - Project_Certificate
        vars:
          BUNDLE_ID: "com.sezeromer.id"
          XCODE_WORKSPACE: "Project Name.xcworkspace"  # <-- Name of your Xcode workspace
          XCODE_SCHEME: "Scheme Name" # <-- Name of your Xcode scheme
      scripts:
        - name: Install CocoaPods dependencies
          script: pod install
        - name: Set up provisioning profiles settings on Xcode project
          script: xcode-project use-profiles
        - name: Build ipa for distribution
          script: |
                xcode-project build-ipa \
                --workspace "$CM_BUILD_DIR/$XCODE_WORKSPACE" \
                --scheme "$XCODE_SCHEME"
      artifacts:
        - build/ios/ipa/*.ipa
        - /tmp/xcodebuild_logs/*.log
        - $HOME/Library/Developer/Xcode/DerivedData/**/Build/**/*.app
        - $HOME/Library/Developer/Xcode/DerivedData/**/Build/**/*.dSYM
      publishing:
        email:
          recipients:
            - oomersezer@gmail.com
          notify:
            success: true
            failure: true

        app_store_connect:
          auth: integration

        # Configuration related to TestFlight (optional)
        # Note: This action is performed during post-processing.
          submit_to_testflight: true

            # Optional boolean, defaults to false. Set to true to automatically expire
        # previous build in review or waiting for review in Testflight before
        # submitting a new build to beta review. Expired builds will no longer be available for testers.
        # Note: This action is performed during post-processing.
          expire_build_submitted_for_review: true


        # beta_groups: # Specify the names of beta tester groups that will get access to the build once it has passed beta review.
        #  - group name 1
            # - group name 2

        # Configuration related to App Store (optional)
        # Note: This action is performed during post-processing.
          submit_to_app_store: true

        # Optional boolean, defaults to false. Set to true to cancel the previous
        # submission (if applicable) when submitting a new build to App Store review.
        # This allows automatically submitting a new build for review if a previous submission exists.
        # Note: This action is performed during post-processing.
          cancel_previous_submissions: true

        # Optional, defaults to MANUAL. Supported values: MANUAL, AFTER_APPROVAL or SCHEDULED
          release_type: MANUAL

Sorularınız olursa mail veya yorum atarak ulaşabilirsiniz. Deneyimledikçe yeni yazılar ile geri dönerim. İyi çalışmalar.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir