🤖

SwiftLintのXcodeビルドツールプラグインにおけるフィンガープリント検証の無効化

2024/01/19に公開
3

SwiftLintは、CI環境での自動ビルド時には、Xcodeのセキュリティ機能によって一部の問題が生じることがあります。ここでは、これらの問題を回避するために、フィンガープリント検証を無効にする方法について説明します。

Xcodeのフィンガープリント検証とは?

フィンガープリント検証は、ソフトウェアやデータが改ざんされていないことを確認するためのプロセスです。Xcodeでは、インストールされているプラグインやマクロの「フィンガープリント」をチェックすることで、そのソースが信頼できるかどうかを検証しています。

しかし、CI環境ではこの検証プロセスが障害となることがあります。特に、自動化されたビルドプロセスでは、この検証ダイアログが表示されるとプロセスが中断され、時間のロスやビルドの失敗を招くことがあります。

フィンガープリント検証の無効化方法

SwiftLintのXcodeビルドツールプラグインのREADME[1]には、以下の2つの方法でフィンガープリント検証を無効にすることができると記述されています:

  1. xcodebuild コマンドに -skipPackagePluginValidation-skipMacroValidation を個別に渡す方法。

  2. 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環境での設定方法

1. xcodebuild コマンドに -skipPackagePluginValidation-skipMacroValidation を個別に渡す方法

CircleCIで xcodebuild コマンドを書いている場合

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に不慣れな場合、ブラウザ上でコード実行できるツールを使って、実際にそのコードが有効かを試すとよいです。

https://paiza.io/ja/projects/new

例えば以下のコードを実行することで、どのような文字列になるかが確認できます。
puts が標準出力に出力するメソッドです。

xcargs = [
    # SwiftLintのXcodeビルドツールプラグインにおけるフィンガープリント検証を無効化
    # - SeeAlso: https://github.com/realm/SwiftLint#xcode-1
    "-skipPackagePluginValidation",
    "-skipMacroValidation",
].join(" ")
puts xcargs

-skipPackagePluginValidation -skipMacroValidation

2. defaults write コマンドを使用して、Xcodeの設定をグローバルに変更する方法

.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の場合の設定方法

カスタムビルドスクリプトを書きます。

https://developer.apple.com/documentation/xcode/writing-custom-build-scripts

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環境で効率的に使用するためには、フィンガープリント検証を無効にすることが有効です。

脚注
  1. https://github.com/realm/SwiftLint#xcode-1 ↩︎

Discussion

みはるんみはるん
  • スクリプトが間違っていたため修正しました😱
- defaults write com.apple.dt.Xcode IDESkipPackagePluginFingerprintValidation -bool YES
+ defaults write com.apple.dt.Xcode IDESkipPackagePluginFingerprintValidatation -bool YES
  • 「Xcode Cloudの場合の設定方法」を追記しました🎉