CI 環境における Swift マクロの問題
Xcode 15 で Swift 5.9 とともに導入された Swift マクロは、コード生成やコンパイル時のメタプログラミングを可能にする強力な機能です。開発者の生産性を大きく向上させますが、CI/CD パイプライン、特に Xcode Cloud において新たな課題をもたらしました。
ローカル環境で初めてマクロを使用すると、Xcode がダイアログを表示してマクロのパッケージを信頼するか確認します。開発マシンではこれで問題ありませんが、Xcode Cloud のような自動化環境ではダイアログの「OK」をクリックすることができないため、問題が発生します。
Swift マクロを使用するプロジェクトを Xcode Cloud でビルドしようとしたことがある方なら、このイライラするエラーに遭遇したことがあるでしょう:
Target must be enabled before it can be used.完全な解決策
調査の結果、Swift マクロを使用する Xcode Cloud ビルドで確実に動作する解決策を見つけました。実装方法は以下の通りです:
ステップ 1:CI スクリプトフォルダの作成
まず、CI スクリプト用の専用フォルダを作成します:
Xcode でプロジェクトを右クリック
「New Group」を選択
ci_scriptsと名前を付ける
ステップ 2:Post-Clone スクリプトの作成
次に、Xcode Cloud がリポジトリのクローン後に自動実行する post-clone スクリプトを作成します:
ci_scriptsフォルダを右クリック「New File」 → 「Empty File」を選択
ci_post_clone.shと名前を付ける
ステップ 3:スクリプトの内容を追加
新しい ci_post_clone.sh ファイルに以下のコードをコピー&ペーストします:
#!/bin/sh
# エラー時に終了(-e)、未定義変数をエラーに(-u)、パイプライン失敗を検知(-o pipefail)
set -euo pipefail
# Xcode のマクロフィンガープリント検証を無効にして、不要なビルドエラーを防止
defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YESこのスクリプトが行う重要なことは 1 つだけです:Xcode のマクロフィンガープリント検証を無効にすること。これが信頼ダイアログを表示させている原因です。
ステップ 4:スクリプトを実行可能にする
ターミナルを開き、プロジェクトフォルダに移動して以下を実行します:
chmod +x ci_scripts/ci_post_clone.shこのコマンドでスクリプトが実行可能になります。Xcode Cloud が正しく実行するために必要です。
ステップ 5:コミットしてビルドをトリガー
新しいファイルをリポジトリにコミットし、変更をプッシュします。これにより Xcode Cloud で新しいビルドがトリガーされ、マクロの信頼エラーなしで正常に完了するはずです。
設定後の見た目
正しく設定すると、プロジェクト構造に CI スクリプトフォルダと post-clone スクリプトが含まれます:

なぜこれで動くのか
Xcode Cloud は、プロジェクトのルートにある ci_scripts ディレクトリ内の ci_post_clone.sh という名前のスクリプトを自動的に実行します。このスクリプトは Xcode の設定を変更してマクロフィンガープリント検証を無効にし、信頼の要件を実質的にバイパスします。
defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES コマンドは、マクロを使用する前に明示的に信頼する必要があるかどうかを制御する、Xcode の特定の設定を変更します。
セキュリティに関する考慮事項
一部の開発者は、ローカルマシンの macros.json ファイル(信頼済みマクロのフィンガープリントを含む)を CI 環境にコピーすることを提案しています。しかし、このアプローチが検証を無効にするよりも安全だとは必ずしも思いません。
ここで考えるべき重要な点はコンテキストです。Xcode Cloud はアプリケーションのビルド専用のサンドボックス環境で実行されます。本番システムで任意のコードを実行しているわけではありません。開発チームとリリースワークフローを信頼できないのであれば、CI 環境でマクロが実行されることよりも、もっと深刻なセキュリティ上の懸念があるはずです。
この解決策の重要性が高まっている理由
Swift の進化に伴い、サードパーティパッケージがボイラープレートを最小限に抑えた強力な機能を提供するためにマクロを実装するケースが増えています。例えば:
TranslateKit SDK はローカライゼーションマクロを提供
さまざまなロギング・デバッグライブラリがマクロを採用
UI フレームワークがビュー宣言を簡素化するためにマクロを使用
コンパイル時メタプログラミングの新しいユースケースが開発者に発見されるにつれ、この傾向はますます加速するでしょう。CI パイプラインでのマクロ処理に対する信頼できる解決策を持つことは、Swift プロジェクトにとってますます重要になります。
マクロの信頼問題が解決できたところで、Xcode Cloud の機能をフル活用できるようになりました。実は、次の記事と動画で Xcode Cloud を App Store デプロイに活用する方法を紹介する予定です。このアプローチは、特に私のように複数の Apple プラットフォーム(iOS、macOS、visionOS)でリリースしている場合、ビルドの待ち時間を大幅に節約できます。ぜひお楽しみに。Happy Coding!

