Swift・iOS

Swiftを中心に学んだことを記録に残すブログです。技術に関係ない記事もたまに書いています。

【fastlane】証明書を管理する

 

はじめに

【fastlane】テストを実行して結果をSlackに投稿する - Swift・iOSの続きです。今回は証明書の管理について書きたいと思います。個人的には、最初にコード署名やmatchについての公式ドキュメントを読んだ感想として、「なんとなくわかるけど・・・どう設定すればいいのかいまいちわからない。。」みたいな気持ちになったのですが、同じように公式ドキュメントを読んだだけではイメージがつかないと感じている方がいれば参考にしていただければと思います。

 

基本的には以下ドキュメントに従って、証明書の作成と更新について説明します。

match - fastlane docs

※手動プロビジョニングで対応する場合の手順となります。

Apple Developerで、既に開発者証明書や、対象のプロジェクト用のApp ID、プロビジョニングプロファイルを作成している場合は、手順を始める前に削除してください。

 

環境

macOS Catalina 10.15.7

Xcode 12.0.1

bash 3.2.57

・bundler 2.1.4

・fastlane 2.168.0

Visual Studio Code 1.50.1

GitHub

 

手順

プライベートリポジトリを作成

プロジェクトのリポジトリとは別に、開発者証明書とプロビジョニングプロファイルを格納するためのGitのプライベートリポジトリを作成。

f:id:hfoasi8fje3:20201122142730p:plain

 

SSHのURLをコピー。

f:id:hfoasi8fje3:20201122143209p:plain

 

App IDを作成

※公式ドキュメントの該当箇所:https://docs.fastlane.tools/actions/produce/

 

ターミナルを開いて、プロジェクトファイルのある階層(xcodeprojファイルがある階層)に移動。

以下のコマンドを実行。

bundle exec fastlane produce  -a {Bundle ID}

 

以下が表示されたら、Apple Developer Programに登録しているApple IDのアカウント名(メールアドレス)を入力してEnter。

To not be asked about this value, you can specify it using 'username'
Your Apple ID Username:     

 

以下でApp IDの名前(任意の文字列)を入力してEnter。

成功するとApple Developer > Certificates, Identifiers & Profiles > IdentifiersにApp IDが追加され、App Store Connectにアプリが作成される。

To not be asked about this value, you can specify it using 'app_name'
App Name: 

 

matchを初期化

※公式ドキュメントの該当箇所:https://docs.fastlane.tools/actions/match/#setup

 

プロジェクトファイルのある階層で、以下コマンドを実行。

bundle exec fastlane match init

 

1を入力してEnter。

fastlane match supports multiple storage modes, please select the one you want to use:
1. git
2. google_cloud
3. s3
?  

 

コピーしていたプライベートリポジトリのURLをペーストしてEnter。

Please create a new, private git repository to store the certificates and profiles there
URL of the Git Repo: 

 

成功すると、fastlaneフォルダの中にMatchfileが生成される。

f:id:hfoasi8fje3:20201122145902p:plain

 

Matchfileを編集

Matchfileを開くと以下のようになっている。

git_url("{プライベートリポジトリのURL}")

storage_mode("git")

type("development") # The default type, can be: appstore, adhoc, enterprise or development

# app_identifier(["tools.fastlane.app", "tools.fastlane.app2"])
# username("user@fastlane.tools") # Your Apple Developer Portal username

# For all available options run `fastlane match --help`
# Remove the # in the beginning of the line to enable the other options

# The docs are available on https://docs.fastlane.tools/actions/match

 

app_identifierとusernameを変更する。

#を削除して、app_identifierをプロジェクトのBundle IDに変更、usernameはApple Developerに登録しているアカウント名(メールアドレス)に変更。変更を上書き保存。

app_identifier("{Bundle ID}")
username("{Apple Developerに登録しているアカウント名}")

 

証明書とプロビジョニングプロファイルを作成

※公式ドキュメントの該当箇所:https://docs.fastlane.tools/actions/match/#run

 

プロジェクトファイルのある階層で以下コマンドを実行。

bundle exec fastlane match development

 

パスワードを求められたら、Apple Developer Programに登録しているApple IDのパスワードを入力してEnter。

-------------------------------------------------------------------------------------
Please provide your Apple Developer Program account credentials
The login information you enter will be stored in your macOS Keychain
You can also pass the password using the `FASTLANE_PASSWORD` environment variable
See more information about it on GitHub: https://github.com/fastlane/fastlane/tree/master/credentials_manager
-------------------------------------------------------------------------------------
Password (for ~):

 

キーチェーンのパスワード(PC端末のパスワード)を入力してEnter。

Starting login with user ~
Successfully logged in
Enter the password for ~/Library/Keychains/login.keychain-db
This passphrase will be stored in your local keychain with the name fastlane_keychain_login and used in future runs
This prompt can be avoided by specifying the 'keychain_password' option or 'MATCH_KEYCHAIN_PASSWORD' environment variable
Password for login keychain: 

 

以下が表示されたら、証明書の暗号化と複合時に必要なパスワードを指定する。任意の文字列を入力してEnter。

Enter the passphrase that should be used to encrypt/decrypt your certificates
This passphrase is specific per repository and will be stored in your local keychain
Make sure to remember the password, as you'll need it when you run match on a different machine
Passphrase for Match storage: 

 

以下が表示されたら成功。

All required keys, certificates and provisioning profiles are installed 🙌

 

作成が成功すると、キーチェーンに開発者証明書が自動で読み込まれ、ローカルに開発用プロビジョニングプロファイルが自動でインストールされる。

プロビジョニングプロファイルをダブルクリックしてXcodeに取り込む。

f:id:hfoasi8fje3:20201122164503p:plain

 

また、証明書の管理用に作成したプライベートリポジトリへ、開発者証明書とプロビジョニングプロファイルが自動でプッシュされる。

f:id:hfoasi8fje3:20201122164835p:plain

 

以下コマンドを実行して、adhocとappstore用の開発者証明書とプロビジョニングプロファイルも作成する。

bundle exec fastlane match adhoc
bundle exec fastlane match appstore

 

Signingの警告が出てしまう場合

プロビジョニングプロファイルの作成は成功したものの、"Provisioning profile "match Development ~" doesn't include signing certificate "Apple Development: ~"のような、Xcode側でSigningの警告が出てしまう場合は、別の証明書が残ったまま本手順を開始した可能性があります。Apple Developerに登録した開発者証明書とプロビジョニングプロファイルを「全て」削除していい場合は、以下コマンドを実行して削除してください。また、キーチェーンに登録した開発者証明書も全て削除してから再度matchを実行してみてください。

bundle exec fastlane match nuke development
bundle exec fastlane match nuke distribution
bundle exec fastlane match nuke enterprise

※参考:https://docs.fastlane.tools/actions/match/#nuke

※注意:nukeを実行しても、プロビジョニングプロファイルが全て削除されない場合があります。もし証明書の削除と再作成を行っても警告が出てしまう場合は、MobileDeviceフォルダに削除されていないプロビジョニングプロファイルがないか確認してみてください。

※上記の通りに再作成しても警告が出る場合は、Xcodeを再起動してください。

 

証明書とプロビジョニングプロファイルの更新

以下のコマンドで開発者証明書とプロビジョニングプロファイルを削除。

Apple Developerに登録している「全ての」開発者証明書とプロビジョニングプロファイルが削除されることに注意。

bundle exec fastlane match nuke development
bundle exec fastlane match nuke distribution
bundle exec fastlane match nuke enterprise

 

削除完了後、以下のコマンドで証明書とプロビジョニングプロファイルを作成。

bundle exec fastlane match development
bundle exec fastlane match adhoc
bundle exec fastlane match appstore

 

開発メンバーのPCに証明書をインストール

※これまでの手順を「管理者側の手順」として、下記説明しています。

まず、管理者側で開発者証明書とプロビジョニングプロファイルを管理しているプライベートリポジトリに、開発メンバーのGitHubアカウントがアクセスできるよう読み取り権限を付与する。プライベートリポジトリのSettingを選択後、Manage accessで設定できる。

 

その後、開発メンバーのPCにクローンしているプロジェクトの階層で、以下コマンドを実行してfastlaneをインストールする。

sudo bundle install

 

以下のコマンドを実行。matchのパスワード(管理者側で設定した証明書の暗号化と複合時に必要なパスワード)を聞かれるので、管理者からパスワードを共有してもらい入力。次にログインキーチェーンのパスワードを聞かれるので、開発メンバーのPC端末のパスワードを入力。パスワードに誤りがなければ証明書がインストールされる。

bundle exec fastlane match development —readonly
bundle exec fastlane match adhoc —readonly
bundle exec fastlane match appstore —readonly

 

プライベートリポジトリをクローンできずにエラーになる場合
[20:25:58]: Cloning remote git repo...
[20:25:58]: If cloning the repo takes too long, you can use the `clone_branch_directly` option in match.
Cloning into ~ …
fatal: could not read Password for ~: terminal prompts disabled
[20:26:05]: Exit status: 128
[20:26:05]: Error cloning certificates repo, please make sure you have read access to the repository you want to use
[20:26:05]: Run the following command manually to make sure you're properly authenticated:
[20:26:05]: $ git clone ~

[!] Error cloning certificates git repo, please make sure you have access to the repository - see instructions above

上記のようなエラーが発生する場合は、開発メンバー側のSSH接続の設定が漏れている可能性があります。参考記事を以下に記載しておきます。

※参考:GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~ - Qiita

また、管理者側はMatchfileのgit_urlがSSHのURLになっているかも確認してみてください。

 

matchのパスワード入力を省略したい場合

管理者側でMatchfileに環境変数を設定しておくと、開発メンバー側が証明書をインストールする際にmatchのパスワード(証明書の暗号化と複合時に必要なパスワード)の入力を省略できる。

ENV["MATCH_PASSWORD"] = "{matchのパスワード}"

 

おわりに

「証明書の管理」というテーマに当てはまるような公式ドキュメントを探すと、コード署名の管理指針や、match、produceといった複数のドキュメントが該当します。そのため、最初はそれぞれのドキュメントの内容を自分の頭の中で整理して、fastlaneを使った証明書管理の全体イメージを捉えることに苦戦しました。(その結果、冒頭の「なんとなくわかるけど・・・どう設定すればいいのかいまいちわからない。。」になったのだと思います笑)

ただ、実際に自分で証明書を作成してみる中で理解が少しずつ深まったので、今後も実際に動かしながらfastlaneの理解を深めていければと思います。

 

参考