App Store Connect API key を使って fastlane + Jenkins で App Store Connect にデプロイする

App Store Connect が二段階認証必須になったので fastlane でデプロイするときに工夫が必要になりました。

コベリンでは Jenkins を使って iOS アプリをデプロイしているのでその方法を紹介します。

fastlane での認証方法

認証方法の選択

fastlane のドキュメント(開くの面倒な人のためにスクショも貼りました)によると Apple のサービスへの接続には App Store Connect API key を使うことが推奨されています。ただし一部の機能(fastlane の precheck とか)が使えないのでその場合は別の方法を使う必要があります。

f:id:mironal:20210402165712p:plain
fastlane doc

一部の機能の中に自分たちが使っているものはなかったので App Store Connect API key を使った方法を選択しました。

API key の作り方

https://appstoreconnect.apple.com/access/api にアクセスして key を作ります。恐らく強めの権限を持っているユーザーしか作成できません。

key ファイルのダウンロードは一度だけしかできないのでちゃんと保存します。弊社では 1password の機密ドキュメントに保存しています。

API key の使い方

fastlane で API key を使うにはいくつかの方法がありますが今回は JSON ファイルに書いてそのファイルへのパスを環境変数で渡す方法にしました。

https://docs.fastlane.tools/app-store-connect-api/Using fastlane API Key JSON file で説明されている方法です。

以下のようなフォーマットで json ファイルとして保存します。注意点としては "key" の内容は先ほどダウンロードした key ファイルの中身を貼るのですが、改行されている箇所を \n に置き換えて一行で書く必要があります(補足参照)。

{
    "key_id": "D383SF000みたいな IDで https://appstoreconnect.apple.com/access/api からコピペできる",
    "issuer_id": "これも https://appstoreconnect.apple.com/access/api からコピペできる",
    "key": "-----BEGIN PRIVATE KEY-----\n〜〜〜 でさっきダウンロードした key の中身"
}

この JSON ファイルを適当な名前で保存して fastlane 実行時に

export APP_STORE_CONNECT_API_KEY_PATH=path/to/json

という環境変数でパスを渡してあげます。

これで fastlane を使ってデプロイなどの操作を行うことができます。

key の補足

例えばダウンロードした key ファイルが以下のような内容なら。

-----BEGIN PRIVATE KEY-----
AAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBB
CCCCC
-----END PRIVATE KEY-----

以下のように変換して貼り付けます。

-----BEGIN PRIVATE KEY-----\nAAAAAAAAAAAAAAAAAAAAAA\nBBBBBBBBBBBBBBBBBBBBBBB\nCCCCC\n-----END PRIVATE KEY-----

Jenkins での設定

Jenkins で使用する場合は認証情報に Secret file を追加して、プロジェクトの設定から 秘密テキストやミニつファイルを使用する を選択して秘密ファイルを使えるようにします。

以下のように環境変数 APP_STORE_CONNECT_API_KEY_PATH に設定すると export されている状態になります。

この方法でやると mac の Jenkins で起こりがちな SIP の問題(Operation not permitted って出ちゃうやつ)を回避することが可能です。

f:id:mironal:20210402174357p:plain

f:id:mironal:20210402174428p:plain

まとめ

今回は fastlane + Jenkins の環境で App Store Connect API key を使う方法を説明しました。

結構簡単なので皆さんぜひお試しください。