every Tech Blog

株式会社エブリーのTech Blogです。

Xcode Cloudを活用してDELISH KITCHEN iOSのCI/CD環境を更新しました

はじめに

DELISH KITCHENで主にiOSの開発やマネジメントを担当している久保です。

以前、DELISH KITCHEN iOSアプリ開発のCI環境についてという記事でCI環境を紹介しました。

今回は、Xcode Cloudの導入経緯とCI/CD環境の変化についてご紹介します。

Xcode Cloudへ移行した理由

Xcode Cloudの発表以降、さまざまな試行を行ってきましたが、特に以下の理由から全面的な導入を決定しました。

  • 他のサービスと比較して機能が少ないため、学習コストが低い
  • TestFlightやApp Store Connectへのアップロード時に証明書の管理が不要
  • XcodeやmacOSのアップデートへの追従が速い
  • ビルド番号の管理が不要

Firebase App DistributionからTestFlightに移行した理由

アプリ配布に使うサービスも、Firebase App DistributionからTestFlightに移行しました。App Distributionを用いてAdHoc配信をしていた際には、以下の作業が発生していました。

  • インストールしたい端末のUUIDを登録
  • Provisioning profileの更新

これらの作業はfastlaneを使って半自動化していたのでそこまで手間ではなかったのですが、TestFlightを利用することによってこれらの雑務から解放されました。

Xcode Cloud以外を利用している場合は、App Store Connect APIを利用するようなスクリプトを組むことになると思うのですが、Xcode Cloudはここもよしなに処理してくれるというメリットがあります。

構成

Xcode Cloud導入後のアプリの社内向け配布およびApp Store Connectへ提出を行う全体のフロー図を以下に示します。

前回の記事ではfastlaneが色々な役割を果たしていたのですが、今回の用途に限るとfastlaneは不要になりました。

Release版のワークフロー

App Store Connectへの提出と最終的な動作確認のための配布を行います。

特定のプレフィックスを含むタグがGitHubにプッシュされると、次のワークフローが実行されます。

  • TestFlightで内部テスターに配布
  • App Store Connectへの提出
  • 成功または失敗をSlackチャンネルに通知

Develop版のワークフロー

主に社内関係者への配布を行います。別アプリとして扱いたいため、Release版とは別のバンドルIDを設定しています。

こちらも同様に、特定のプレフィックスを含むタグがGitHubにプッシュされると、次のワークフローが実行されます。

  • TestFlightで内部・外部テスターに配布する
  • 成功または失敗をSlackチャンネルに通知

内部・外部テスターの使い分け

内部テスターと外部テスターの使い分けに関して、以下に簡単な違いをまとめました。

内部テスター (Internal Testers) 外部テスター (External Testers)
Apple ID App Store Connectで管理されたApple IDが必要 特に制限なし
配布までの時間 アップロード後即時 審査通過後

デザイナーやプロダクトマネージャーなど、すぐに確認してもらいたい場合は内部テスターを、手軽に確認したい利用者向けには外部テスターを利用してもらっています。

まとめ

Xcode Cloudの導入により、特にデプロイに関連する作業がシンプルになりました。

あえて気になる点を挙げると

  • 設定がGUI
  • App Store Connectに存在しないアプリに対してワークフローが設定できない
  • 任意のスクリプトを実行する機構はあるが、実行タイミングが限定的
  • キャッシュの設定などが不明瞭

などが考えられます。

今回はデプロイに焦点を当てた内容になりましたが、iOS開発の取り組みに関して少しでも知っていただければ幸いです。