fastlane matchを使ったiOS証明書、Provisioning Profileの導入管理
こんにちは。麦芽系などと言いつつ最近ずっと禁酒しておりましたノンアルコール麦芽系エンジニアasmz(id:asmz0)です。
というのも、私事で恐縮ですがこないだ我が家に無事第2子が生まれました!一週間ほど育休を取らせていただき、しっかり子供と戯れさせてもらったので、今週から心機一転お仕事頑張りまっす。
お祝いはてブお待ちしております。
iOSアプリ開発に必要な証明書とProvisioning Profile
さて、iOSアプリ開発の鬼門とも言われるCode Signing&Provisioning。最近はXcodeが改修されてきて、多くの処理が自動で行ってくれるようにはなってきたので、個人開発ではさほど大きな問題が発生しにくくなってきたようですが、証明書・秘密鍵の管理が個人のMacに依存したり、そもそも先述したXcodeの自動処理によって他の開発者に予期せぬ影響を与えたりと、相変わらず組織開発ではやりづらさがあります。
というわけで今回のエントリでは、この開発に必要な証明書やProvisioning Profileを一元管理し、複数の開発者でシェアできるようにするツールをご紹介します!
fastlane matchとは
先のエントリでも出てきましたが、iOS開発の各種作業を自動化してくれる便利ツール「fastlane」に内包されるaction「match」を利用します。
matchのコンセプトは、英語ですがこちらのサイトに綺麗にまとまっています。
What if there was a central place where your code signing identity and profiles are kept, so anyone can access them during the build process? This way, your entire team can use the same account and have one code signing identity without any manual work or confusion.
Instead of registering for yet another service, you can use a separate private Git repo to sync your profiles across multiple machines.
具体的には以下のようなことが行えます。
- 証明書及びProvisioning ProfileをXcodeプロジェクトとは別のGitリポジトリで管理し、複数の開発者が横断的にリポジトリにアクセスして利用できるようにする
- 証明書が壊れたり期限切れになっても自動で修復し、簡単に複数の開発者にシェアできる
構成としては以下のようなイメージです。
基本的なmatch利用フロー
matchを用いた基本的なフローは以下のような感じになります。
- 事前準備
- チームで共有するiOS Developerアカウントを1つ用意
- 証明書やProvisioning Profileを格納するプライベートGitリポジトリを用意
- match処理
- match初期化
- matchで証明書、Provisioing Profile作成
- 共有iOS DeveloperアカウントでiOS Dev Centerに証明書、Provisioing Profileを作成、及びプライベートGitリポジトリにコミット(秘密鍵含む)
- matchで証明書、Provisioing Profile取得
- プライベートGitリポジトリから証明書(&秘密鍵)、Provisioing Profileを取得し、実行されたマシンのKeychainにインポート
- Xcode作業
- プロジェクトで今回取得したProvisioing Profileを使用するよう指定
- プロジェクト設定で「Automatically manage signing」は使用しないようにしておくこと
- プロジェクトで今回取得したProvisioing Profileを使用するよう指定
基本コマンドの説明
基本的にはmatchのREADMEに記載されているのですが、今回はfastlane経由での利用を想定し、fastlane経由で利用する際の主なコマンドをFastfileでの記述と併せてご紹介します。
インストール
fastlaneを導入することで、自動的にmatchもインストールされるので割愛します。 fastlaneはRubyGemsやHomebrewで提供されています。
初期化
$ fastlane match init
matchを利用するための初期設定を行います。
具体的には上記で説明したプライベートGitリポジトリのURLを聞かれるので入力すると、その内容が記載されたMatchfile
が./fastlane
配下に作成されます。
証明書、Provisioning Profileの作成・取得
$ fastlane match development $ fastlane match adhoc $ fastlane match appstore
match type: "development" match type: "adhoc" match type: "appstore"
実際のところこのコマンドがmatchのほとんどの機能を占めているわけですが、前項「match利用フロー」にも記載した以下の処理を全て行ってくれます。
- matchで証明書、Provisioing Profile作成
- 共有iOS DeveloperアカウントでiOS Dev Centerに証明書、Provisioing Profileを作成、及びプライベートGitリポジトリにコミット(秘密鍵含む)
- matchで証明書、Provisioing Profile取得
- プライベートGitリポジトリから証明書(&秘密鍵)、Provisioing Profileを取得し、実行されたマシンのKeychainにインポート
コマンドのオプションとして証明書タイプを指定することで、そのタイプのみ作成・取得することが可能です。
証明書、Provisioning Profileの削除
$ fastlane match nuke $ fastlane match nuke development $ fastlane match nuke distribution
iOS Dev Centerへ登録されている全ての証明書、Provisioning Profileを削除して、クリーンな状態にします。
基本的に普段の運用で使用することはないですが、期限切れなど無効になったものがiOS Dev Centerに割と残りがちなので、環境を綺麗にしたい場合に実行したりします。
便利なオプション
Bundle Identifier指定
例えば、development、adhoc、appstoreそれぞれ違うBundle Identifierを割り振って、1端末内に複数テスト版アプリをインストールしたい場合などあるかと思いますが、その場合以下のような指定が可能です。
$ fastlane match development -a beer.asmz.iosapp-beta $ fastlane match adhoc -a beer.asmz.iosapp-staging $ fastlane match appstore -a beer.asmz.iosapp
match type: "development", app_identifier: "beer.asmz.iosapp-beta" match type: "adhoc", app_identifier: "beer.asmz.iosapp-staging" match type: "appstore", app_identifier: "beer.asmz.iosapp"
Provisioning Profileの作り直し
テスト機のUDIDをiOS Dev Centerに追加し、その内容を取り込んだProvisioning Profileを作り直して取得したい場合はforce_for_new_devices
オプションを追加します。
$ fastlane match development --force_for_new_devices
match type: "development", force_for_new_devices: true
なお、テスト機の追加は特になくとも問答無用でProvisioning Profileを作り直したい場合はforce
オプションを使用します。
$ fastlane match development --force
match type: "development", force: true
Read Only指定
新しく開発に参加する人のMacに証明書周りをセットアップしたい時などように、iOS Dev Center側の証明書類を更新する必要はなく、既にプライベートGitリポジトリに存在する証明書類を取得するだけで良い場合には、Read Onlyオプションを利用することができます。
$ fastlane match development --readonly
match type: "development", readonly: true
CIでの利用
こちらのサイトに詳しい記載がありますが、CI上で当作業を行おうとするとビルドが固まる問題があります。
Bitrise Xcode 8.1などのSierra製CIマシンとfastlaneの組み合わせでビルドが固まる問題が解決🎉
ローカル環境だとそこでログインパスワードを入力すれば良いのですが、CI上ではそれができないため、対策として事前にCI上で任意の名前とパスワードを設定したキーチェーンを用意し、その値を環境変数から指定します。
# match実行前に行う desc "Create keychain (for CI)" lane :keychain do if Helper.is_ci? create_keychain( name: ENV["MATCH_KEYCHAIN_NAME"], password: ENV["MATCH_KEYCHAIN_PASSWORD"], timeout: 1800 ) end end
まとめ
iOSアプリ開発はこの辺の環境設定周りでつまづくことが割と多いので、このような便利ツールを活用して面倒な作業は減らして、極力アプリ実装に時間を割きたいところですよねー。
というわけで、このようにアプリ開発に集中できる環境を構築中の弊社では、仙台でアプリエンジニアの募集を開始しました! ご興味ある方は是非ご連絡ください!
参考
以下のサイトを参考にさせて頂いております。有益な情報の掲載ありがとうございます!
iOSアプリ開発に必要な証明書とプロファイルをGitHubのリポジトリで一括管理する - Qiita
Bitrise Xcode 8.1などのSierra製CIマシンとfastlaneの組み合わせでビルドが固まる問題が解決🎉