百戦錬磨 Techブログ

公認民泊プラットフォーム「STAY JAPAN」を提供する株式会社百戦錬磨のTechブログ

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」を利用します。

github.com

matchのコンセプトは、英語ですがこちらのサイトに綺麗にまとまっています。

Code Signing Guide for Teams

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リポジトリで管理し、複数の開発者が横断的にリポジトリにアクセスして利用できるようにする
  • 証明書が壊れたり期限切れになっても自動で修復し、簡単に複数の開発者にシェアできる

構成としては以下のようなイメージです。 f:id:asmz0:20170512000918p:plain:w600

基本的な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」は使用しないようにしておくこと

基本コマンドの説明

基本的には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アプリ開発はこの辺の環境設定周りでつまづくことが割と多いので、このような便利ツールを活用して面倒な作業は減らして、極力アプリ実装に時間を割きたいところですよねー。

というわけで、このようにアプリ開発に集中できる環境を構築中の弊社では、仙台でアプリエンジニアの募集を開始しました! ご興味ある方は是非ご連絡ください!

www.wantedly.com

参考

以下のサイトを参考にさせて頂いております。有益な情報の掲載ありがとうございます!

iOSアプリ開発に必要な証明書とプロファイルをGitHubのリポジトリで一括管理する - Qiita

Bitrise Xcode 8.1などのSierra製CIマシンとfastlaneの組み合わせでビルドが固まる問題が解決🎉