İçeriğe geç

Xcode Cloud Build'lerinde Swift Macro Güven Sorunlarını Çözme

Swift macro'lar güçlü ama CI pipeline'ını güven hatalarıyla bozabiliyor. Xcode Cloud'daki "Target must be enabled" hatasını bir kez ve tamamen çözen basit bir post-clone script'i nasıl uygulayacağını öğren.

Xcode Cloud Build'lerinde Swift Macro Güven Sorunlarını Çözme

CI Ortamlarında Swift Macro’lar Sorunu

Xcode 15 ile birlikte Swift 5.9’da tanıtılan Swift macro’lar, kod üretimi ve derleme zamanı metaprogramlamayı mümkün kılan güçlü bir özellik. Geliştirici verimliliği açısından mükemmel faydalar sunarken, CI/CD pipeline’ları için — özellikle Xcode Cloud’da — yeni bir zorluk ortaya çıkardılar.

Bir macro’yu yerel makinende ilk kez kullandığında, Xcode çalıştırılmadan önce macro’nun paketine güvenmeni isteyen bir diyalog gösteriyor. Bu geliştirme makinende sorunsuz çalışıyor, ama Xcode Cloud gibi bir diyalog kutusuna “OK” tıklamanın mümkün olmadığı otomatik ortamlarda sorun oluyor.

Swift macro kullanan bir projeyi Xcode Cloud’da derlemeye çalıştıysan, muhtemelen şu sinir bozucu hatayla karşılaşmışsındır:

Target must be enabled before it can be used.

Tam Çözüm

Biraz araştırmadan sonra, Swift macro kullanan Xcode Cloud build’leri için tutarlı şekilde çalışan güvenilir bir çözüm buldum. İşte nasıl uygulayacağın:

Adım 1: CI Scripts Klasörü Oluştur

Önce CI script’lerimiz için özel bir klasör oluşturalım:

  1. Xcode’da projenize sağ tıkla

  2. “New Group” seç

  3. ci_scripts olarak adlandır

Adım 2: Post-Clone Script’i Oluştur

Sonra, Xcode Cloud’un repository’ni klonladıktan sonra otomatik olarak çalıştıracağı bir post-clone script’i oluşturacağız:

  1. ci_scripts klasörüne sağ tıkla

  2. “New File” > “Empty File” seç

  3. ci_post_clone.sh olarak adlandır

Adım 3: Script İçeriğini Ekle

Aşağıdaki kodu yeni ci_post_clone.sh dosyana kopyalayıp yapıştır:

#!/bin/sh

# Hata durumunda çık (-e), tanımsız değişkenler (-u) ve pipeline hataları (-o pipefail)
set -euo pipefail

# Sahte build hatalarını önlemek için Xcode macro parmak izi doğrulamasını devre dışı bırak
defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES

Bu script kritik bir şey yapıyor: güven diyaloğunu tetikleyen Xcode’un macro parmak izi doğrulamasını devre dışı bırakıyor.

Adım 4: Script’i Çalıştırılabilir Yap

Terminal’i aç, proje klasörüne git ve şunu çalıştır:

chmod +x ci_scripts/ci_post_clone.sh

Bu komut script’ini çalıştırılabilir yapıyor — Xcode Cloud’un düzgün çalıştırabilmesi için bu gerekli.

Adım 5: Commit Et ve Build’i Tetikle

Yeni dosyayı repository’ne commit et ve değişiklikleri push’la. Bu, Xcode Cloud’da yeni bir build tetikleyecek ve artık macro güven hatası olmadan başarıyla tamamlanması gerekiyor.

Nasıl Görünüyor

Düzgün kurulduğunda, proje yapında post-clone script’ini içeren CI scripts klasörü bulunmalı:

3x hu f yl d

Neden Çalışıyor

Xcode Cloud, projenin kök dizinindeki ci_scripts klasöründe bulunan ci_post_clone.sh adlı herhangi bir script’i otomatik olarak çalıştırıyor. Script’imiz macro parmak izi doğrulamasını devre dışı bırakmak için Xcode tercihlerini değiştiriyor ve güven gereksinimini etkili bir şekilde bypass ediyor.

defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES komutu, macro’ların kullanılmadan önce açıkça güvenilir olması gerekip gerekmediğini kontrol eden belirli bir Xcode tercihini değiştiriyor.

Güvenlik Değerlendirmeleri

Bazı geliştiriciler macros.json dosyasını (güvenilen macro parmak izlerini içerir) yerel makinenden CI ortamına kopyalamayı öneriyor. Ancak bu yaklaşımın doğrulamayı tamamen devre dışı bırakmaktan mutlaka daha güvenli olduğunu düşünmüyorum.

Buradaki kilit nokta bağlam: Xcode Cloud, özellikle uygulamanı derlemek için sandbox’lanmış bir ortamda çalışıyor. Üretim sistemlerinde rastgele kod çalıştırmıyor. Geliştirme ekibine ve sürüm iş akışına güvenemiyorsan, muhtemelen CI ortamında çalışan macro’lardan çok daha büyük güvenlik endişelerin vardır.

Bu Çözümün Artan Önemi

Swift gelişmeye devam ettikçe, giderek daha fazla üçüncü parti paket, minimum boilerplate ile güçlü özellikler sunmak için macro’ları uyguluyor. Örneğin:

  • TranslateKit SDK yerelleştirme macro’ları sunuyor

  • Çeşitli loglama ve hata ayıklama kütüphaneleri macro’ları benimsiyor

  • UI framework’leri view tanımlamalarını basitleştirmek için macro kullanıyor

Bu eğilim, geliştiriciler derleme zamanı metaprogramlama için yeni kullanım alanları keşfettikçe daha da hızlanacak. CI pipeline’larında macro’ları yönetmek için güvenilir bir çözüme sahip olmak, Swift projeleri için giderek daha önemli hale gelecek.

Macro güven sorununu çözdüğüne göre, Xcode Cloud’un yeteneklerinden tam olarak yararlanabilirsin. Aslında bir sonraki makalemde ve eşlik eden videomda Xcode Cloud’u App Store deployment’ları için nasıl kullanacağını keşfedeceğim. Bu yaklaşım, özellikle benim gibi birden fazla Apple platformunda (iOS, macOS, visionOS) yayınlıyorsan, build’leri beklemekten önemli ölçüde zaman kazandırabilir. Bunun için bizi takipte kal ve keyifli kodlamalar!

Bu yazıyı beğendin mi? Swift ipuçları ve indie geliştirici güncellemeleri için Bluesky ve Mastodon üzerinden takip et.