every Tech Blog

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

DELISH KITCHEN iOSアプリ開発のCI環境について

DELISH KITCHEN iOSアプリ開発のCI環境について

f:id:nanakookada:20201211144038p:plain

はじめに

はじめまして。2020年4月にエブリーに新卒で入社した山口です。
iOSエンジニアとして入社後、DELISH KITCHENクライアントグループで、日々iOSアプリの改善や新機能開発の業務に関わっています。

さて、多くの方にご利用いただいているDELISH KITCHENのiOSアプリですが、日々の開発フローをできるだけ効率化させるためにCI環境を整備しています。

今回の記事では、実際にどんなCI環境が構築されているかをご紹介します。

構成

さっそくですが、こちらが全体図になります。

iOS-CI-ENV-OVERVIEW

フローとしてはこんな感じで、Githubのタグをトリガーにして、テストやAppStoreにipaを提出するまで(実際にApple側に提出する一歩手前まで)を自動化しています。

次に、それぞれの処理内容をざっくりと紹介します。

Makefile

まずは運用しているMakefileの中身について大まかに紹介します。

特別変わっているところはないのですが、DELISH KITCHENのiOSアプリ開発では、必要なコマンド類はMakefileに集約してあります。
またCocoaPodsやfastlaneなどgem経由でインストールするものもBundlerを使用していて、make installのようなコマンドでインストールできるようになっています。
特にfastlaneはbundle exec fastlane xxxxを都度書かなくても良いように必要な部分は、MakefileでWrapされています。
すべてmake xxxxで必要な処理の流れを呼び出せるので、CircleCIなどでそのままできますし、例えばPCが変わっても開発構築を頑張らなくて良いです。

Github

このCI環境では動作の起点となります。

開発者が、特定のプレフィックス付きのタグを切ったときや、特定のブランチにマージされた場合に、それがトリガーとなって次のCircleCIが動きます。

実際の運用では、このような感じで使っています。

  • developブランチにマージされた時
  • 特定のプレフィックスがついたタグを切った時
    • 例えば、enterprise.{VERSION}のような感じ

CircleCI

Githubのトリガーをもとに実行され、タグのプレフィックスなどによって、予め定義されているそれぞれのジョブが実行されます。
ここで簡単な環境変数や使用するXcodeのバージョンが設定され、予め定義されているSTEPごとに実行しています。

実際に運用しているconfig.ymlでは、workflowが4つ(Githubのトリガー分)存在しています。
すべて内部的にはmakeコマンドを叩くような構成で、テストからApp DistributionやTestFlightへのアップロードまで自動化されています。

また、毎度gemやCocoaPods、Carthageをフルで走らせると無駄な時間がかかってしまうため、前のデータをキャッシュすることでインストールの高速化を図る工夫をしたりしています。

fastlane

fastlaneのことは皆さんご存知と思いますので具体的な話は省略しますが、運用でどう使用されているかを紹介します。
DELISH KITCHENの開発環境でも、Matchを利用した証明書の管理から、バージョン上げ、ビルド、テスト、アップロードまで利用しています。

プラグインとしては、
- versioning
- firebase_app_distribution

を使用しています。

どちらも名前の通りで、アプリのビルド番号や、バージョン情報をfastlane側から上げることができるプラグインと、App Distributionにビルドをアップロードすることができるプラグインです。

実際の運用では、デフォルトのAppStore Connect(TestFlight)へのアップロードと、プラグインを利用してApp Distributionへのアップロード。同時に、ビルド済みのアプリをGithubのリリースにアップロードするところまでをサポートしています。

このようにして、Githubでタグを切るところから実際にスマートフォン上で動ける環境になるまでを自動化させています。

まとめ

一度構築してしまえば、そのフローをすべて自動で走らせることが可能になるため、チーム開発や継続的なアップデートをするような環境では、開発の効率化にかなり貢献できます。また現在だと、fastlaneを始めとして、かなり有用なツールが揃っているので、CI環境を作りやすいように感じます。

この記事でDELISH KITCHENのiOSアプリ開発のCI環境を知っていただけましたら幸いです!