Software Development
Mobil CI/CD İçin İhtiyacınız Olan Tek Şey Boşta Duran Bir MacBook
Ekim 9, 2026
Bir salı öğleden sonrası, build pipeline bir saati aşkın süre takılı kaldı; nihayet biri kalkıp runner’a bakana kadar. Baktığımda ekranda bir macOS keychain penceresi duruyordu: birinin “Her Zaman İzin Ver” butonuna tıklamasını bekleyen, gerçek bir grafik arayüz uyarısı. Sebebi, Fastlane’in match komutunun, işin bakış açısından var olmayan bir keychain’i aramaya başlamasıydı. Ne var ki bu uyarıyı görecek kimse yoktu. iOS derlemelerimizi çalıştıran Mac, kapağı kapalı hâlde başka bir dizüstü bilgisayarın altında duruyordu.
Her şey kabaca böyle başladı. Bir strateji belgesiyle ya da maliyet azaltma girişimiyle değil; mobil sürüm sürecimizin hiçbir zaman gerçekten tasarlanmadığını, yalnızca zamanla bir araya getirildiğini açıkça gösteren, son derece basit bir uyarıyla.
Her mobil ekipte bu hikâyenin kendine özgü bir versiyonu vardır. Bizimkinde bir keychain söz konusuydu, ancak ilk neyin bozulduğunun pek önemi yok. Asıl mesele şu: Ekiplerin çoğu ya bu sorun kategorisini tamamen başkasının işi hâline getirmek için yönetilen bir Mac bulut sağlayıcısına ödeme yapıyor ya da sürümleri elle çıkarmaya devam edip sürüm haftasında kimsenin tatilde olmamasını umuyor. Biz ilk seçeneği zaten denemiştik. Hem de iki kez.
Bu sorunu çözmesi için zaten iki sağlayıcıya ödeme yaptık
Kendi altyapımızı kurmadan önce, yıllık abonelikle yönetilen bir mobil CI sağlayıcısı kullanıyorduk. Üç dört kişilik bir mobil ekip için bu sabit yıllık maliyeti her yenileme döneminde gerekçelendirmek daha da zorlaştı; sabit bir yıllık lisansı anlamlı kılacak sıklıkta sürüm çıkarmıyorduk. Esas olarak bu sorunu gidermek, yani peşin toplu ödeme yerine kullandıkça öde modeline geçmek için ikinci bir sağlayıcıya taşındık. Bu, maliyet açısından daha iyi geldi. Ancak asıl sorunu çözmedi; sürüm sürecimize dair bilgiyi hâlâ başkasından kiralıyorduk, yalnızca farklı bir faturalama modeliyle.
Asıl eksiklik teknik değil, organizasyonel
Bu mesele hiçbir zaman gerçekten derleme hızıyla ilgili değildi. Bir geliştiricinin kendi dizüstü bilgisayarındaki sürüm derlemesi asla yavaş değildi. Asıl sorun tutarlılıktı: Üç dört mobil mühendisin, çok adımlı aynı sürüm kontrol listesini, aynı sırayla, aynı imzalama yapılandırmasıyla, her seferinde ve teslim baskısı altında hiçbir adımı atlamadan uygulamasını sağlamak. Bu bir süreç sorunudur ve SaaS sağlayıcıları bu sorunu çözmek yerine üstünü örtmek için sessiz sedasız ücret almaktadır.
Sorunun bir türlü kalıcı olarak çözülememesinin bir nedeni de şu: Çoğu şirkette DevOps ekipleri mobil dünyanın dilini konuşmaz. Keystore’lar, provisioning profile’lar, bir iOS derlemesinin neden gerçek bir Mac’e ihtiyaç duyduğu gibi konular onların zihinsel modelinde yer almaz. Mobil mühendisler ise çoğunlukla yalnızca kendi makinelerinden sürüm çıkarmayı bilir; bu gerçek bir beceridir, ancak tamamen CI’ın dışında kalan bir beceridir. İkisinin arasındaki alanın sahibi yoktur; dolayısıyla bu süreç, kimsenin tıklamadığı bir keychain uyarısı gibi yeterince görünür bir hata yaşanana kadar kişiye bağlı, manuel bir ritüel olarak kalır.

Gösterişsiz çözüm
Denediğimizde çözüm neredeyse utandıracak kadar mütevazı çıktı: Şirkette hiç kullanılmadan duran, kimseye tahsis edilmemiş, boşta bekleyen bir M1 MacBook’u self-hosted GitLab runner olarak kaydettik ve sürüm işlerinin özellikle bu makineye yönlendirilmesi için etiketledik. Yeni donanım bütçesi yok, küme yok, yenilenecek bir sağlayıcı sözleşmesi yok.
Yaklaşık bir hafta içinde çalışan sürecimiz vardı: GitLab’in bulut CI’ı üzerinden çalışan, ancak Mac gerektiren her iş için kendi self-hosted runner’ımızı kullanan bir yapı. GitLab tarafı şimdilik bulutta kalıyor; bu kurulum biraz daha olgunlaştığında GitLab örneğinin kendisini de şirket içi altyapıya taşımak bir sonraki adım olacak.

O keychain uyarısına dönersek
Asıl çözüm hiç de gösterişli değildi. O pencere, tamamen gözetimsiz çalışması gereken bir makinede macOS’un bir insandan izin istemeye çalışmasından ibaretti. Çözüm, bir işin makinenin o an içinde bulunduğu belirsiz keychain durumuna bağımlı olmasının önüne geçmektir: Yeni bir keychain oluşturmak, etkileşim gerektirmeden kilidini açmak, derleme ortasında otomatik olarak kilitlenmeyecek şekilde ayarlamak, arama listesine açıkça eklemek ve iş başarılı da olsa başarısız da olsa after_script içinde silmek. Bu adımlar varsayılmak yerine script’e döküldüğünde, grafik arayüzün izin isteyeceği hiçbir şey kalmaz.
Aynı disiplin, içinde gizli bilgi barındıran diğer her şey için de geçerlidir: Android keystore’u, anahtar parolaları, Play Console hizmet hesabı JSON dosyası, iOS sertifikaları ve provisioning profile’ları. Sonuncular Fastlane match aracılığıyla ayrı, şifrelenmiş bir depoda tutulur ve şifreleri de maskelenmiş bir CI değişkeni olarak saklanan bir parolayla çözülür. Bunların hiçbiri runner üzerinde, işin ihtiyaç duyduğundan daha uzun süre kalmaz.
GitLab olmak zorunda değil
Bu yapının arkasındaki teknoloji yığını, self-hosted bir M1 runner’a bağlanan GitLab CI üzerinde çalışan Fastlane ve Expo projesinden oluşuyor; ancak mimarinin kendisinde GitLab’e özgü hiçbir şey yok. macOS agent’lı Jenkins, self-hosted macOS runner’lı GitHub Actions ya da self-hosted agent pool’u olan Azure Pipelines: Aynı mimari, sadece farklı bir YAML yazımı. Taşınması gereken araç değil, akıştır: Sürüm derlemesinden önce manuel bir onay adımı, çalışma anında enjekte edilip hemen ardından silinen gizli bilgiler, genel CI değişkenlerinden ayrı tutulan sertifikalar ve derlemeden ayrıştırılmış bir dağıtım adımı. Böylece bir mağaza kanalına yayın yapmak, başlı başına incelenebilir ve yeniden çalıştırılabilir bir işlem hâline gelir.
Gerçekte ne değişti?
İkinci sağlayıcının dakika başı ücretlendirmesini ödemeyi bıraktık. Sürüm derlemeleri, o hafta doğru sertifikaları kurulu olan mühendise bağımlı olmaktan çıktı; artık doğruluğun tek kaynağı birinin dizüstü bilgisayarı değil, derleme hattının kendisi. Ve biraz sezgilere aykırı görünse de, imzalama materyalleri eski manuel süreçte olduğundan çok daha güvenli hâle geldi; çünkü geçici, kullanımdan sonra silinen bu desen, herhangi bir geliştiricinin elle uyguladığı her şeyden daha katı.
Açık konuşmak gerekirse
Tek bir Mac paralel çalışma imkânı sunmaz. Üç dört kişilik bir ekibin haftalık sürüm derlemeleri için tek bir runner yeterlidir; ancak aynı anda sürüm çıkarmaya çalışan beş ekip birden fazla makineye ihtiyaç duyar. Ayrıca gizli bilgilerin runner’da kalmamasını sağlamak artık bizim sürdürmemiz gereken bir disiplin; bir sorun çıktığında işaret edebileceğimiz bir sağlayıcı SLA’i değil.
Bizim ölçeğimizdeki bir ekip için bu, gayet makul bir takas.
Bu yapı şu anda tek bir projede çalışıyor. Planımız, aynı kurulumu şirket içindeki diğer mobil projelerimize de yaygınlaştırmak. Ve bunların hiçbiri aslında bize özgü olmadığından, bu çözümü manuel yerel derlemelere mahkûm kalmış ya da bir mobil CI sağlayıcısına benzer büyüklükte abonelik ücreti ödeyen müşterilerimize sunabileceğimiz bir hizmet olarak paketlemeyi hedefliyoruz. Ne de olsa bu, hâlihazırda kullanılmadan duran bir donanımla çözülebilecek bir sorun.
Yazar: Özgün Bal