Herkese selamlar, bu yazıda yazılım geliştirme süreçlerinin verimliliğini ve çevikliğini artıracak bir konuyu ele almak istedim. Part1 olarak fazlandırdığım bu yazıda Azure DevOps ortamında Flutter ile bir iOS uygulamanın buildini alacağız. İlerleyen yazılarda TestFlight ve AppStore’a uygulamanın gönderilmesini inceleyeceğiz. Mümkün olduğu kadar adımları detaylı aktarmaya çalışacağım. İşlemlere başlamadan önce CI/CD süreçleri hakkında bilgi vermek isterim.
Keyifli okumalar 🚀
CI (Continuous Integration/ Sürekli Entegrasyon) ve CD (Continuous Delivery & Deployment / Sürekli Teslim & Dağıtım)
Geliştirmekte olduğunuz bir projede yaptığınız ufak bir değişikliğin dahi çalışabilir olduğunu test etmeniz ve doğrulamanız gerekmektedir. En basitinden bir imla hatasını dahi düzeltmiş olsanız projede beraber çalıştığınız tester, po veya müşteri tarafında bu değişiklik incelenmek istenebilir ama öncesinde projenin düzgün bir şekilde build alınıp alınmayacağından emin olmanız gerekmektedir. Uygulamanın gün içerisinde defalarca kez manuel olarak build alınıp mail, Firebase App Distribution veya Testflight ile dağıtımını yapmak bir geliştiricinin bazen gün içinde yarı zamanını alabiliyor. CI/CD süreçleri ile bu işlemlerin otomatize edilmesine yarar. Bu işlem genellikle kodların master branch’e açılan pull requestin merge edilmesiyle sağlanır.
Başlayalım 🚀
Azure DevOps ortamında Pipelines kısmına girelim. Daha önceden oluşturulan tüm pipelineları burada görüntülemek ve düzenlemek mümkündür.
Sağ üst köşede yer alan “New Pipeline” butonuna tıklayarak yeni bir pipeline oluşturalım. Eğer bu buton sizde pasif ise DevOps yöneticiniz ile iletişime geçebilirsiniz.
Açılan bu ekranda repoların hangi ortamda bulunduğunu seçmemiz isteniyor. GitHub, Bitbucket, Azure Repos gibi pek çok sürüm takip ve depolama hizmeti hali hazırda bulunuyor. Ben classic editor ile ilerlemeyi tercih ediyorum. Bir sonraki ekranda kaynak kodlarınızın hangi proje ve branchten çekileceği sorulmaktadır. Gerekli bilgileri seçtikten sonra Continue diyerek devam edelim. Azure tarafında bize pek çok hazır template sunulmaktadır. Gün geçtikçe de bu templatelerin sayısı artmaktadır. Dilerseniz hazır bir template seçebileceğiniz gibi süreçleri manuel de ilerletebilirsiniz. Benim tercihim “Empty pipeline” yönünde.
Yapacağımız işlem bir Flutter uygulamasının test paketini müşteri ve testerlara Apple TestFlight üzerinden Pipeline ile otomatik dağılımını sağlamak olduğu için “Agent Specification” kısmından macos latest seçimi yapmamız gerekmektedir. Yine bu ekrandan pipelineımıza bir isim verebiliriz.
İlerleyen süreçlerde kendi ihtiyaçlarınıza göre pipelineınınızı şekillendireceksinizdir. Bu yazıda en basit haliyle temelden bir pipeline kurulumu gerçekleştiriyoruz.
Agent job 1 üzerine tıklayarak Demans kısmına bir adet ekleme yapacağız, ismi xcode diyelim ve condition’u exists olarak ayarlayalım.
Aslında burada ilerleteceğimiz süreç, sıfır bir macbook cihaza Flutter kurulumu yapıp, projenin kaynak kodlarını derleyip, Apple sertifikalarımız ile Archive almaktan farksız olacaktır. Agent job 1 yanındaki + butonuna tıklayarak yeni bir task yaratacağız.
Yeni taskımızın amacı uzaktaki bir bilgisayara Flutter yüklemek olacak. Açılan listeden Flutter Install’ı seçelim. Dilerseniz Flutter’ın en sonki sürümüyle de devam edebilirsiniz. Ancak benim bu Pipeline için geçerli projemde 3.3.8 sürümü kullanıldı. Customize ederek 3.3.8 sürümüyle devam edeceğim.
İsterseniz buraya kadar ki hazırladığımız kısmı bir kaydedip çalıştıralım. Flutter’ın başarıyla kurulduğunu görmek bizi motive edecektir.
Kurulumumuz başarıyla tamamlandı. Bundan sonraki süreçte doğrudan Flutter adımlarını sürdürüyor olacağız. Yeni çekilen bir projede Flutter’ın temel komutlarından olan clean ve pub get işlemlerini yapmamız faydalı olacaktır. Agent job 1 yanındaki + butonuna tıklayarak Flutter Command taskını ekleyelim. Arguments kısmına clean yazalım.
Command Line Script taskı ile komut satırına yazdığımız komutları pipelineımıza ekleyeceğiz. Yine aynı şekilde yeni bir task oluşturalım bu sefer Command Line Script’i seçelim. Script alanına aşağıdaki komutları yazabiliriz. Aslında çoğu kaynakta Podfile ‘ın da silindiğini görüyoruz ancak proje özelinde yapılan native ayarları kaybetmek istemeyiz. İleride alacağımız hatalara göre bu kararın şekillenmesi daha sağlıklı olacaktır.
rm -Rf ios/Pods
rm -Rf ios/.symlinks
rm -Rf ios/Flutter/Flutter.framework
rm -Rf ios/Flutter/Flutter.podspec
rm ios/Podfile.lock
rm -Rf pubspec.lock
Sıradaki taskımız ise pub get işlemini gerçekleştirmek için ekleyeceğiz 🙂 Flutter’a özgü komutlar için her zaman Flutter Command taskını kullanabilirsiniz. Paketleri çekmek için arguments kısmına pub get yazmanız yeterlidir.
Flutter tarafında iOS / XCode süreçlerinin belki de en kaygılandıran süreci Pods yüklemeleridir. Cocapods için hali hazırda task bulunmaktadır. Bu kısımda Force repo update seçeneğini aktif etmemiz faydalı olacaktır.
Sırada Apple süreçleri var. Apple sertifikaları (.p12 uzantılı) ve provisioning profile (.mobileprovision uzantılı) tasklarını ekleyeceğiz. Dilerseniz buraya kadar ki kısmı çalıştırıp deneme yapalım.
Her şey yolunda olduğuna göre Sertifikaları eklemeye başlayabiliriz. Task listesindeki arama kısmına Apple yazdığınız zaman “Install an Apple certificate” ve “Install an Apple provisioning profile” tasklarını görebilirsiniz. Bu taskları da Agent job 1’ ekleyelim. Apple tarafı için son olarak XCode taskını ekleyerek “clean” aksiyonunu gerçekleştirelim.
Bu kısım biraz daha detaylı incelenmelidir. XCode clean taskı için gerekli configürasyonları aşağıdaki gibi tanımladım. Sizin projenizde değişiklik gösteren fieldları kendinize göre değiştirmeniz gerekmektedir.
Display name: Xcode clean
Actions: clean
Configuration: Release
SDK: iphoneos
Workspace or project path: ios/Runner.xcworkspace
Scheme: Runner
XCode version: Default
Signing style: Project defaults
Create app package seçeneğini aktif edip Archive path ve Export path alanlarını dolduralım:
Archive path: $(system.defaultworkingdirectory)/ios/output/archive
Export path: $(system.defaultworkingdirectory)/ios/output/release
Export options için Plist seçip, plist dosyasını ios/ExportOptions.plist yolunu verebiliriz.
Pipeline’ın final kısmına geldik. Son olarak ekleyeceğimiz task “Publish Pipeline Artifact” taskı olacak. File or directory path kısmına gelecek olan ipa dosyayı daha kolay bulabilmek adına ios dizinindeki output kısmına gönderebiliriz.
$(system.defaultworkingdirectory)/ios/output/release/UygulamanizinAdi.ipa
Buraya kadar başarılı bir şekilde .ipa uzantılı çıktımızı elde ettik. Yazının devamında alınan ipa dosyanın otomatik olarak AppStore’a gönderilmesini işleyeceğim.
Bir sonraki yazıda Android için aynı adımları gerçekleştireceğim.
İyi çalışmalar dilerim.