基本的には、 https://circleci.com/docs/ios-code-signing/ の通りです。
設定が完了したものは https://github.com/noboru-i/kyouen-ios にあります。
(ほとんどは https://github.com/noboru-i/kyouen-ios/pull/29 のPRで行いました)
事前準備
CircleCiでiOSのビルドをするためには、Pricing and Plan Information - CircleCIにあるように、最低でも$39/月の課金が必要です。
また、GitHubとの連携設定や、fastlaneの利用のためのGemfileなどが必要です。
.p12
ファイルをアップロード
今回はTestFlightで配信するため、"iOS Distribution"の証明書を発行しておき、CircleCIにアップロードします。
一度アップロードすると、ダウンロードすることは出来ないっぽいので、パスワード無しでも良いかと。
ここに登録しておくだけで、MACHINEセクションの"Install Code Signing Credentials"のタイミングで読み込まれます。
provisioning profileをリポジトリに格納
.mobileprovision
を"Certificates, Identifiers & Profiles"からダウンロードし、リポジトリに格納しておきます。
おそらく、どこに置いておいても良さそうですが、今回はfastlane/cert/*.mobileprovision
に置きました。
これも、置いておくだけで自動的に読み込まれるようになっています。
GYM_CODE_SIGNING_IDENTITY
の設定
環境変数として、証明書の名前(?)が必要なようです。
circle.ymlに下記のように追加します。
machine:
environment:
GYM_CODE_SIGNING_IDENTITY: "iPhone Distribution: NOBORU ISHIKURA (56W5SXE4HE)"
CircleCIに環境変数を設定
FASTLANE_USER / FASTLANE_PASSWORD という変数で、TestFlightにアップロードするためのApple IDを設定します。
fastlaneの設定
以前までは、Fastfileの中でkeychainの作成や、そこへの証明書の登録などを行っていました。
ただ、CircleCIのアップデートにより、そのへんは不要になったようです。
全体はこちらのFastfileにあります。
- plistのbuild numberを、CircleCIのビルド番号に置き換えています。
これは、TestFlightにアップロードする際、前回よりも増えていないといけないためです。 - ipaファイルの生成を行います。
- TestFlightにアップロードします。
といった内容を下記のlaneでやっています。
desc 'Submit a new Release Build to TestFlight'
lane :release do
set_info_plist_value(
path: plist_file_path,
key: 'CFBundleVersion',
value: ENV['CIRCLE_BUILD_NUM']
)
gym(
scheme: scheme_name_store,
configuration: "Release",
use_legacy_build_api: true
)
pilot(skip_submission: true)
end
circle.ymlの設定
上記のrelease laneを、deploymentセクションで実行します。
deployment:
release:
branch: release
commands:
- bundle exec fastlane release
この状態で、releaseブランチに変更が行われると、CircleCIが動き、TestFlightにipaをアップロードしてくれます。
iTunes Connectの設定
上記までで、TestFlightにipaは存在するので、それとテスターを紐付けます。
対象のアプリページにある、"TestFlight"から、"内部テスト"を選択し、"テストするバージョンを選択"からアップロードしたバージョンを選択します。
ただ、ipaをアップロードしてからTestFlight側の処理に時間がかかるようで、10分〜多い時では30分程度かかって、選択可能になることがありました。
次に、テスターを追加します。
ここで選択できるのは、iTunesConnect上で設定されているロールを持つアカウントのみのようです。
選択できない場合は、"ユーザと役割"から、"iTunes Connect ユーザ"を追加しておく必要があります。
まとめ
ここまで1度設定しておけば、releaseブランチを変更すると、iOS端末にPUSH通知が届き、インストールが出来るようになります。
便利ですね。
詰まったことメモ
アプリは配信されるが、インストール時に "Could not install App"みたいな表示が出て、インストール出来ない
たしか、GYM_CODE_SIGNING_IDENTITY
を設定することで直りました。
いろいろ調べてみると、おそらく違う証明書とかで何故かipaが作れちゃって、それが飛んでたのではないかと。
証明書・Provisioning Profile(内部のUDID登録など)を見直すと、うまくいくかも?
また、問題の切り分けのために、手元でXcodeからアップロードしてみる、ってのも良いかもしれません。