iOS
TestFlight
CircleCI

新しいCircleCIの機能で、iOSアプリをTestFlightに上げる

More than 1 year has passed since last update.

基本的には、 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に下記のように追加します。


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でやっています。


Fastfile

  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セクションで実行します。


circle.yml

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からアップロードしてみる、ってのも良いかもしれません。