fastlane matchを用いた証明書マネジメント

### はじめに(＞ヮ＜)
前回からかなり期間が空いてしまいましたが，隙をみてQiitaへの投稿を再開してみようと思います．
一応近況としては，アプリケーションエンジニアとして働いている[@mofneko](https://github.com/mofneko)です．

今回の内容はiOSアプリのチーム開発における証明書(Provisioningファイルを含む)管理の場所と更新方法の一元化についてご紹介します．
＊タイトルをみて本章の内容に検討がつくようであればこの文章は読み足りないとおことわりしておきます．
勿論この方法が全てではありませんが，僕の中では複数の人間に適切な役職(取得できるProvisioningの種類，更新を誤ってさせない)を割当てられる合理的な手段となっているので，Xcodeの管理にとってかわる1つの選択肢として初心者向けにレクチャーします．

### 証明書の自前管理は危険
証明書の管理といっても個人開発の方はXcodeによって自動的に再登録とダウンロードまでの更新処理が行えますが，複数人開発の場合でタスクを全て自動化されているとブラックボックスの弊害として，
誰かがFix Issueボタンを押下して証明書が更新されてしまったなどといったミス，そしてPCから証明書の流出が認められる事件など様々なインシデントの元となる危険があります．
そこでコマンドラインによって作業内容を限定して実行できるfastlane matchをご紹介します．

### fastlaneについて
さて，fastlaneをご存知でしょうか．
主にネイティブアプリ開発におけるコーディング以外の様々な雑務を自動化を担ってくれるツールです．
実際は用途毎に分割された複数のアクションがあり，それらの集合をfastlaneという巨大なプロダクト内部で管理しています．
GoogleがメンテナになっているのでGooglePlayStoreとの親和性は高いです．Apple ConnectAPIについては非公式で叩いているので，Apple側の仕様変更によって稀に不具合はありますが活発に更新されているのですぐに修正されるはずです．
肝心のインストール方法に関しては今回の本質と離れるので割愛します．下記を参考にしてください．
[Getting started with fastlane for iOS
](https://docs.fastlane.tools/getting-started/ios/setup/)

### fastlaneの各ファイルについて
fastlaneにはfastfile，matchfile，appfileといった~fileというファイルが存在します．
(iOSプロジェクトのOSSを眺めているとfastlaneディレクトリがあってその配下にあるアレですね)
このファイル群は各アクションの設定を記入するものになり，必要な事項はアクションによって異なります．今回はfastlane matchアクションをコマンドラインで使用する為にmatchfileを作ります．次のセクションで手順を紹介します．

### 下準備
- fastlane matchにはgitリポジトリに対して証明書を暗号化して保管してくれる機能があるので，あらかじめgithubやbitbucketに**プライベートリポジトリ**を作成します．間違えてもpublicに設定はしないように注意してください．
- 次にfastlane matchコマンドのinitを使用してmatchfileの雛形を作成しておきます．下記を実行してください．

```sh
fastlane match init
```
- 生成されたmatchfileの中身は以下のようになっているので，ここではapple idと先ほどのプライベートリポジトリを指定します．


```rb
git_url("") # 最初の手順で作成したgitリポジトリを指定してください

type("") # Provisioningタイプappstore, adhoc, enterprise or developmentを指定してください

app_identifier("") # Developer Portalで設定したAppID

username("") # Apple Developerにおけるメールアドレス
```

設定ファイルの各項目は必須ではなく，コメントアウトもしくは削除して，次のセクションで紹介するfastlane matchコマンド実践編でオプションとして各パラメータを渡すこともできます．しかし，チーム開発の中で指定パラメータを簡略化，間違えを阻止するためにも全て指定することを推奨します．上記の設定はコマンド実行時のオプションによってオーバーライドされます．

### matchコマンドの使用(証明書・Provisioningの作成編)
下準備が完了した所で，いよいよ証明書作成作業を行います．下記のコマンドを実行してください．

```sh
fastlane match
```

- 初回でAppStoreConnectへのログインが求められるのでIDを入力Enter, Passwordを入力Enterでログインしましょう．
- ログインが完了するとパスフレーズが求められます．こちらはmatchコマンドを実行して取得した証明書を暗号化してgitリポジトリにプッシュするための鍵で，リポジトリに配置した証明書を別のPCにインストールする際に必要になります．

＊ポイントとして証明書のタイプ毎に鍵とリポジトリを変更できるのでチーム開発の場合は役職ごとに適切なProvisioningタイプのみを扱えるように鍵やリポジトリを分けて，配布も適切に管理しましょう．
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/20947/859e5e18-081a-ed01-f810-dc5c6c0d916d.png)
無事に証明書の作成と取得，gitリポジトリへのプッシュが完了するとshellが返却されるので，設定したgitリポジトリを確認すると上記のようになります．
certsに証明書 profilesに指定したタイプ毎にディレクトリが切られProvisioningファイルが配置されています．
本セクションでは管理人，チームリーダーが一度行えば更新までは取得のみの操作でチーム開発ができるようになります．細かいですがメリハリを付けるために次のセクションにて紹介します．

### fastlane matchコマンドの使用(証明書・Provisioningの取得編)
前回のセクションで作成した証明書類を他のマシンで使用するために取得する方法を紹介します．(証明書の作成を行ったマシンにはインストール済みなので本手順は不要です) matchfileのあるディレクトリにて下記を実行してください．

```sh
fastlane match --readonly
```

- 前回の手順と同様にAppStoreConnectへのログインが求められるのでIDを入力Enter, Passwordを入力Enterでログインしましょう．
- ログインが完了すると先程のパスフレーズが求められます．
- 入力後証明書類のインストールが完了します．

### まとめ
matchアクションによって本来であればAppStoreConnectとKeyChainを駆使しなくてはならない手順を簡潔に，かつ合理的に管理することができました．作成編のセクションで紹介した内容はJenkinsに定期更新させるなど設定しておくと人間が完全に触れない領域としてクリーンな状態を維持できると思います．

### Appendix
- Fastlane docs match [https://docs.fastlane.tools/actions/match/](https://docs.fastlane.tools/actions/match/)