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

  • 18
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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