SwiftLintのXcodeビルドツールプラグインにおけるフィンガープリント検証の無効化
SwiftLintは、CI環境での自動ビルド時には、Xcodeのセキュリティ機能によって一部の問題が生じることがあります。ここでは、これらの問題を回避するために、フィンガープリント検証を無効にする方法について説明します。
Xcodeのフィンガープリント検証とは?
フィンガープリント検証は、ソフトウェアやデータが改ざんされていないことを確認するためのプロセスです。Xcodeでは、インストールされているプラグインやマクロの「フィンガープリント」をチェックすることで、そのソースが信頼できるかどうかを検証しています。
しかし、CI環境ではこの検証プロセスが障害となることがあります。特に、自動化されたビルドプロセスでは、この検証ダイアログが表示されるとプロセスが中断され、時間のロスやビルドの失敗を招くことがあります。
フィンガープリント検証の無効化方法
SwiftLintのXcodeビルドツールプラグインのREADME[1]には、以下の2つの方法でフィンガープリント検証を無効にすることができると記述されています:
-
xcodebuild
コマンドに-skipPackagePluginValidation
と-skipMacroValidation
を個別に渡す方法。 -
defaults write
コマンドを使用して、Xcodeの設定をグローバルに変更する方法。具体的には次のコマンドを使用して、特定のユーザーのXcode設定を変更します。
defaults write com.apple.dt.Xcode IDESkipPackagePluginFingerprintValidatation -bool YES defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES
これにより、Xcodeはパッケージプラグインとマクロのフィンガープリント検証をスキップするように設定されます。
セキュリティリスクと注意点
フィンガープリント検証を無効にすると、セキュリティリスクが高まる可能性があります。改ざんされたファイルや悪意のあるコードが含まれるプラグインを誤って使用するリスクがあります。したがって、この設定は特定の開発環境やテスト環境でのみ一時的に使用し、一般的な使用では推奨されません。
また、これらの設定はローカル環境で設定する場合、特定のユーザーアカウントにのみ影響を与え、システム全体には影響しません。これはmacOSでは、各ユーザーアカウントには個別の設定(プリファレンス)があり、これらの設定は他のユーザーアカウントやシステム全体には影響しないということを意味します。
CI環境での設定方法
CI環境でこれらの設定を行う場合、ビルドスクリプトやCIの設定ファイルにこれらのコマンドを追加する必要があります。
CircleCIの場合のCI環境での設定方法
xcodebuild
コマンドに -skipPackagePluginValidation
と -skipMacroValidation
を個別に渡す方法
1.
xcodebuild
コマンドを書いている場合
CircleCIで xcodebuildのオプションに -skipPackagePluginValidation
と -skipMacroValidation
を追加します。
CircleCIとFastlaneを組み合わせて使用している場合
Fastlaneのgymのオプションをカスタマイズします。
ビルドプロセスを定義するためのブロック( lane :build do |options|
)内のgymツールには、xcodebuildに追加の引数を渡すために使用するxcargsがあります。
xcargsに -skipPackagePluginValidation -skipMacroValidation
を設定します。具体的には以下のように記述します:
lane :build do |options|
gym(
#他の設定
xcargs: [
## SwiftLintのXcodeビルドツールプラグインにおけるフィンガープリント検証を無効化
## - SeeAlso: https://github.com/realm/SwiftLint#xcode-1
"-skipPackagePluginValidation",
"-skipMacroValidation",
]
.join(" ")
)
end
xcargsの書き方(正確にいうとRubyの文字列連結の書き方)は他にも以下のような書き方ができます。
xcargs: "-skipPackagePluginValidation -skipMacroValidation"
xcargs: "-skipPackagePluginValidation \
-skipMacroValidation"
xcargs: "-skipPackagePluginValidation "\
"-skipMacroValidation"
なお、Rubyに不慣れな場合、ブラウザ上でコード実行できるツールを使って、実際にそのコードが有効かを試すとよいです。
例えば以下のコードを実行することで、どのような文字列になるかが確認できます。
puts
が標準出力に出力するメソッドです。
xcargs = [
# SwiftLintのXcodeビルドツールプラグインにおけるフィンガープリント検証を無効化
# - SeeAlso: https://github.com/realm/SwiftLint#xcode-1
"-skipPackagePluginValidation",
"-skipMacroValidation",
].join(" ")
puts xcargs
-skipPackagePluginValidation -skipMacroValidation
defaults write
コマンドを使用して、Xcodeの設定をグローバルに変更する方法
2. .circleci/config.yml
ファイルにこれらのコマンドをビルドプロセスの適切な場所に追加します。ビルドの前に置きます。
- run:
name: Disable Xcode Fingerprint Validation
command: |
defaults write com.apple.dt.Xcode IDESkipPackagePluginFingerprintValidation -bool YES
defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES
- run:
name: build .ipa // ビルド
上記「1.」や「2.」の設定により、CIプロセス中にフィンガープリント検証が無効にされ、ビルドがスムーズに進行するようになります。
Xcode Cloudの場合の設定方法
カスタムビルドスクリプトを書きます。
Apple公式のドキュメントによると、projectまたはworkspaceで ci_scripts
という名称のグループを作成し、 ci_pre_xcodebuild.sh
という名称のスクリプトを作成します。
中身の例としては以下のとおりです。
ci_pre_xcodebuild.sh:
#!/bin/sh
set -e
defaults write com.apple.dt.Xcode IDESkipPackagePluginFingerprintValidatation -bool YES
defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES
まとめ
SwiftLintのXcodeプラグインをCI環境で効率的に使用するためには、フィンガープリント検証を無効にすることが有効です。
Discussion
Ruby 公式のプレイグラウンドも軽量なのでおすすめです!
そんなのがあるんですね!ありがとうございます!