読者です 読者をやめる 読者になる 読者になる

CircleCI & iOS自動配布 ベストプラクティス(法人アカウント編)

前職、現職、そしてプライベートのプロジェクトをやるうちにiOSのテスト・ビルド・配布の自動化について知見が貯まってきたので、シェア。


前提

このポストで扱うiOSプロジェクトは以下のような構成になっている前提です。

  • プロジェクト内にBundle Identifierの異なるAdHoc、Releaseビルドが存在している。
  • AdHoc、Releaseビルドはtargetベースではなく、scheme、configurationベースで管理されている。


導入のメリット

このポストをプロジェクトに適用すると、

  • developブランチにマージされた際に、自動的に開発チームに配布される
  • masterブランチにマージされた際に、自動的にiTunes Connectにアップロードされる

ようになり、ディレクターはエンジニアの作業に対する待ち時間がなくなり、
エンジニアも作業中に割り込まれることが少なくなるので、みんな幸せになれます、たぶん。

導入準備

プロジェクトへ適用する前に以下の作業を行う必要があります。

  • Developer権限のiTunes Connectアカウントを新規作成
  • 上記アカウントをiOS Dev CenterのPeopleからMemberとして招待し、追加

この作業を行うことで、Agent権限のアカウント同様、iTunes ConnectとiOS Dev Centerにアクセスすることができ、かつ適切に権限が制御されたアカウントを作り出すことができます。

テンプレートの構成

今回のテンプレートはこちらに置いてありますので、参照しながら読み進めてください。
テンプレートの中身としては、以下の通りです。

  • circle.yml
  • fastlane/AppFile
  • fastlane/Fastfile
  • Rakefile
  • tasks/security.rake
  • tasks/build.rake

circle.ymlに全体の流れを記載し、fastlane/ 内のファイルにはfastlaneで簡素化できる処理を記述、 fastlaneで対応できない細かい処理をrakeタスクで実行する、という感じになっています。

circle.yml

まず、circle.ymlの中身ですが、

  • Rakeタスクでcertificateを登録
    (rake security:add_key)
  • 必要に応じてCocoaPods、Carthageを更新
    (bundle exec fastlane setup)
  • テストを実行
    (bundle exec fastlane test)
  • Rakeタスクでビルド番号のインクリメント
    (rake build:prepare)
  • developブランチの場合、gymでarchiveを行い、任意のサービス(今回はCrashlytics)を利用してAdHocビルドを配布
    (bundle exec fastlane crashlytics)
  • masterブランチの場合、gymでarchiveを行い、pilotでiTunes Connectにアップロード
    (bundle exec fastlane beta)
  • ipaファイル、dSYMファイルをCircleCIのartifactsに保存
    (rake build:save)

といった作りになっています。

fastlane

Appfile

次に、 Appfileの中身ですが、 Fastlaneから参照するアプリの情報(Bundle Identifier、iTunes Connect、iOS Dev CenterにアクセスするためのAppleID)を記述するだけです。

Fastfile

Fastfileでは、 大きく以下の処理を行っています。

  • ライブラリの読込 (lane :setup)
  • テスト (lane : test)
  • ビルド & Crashlytics配信 (lane : crashlytics)
  • ビルド & iTunes Conenctへのアップロード (lane : beta)

scan、sigh、gym、pilot、crashlyticsもfastlaneの一部で、それぞれの役割は以下の通りです。

  • scan(テスト)
  • sigh(provisioning profileのダウンロード)
  • gym(ipaのarchive)
  • pilot(iTunes ConnectのTestFlightへのアップロード)
  • crashlytics(crashlyticsへの配信)
注意点

ここで気をつけるべき点としては、
pilotにおいてskip_submission: trueを設定しないと、iTunes Connect上でのバイナリの処理を待ってしまうため、ビルド時間が無駄に使われてしまう、
sighpilotiTunes Connectへのアクセスを要求するため、AppleIDのパスワードを FASTLANE_PASSWORD として環境変数に登録しておく必要がある、
が挙げられます。


Rakeタスク

最後にRakeタスクについてですが、
security.rakeでは、証明書のKeychainへの登録を、
build.rakeでは、先週紹介したplutilを利用したビルド番号のインクリメント、crashlytics用のrelease_note.txtの生成を行っています。


まとめ

fastlaneはかなり活発に活動してますので、こういった形で活用していければ、かなり楽できるのではないかなと。
今回、紹介できなかったfastlaneのdeliver(metadataを含めたiTunes Connectへのアップロード)など、 まだキャッチアップできていないgemも多々あるので、その辺りについてはプロジェクトに取り込み、 知見が溜まった段階でシェアしていければと思います。


参考

CircleCI
https://circleci.com/docs/configuration
https://circleci.com/docs/ios

fastlane
https://github.com/fastlane