Fly4cast’in web ve Android tarafı hazırdı. iOS gerekiyordu ve elimde Mac yoktu.
“Mac al” en kolay cevap. Ama bir uygulamayı test etmek için donanım almak, problemi çözmek değil satın almak. Denedim: kodu Windows’ta yaz, derlemeyi bulutta yap.
İlk engel: proje dosyası
Xcode projesi tek bir dosya değil; içinde her kaynak dosyanın ve her ayarın kaydı olan devasa bir yapı. Elle düzenlenemez, birleştirilemez, Windows’ta üretilemez.
Çözüm: proje dosyasını hiç tutmamak. Bir tanım dosyası yazıyorsun ve gerçek proje derleme anında üretiliyor.
ios/project.yml ← git'te duran tek şey, okunabilir
↓ (derleme sunucusunda)
ios/App.xcodeproj ← üretilir, git'e girmez
Yan fayda: birleştirme çakışması diye bir şey kalmıyor.
Asıl engel: imzalama
Derleme birkaç denemede oturdu. İmzalama üç gün aldı — çünkü tek bir işlem değil, birbirine bağlı dört şeyin uyuşması:
| parça | nedir | koptuğunda |
|---|---|---|
| Sertifika | seni tanımlayan anahtar çifti | “geçerli imzalama kimliği yok” |
| Profil | hangi uygulama, hangi cihaz, hangi yetkiler | arşiv oluşur, yükleme reddedilir |
| Yetkiler | push, app group, arka plan | özellik sessizce çalışmaz |
| API anahtarı | yüklemeyi yapan kimlik | derleme biter, yükleme yapılmaz |
Tuzak 1 — yanlış profil türü
İlk hata en öğreticisiydi: arşivleme “takım bulunamadı / kayıtlı cihaz yok” diyerek düşüyordu.
Sebep: ortam geliştirme profili almıştı. Geliştirme profili yalnız kayıtlı cihazlarda çalışan derlemeler üretir; bulut çalıştırıcısında kayıtlı cihaz yok, dolayısıyla arşiv oluşmuyor. Mağaza için dağıtım profili gerekiyordu.
Tuzak 2 — anahtarın diske yazılışı
Yükleme için kullanılan anahtar bir PEM dosyası: metin gibi görünen, satır sonları anlamlı olan bir yapı. Anahtarı ortam değişkeninden alıp dosyaya yazarken satır sonları kaçış dizisi olarak kalıyordu.
echo "$KEY" > key.p8 # \n kaçışları olduğu gibi yazıldı
printf %b "$KEY" > key.p8 # kaçışlar gerçek satır sonuna çevrildi
Tek kelimelik fark, yarım gün.
Tuzak 3 — çıktının nerede olduğu
Derleme başarılı, imzalama başarılı, yükleme “dosya bulunamadı”. Arşivin dışa aktarıldığı yol, yükleyicinin aradığı yol değildi. Yapılandırmadaki desen bir seviye yukarıyı gösteriyordu.
Bu tür hatalar en sinir bozucu olanlar: her şey çalışıyor, sadece iki taraf farklı klasöre bakıyor.
Build numarası
Başlangıçta numarayı sabit bir ofsetle artırıyordum. Kısa sürede karıştı: bazı derlemeler yüklenmedi, numaralar boşluklu ilerledi, hangi sürümün nerede olduğu belirsizleşti.
Doğrusu basit: yüklemeden önce mevcut en yüksek numarayı sor, bir artır.
Bir de olmayan bir hata
Bir noktada analitik kütüphanesi “derlenmiyor” diye iki saat uğraştım. Derlenmiyordu, çünkü kodu derleme sunucusunun çektiği depoya göndermemiştim. Yerelde vardı, uzakta yoktu.
Bir şey “yerelde çalışıyor ama CI’da çalışmıyor” ise, önce CI’ın gerçekten ne gördüğünü doğrula. Vakaların çoğunda kodda fark yok; CI senin göndermediğin bir şeye bakıyor.
Sonunda
Şimdi akış şöyle: Windows’ta kod yazılıyor, gönderiliyor, bulutta macOS çalıştırıcısı projeyi üretiyor, derliyor, dağıtım profiliyle imzalıyor, TestFlight’a yüklüyor. Telefonuma bildirim geliyor.
Toplam kurulum üç gün. Bir Mac’in bedeli bundan fazla — ve daha önemlisi, bu kurulum her derleme için aynı şekilde çalışıyor; benim makinemin durumuna bağlı değil.
Asıl kazanç donanımdan tasarruf değil: derleme ortamının tekrarlanabilir olması. “Bende çalışıyor” cümlesini ortadan kaldıran şey bu.