XCode’da Build Numarası Otomatik Olarak Nasıl Artırılır?

 In IOS, Mobil Uygulama, Swift

Yazılım geliştirirken karşılaştığımız kod dışında kalan birçok zorluk vardır. Bunlardan bir tanesi test. Beta dağıtımı hangi sağlayıcı üzerinden olacak? CI-CD süreçleri nasıl olacak? Kod nerede saklanacak? Teknik bilgi takım içerisinde nasıl dağıtılacak? Versiyonlama nedir? Build Numarası nedir? Uygulama yayınladıkça 1.0 dan 2.0 a çekilen Apple Store’un artırmamızı istediği sayıdan ibaret midir? Ve daha bir sürü soru aklımıza gelmektedir.

Yazılım geliştirmede karşılaştığımız sorunlardan bir tanesi de versiyonlamadır. Günlük hayatımızda kendisiyle sıkça karşılaşırız. Kullandığımız yazılımsal ürünlerin menüsünde, profil sayfasında, ayarlar sayfasında, sağında, solunda… v1.4.3 veya x.y.z gibi numaralandırmalar illaki gözümüze çarpmıştır. Bunlar versiyonlamanın ta kendisidir. Peki neye göre ve nasıl yapılır bu versiyonlama? Neye göre ve nasıl yapıldığı, firmanın sektördeki pozisyonuna, yaptığı işlere veya geliştiricinin keyfine göre tamamen farklılık gösterebilecek bir durumdur. Dünya genelinde sabit bir versiyonlama tekniği olmamakla birlikte, kullanılan teknikler birbirleriyle oldukça benzerdir. En yaygın kullanılanı da semantik versiyonlamadır. Biz de Peakup Labs mobil geliştiricileri ekibi olarak bu versiyonlama tipini kullanmaktayız. Semantik versiyonlamanın detaylarını buradan öğrenebilirsiniz. Versiyonlama konusunda bir çok Türkçe kaynak da vardır bu arada.

Build Numarası Nedir?

Çok temel bir şekilde anlatacağım. Bir yazılım ürününü geliştirirken genel olarak tüm ürünü bir anda ortaya koymuyoruz. Başlıyoruz bir şeyler yapıp kullanıcıya/tester a/yöneticiye… yolluyoruz. Yolladığımız kişi bakıyor ve şunları ekleyebilir miyiz, bunları değiştirebilir miyiz, şurada hata var… şeklinde geribildirim veriyor. Yapıyoruz tekrar gönderiyoruz. Peki gönderdiğimiz kişi bu 2 ürünü nasıl ayırt edecek? İşte burada versiyonlama ve build numarası devreye giriyor. İlk ürünümüzün numarası 1.0 iken ikinci ürünümüzün numarası 1.1 olduğu zaman, ikinci ürünün daha sonra çıktığını kullanıcı kolayca ayırt edebiliyor. Bazen 2. ürün yerine 1.ürünü kullanan bir kullanıcı olduğu ve 1.1 de düzelttiğimiz bir hatadan bahsettiği zaman direkt olarak kendisine 1.1 sürümünü indir orada o hatayı çözdük diyebiliyoruz mesela.

Build numarası da versiyon numarası da ürünü kimliklemek için kullanılan numaralardır.

Bu numaraların tek görevleri tabiiki kullanıcının sürümleri ayırt edebilmesi değildir. Aynı zamanda AppleStore veya Google Play Store aynı sürüm numarasına sahip build ları güncelleme olarak görmediği için yayınlamamaktadır. Belirli bir şekilde Build numarasının ve versiyon numarasının artırılması gerekmektedir. Versiyon numarası elle artırılabilir. Çünkü güncellememizin büyüklüğünü sistem bilemez belirleyemez bunu bilen bizzat geliştirici olduğu için genel olarak kendisinin artırması daha uygun oluyor. Ancak Build numarasını sürekli elle artırmak gerekmez. Adı üstünde Build numarası. Her Build’da artırılır. Bunu sürekli elle artırmak gibi bir iş bence Geliştirici olmanın ruhuna aykırı. Yazdığımız sistemi, uygulamayı otomatiğe bağlamaya çalışırken build numarasını sürekli elle artırmak resmen çelişkidir 🙂

IOS Ortamında Versiyonlama Sistemi

Şimdi gelelim fasülyenin faydalarına. Bu yazıda build numarasını nasıl otomatiğe veya git commit sayısına bağlayabileceğimizi anlatacağım. iOS uygulamaları yukarıda da bahsettiğimiz gibi 2 ayrı tipte versiyon numarasına sahiptir.

  • Short bundle version string CFBundleShortVersionString (e.g. 1.12)
  • Build Number CFBundleVersion (e.g. 190)

Her “Short version” içinde birden fazla build barındırır. Build ların herbiri de “Bundle Version” a tekabül eder. Yani build numarası her build yapıldığında artırılırken Versiyon numarası birkaç build dan sonra artırılır. Alttaki ekran görüntüsünde gördüğünüz üzere 1.4 Versiyon numarasına sahip sürüm, 34 ve 35 numaralı 2 farklı build barındırıyor.

Versiyon ve build numaralarından gereğinden uzun bahsettiğimize göre artık sadede gelip Build numarasını otomatik olarak nasıl artırabileceğimize geçelim. Çok basit bir Shell script kullanarak bunu başarabiliriz

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")buildNumber=$(($buildNumber + 1))/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

Yukarıdaki script plist dosyasındaki build numarasını alır, 1 yükseltir ve elde edilen yeni sayıyı XCode’un PlistBuddy özelliğini kullanarak plist dosyasına geri yazar.

  • ${PROJECT_DIR} :  Ana projenin tam yolu
  • ${INFOPLIST_FILE}:  Info.plist dosyasının tam yolu

XCode’da Build Numarasını Otomatik Olarak Artırmak

İyi güzel hoş da XCode’da bunu nasıl yapabiliriz? Öncelikle bu yazı XCode 11.4 versiyonunu kullanarak yazılmıştır. İlerleyen XCode sürümlerinde bir şeylerin yeri değişirse eğer yazı güncellenecektir. Eğer güncellenmemişse bize ulaşmanız yeterlidir anında güncellenir. Adım adım yazdıklarımızı uyguladığınız takdirde Build numarasını otomatik olarak artırabilirsiniz.

    1. Uygulama Target alanını, ardından Build Phases sekmesini seçiyoruz
    2. Yeni bir Script eklemek için yukarıdaki + butonuna basıyoruz
    3. Açılan pencereden New Run Script Phase‘i seçiyoruz
    4. Yeni Script ekranı açılınca, alttaki ekran görüntüsünde gördüğünüz bölüme yukarıda yazdığım script parçasını yazıyorsunuz. Bu arada bu scriptin adını da değiştirebiliyorsunuz. İsimlendirme ımmm severiz
    5. Projeyi Build ettiğiniz zaman Build numaranız otomatik olarak artırılacaktır.

Build numarasını bu şekilde artırmak her ne kadar güzel bir yaklaşım olsa da ben bir türlü sevemedim. 🙄

İçinizden “ya arkadaş bu kadar yazıyı boşa mı yazdın buraya kadar boşa mı okudum seni tatmin etmek için daha nasıl build numarası artıralım?” dediğinizi duyar gibi oluyorum. Bu yaklaşım Build numarasını artırmakta Best Practice değil. Peki nedir bu konudaki Best Practice?

Tabiiki Build numarasını Git commit sayısına bağlamaktır. 

Build Numarasını Git Commit Sayısına Nasıl Bağlayabilirim

Eğer build numarasını git commit sayısına eşitlerseniz, build numarası arşa çıkmış olmaz. Ayrıca Apple Store ve iş arkadaşlarımızın istediği gibi daima bir önceki sürümden fazla olacağı garantidir. Her build de bu numarayı artırmak, zaman içerisinde bu numaranın çok fazla artmasına neden olabilir. Peki bu numaranın çok fazla artmasının bir zararı var mıdır yoo. Tamamen keyfimden git commit sayısına bağlıyorum 🙂

#!/bin/bash
# taken from blog post: http://www.mokacoding.com/blog/automatic-xcode-versioning-with-git/
# Automatically sets version of target based on most recent tag in git
# Automatically sets build number to number of commits
#
# Add script to build phase in xcode at the top of the chain named "set build number"
# put this script in the root of the xcode project in a directory called scripts (good idea to version control this too)
# call the script as $SRCROOT/scripts/set_build_number_by_git_commits.sh in xcode
git=$(sh /etc/profile; which git)
number_of_commits=$("$git" rev-list HEAD --count)
git_release_version=$("$git" describe --tags --always --abbrev=0)
target_plist="$TARGET_BUILD_DIR/$INFOPLIST_PATH"
dsym_plist="$DWARF_DSYM_FOLDER_PATH/$DWARF_DSYM_FILE_NAME/Contents/Info.plist"
for plist in "$target_plist" "$dsym_plist"; do
if [ -f "$plist" ]; then
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $number_of_commits" "$plist"
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${git_release_version#*v}" "$plist"
fi
done

Yukarıda paylaştığım gistte gerekli scripti yazdım. Sizin de gördüğünüz üzere Build numarasını Git commit sayısına bağlı olarak artırmak tabiiki mümkün. Gistteki scripti yukarıda anlattığım şekilde 4. adımda gösterdiğim boşluğa yazabilirsiniz.

iOS Development hakkındaki diğer yazılarımıza buradan
Android ve Kotlin üzerine olan yazılarımıza buradan erişebilirsiniz.

Ali iyi bir yazılım geliştiricidir. Kendini geliştirmeyi yeni şeyler öğrenmeyi çok sever. Build numarasını sadece Apple Store’a uygulama yayınlayacağı zaman öğrenenlerden değildir. Çok daha önceden versiyonlamanın ve build numarasının değerini öğrenmiştir zaten. Ali Apple Store’a güncelleme yollayamadığında “aa Build numarası 1.0 kalmış. 2.0 yapayım o zaman” diyenlerden değildir. Ali Build numarasını otomatiğe bağlar ve Versiyonlama numarasına da çok titiz bir şekilde dikkat eder.

Ali için sürüm notları da çok önemlidir. Ali hep güzel, anlaşılır, kullanıcının hoşuna gidecek sürüm notları yazar. Çok küçük bir uygulama yazıyor bile olsa versiyonlama sistemini düzgün kurar ve artırır. Sonuçta nasıl alışırsa öyle gider değil mi? Eğer Ali bir kere bile amaann salla gitsin derse bunun sonunun hayra alamet olmayacağını çok iyi bilir. Boş vermeye alışmanın eninde sonunda olmadık yerde çok büyük bir patlamaya ve prestij kaybına yol açabileceğini çok iyi bilir.

Ali gibi olun. Çalışın.

Kaynaklar

https://developer.apple.com/library/archive/technotes/tn2420/_index.html
https://crunchybagel.com/auto-incrementing-build-numbers-in-xcode/
https://www.mokacoding.com/blog/automatic-xcode-versioning-with-git/
https://fuller.li/posts/versioning-with-xcode-and-git/

Recommended Posts

Leave a Comment

Website Protected by Spam Master


Start typing and press Enter to search

X