CA MOBILE TECH BLOG

株式会社シーエー・モバイルのエンジニア・デザイナーの活動を綴るブログです

株式会社シーエー・モバイルの技術広報による、
技術に特化したブログです。
エンジニアとデザイナーの活動や思想を綴ってゆきます。

fastlane+bitrise+deploygateでCI環境をつくる

f:id:cam-engineer:20180419170232p:plain


こんにちは。マッチングサービスアプリ「mimi」のiOSエンジニアを担当している、Tです。

本プロジェクトにおいてCI環境をつくったので、一部ご紹介します。 ここでは、開発環境に向けたアプリのビルド・配布をご紹介します。


環境




構成

全体の構成はこのようになっています。

f:id:cam-engineer:20180419135448p:plain

githubへのpushをhookしてアプリの配布を行います。 pushするブランチによってアプリの配布先を分けています。

  • developブランチ → 開発環境向きのアプリをdeploygateに配布

  • stagingブランチ → ステージング環境向きのアプリをdeploygateに配布

  • releaseブランチ → 本番向きのアプリをiTunesConnectに配布

アプリ配布までのほとんどのステップを、fastlaneで行なっています。 処理が終わったら、slackに通知を投げます。



手順

●Bitrise

 ○Bitriseでやること

  1. 全体のワークフローを設定
  2. githubへのpushをhook
  3. ライブラリのキャッシュ


1.全体のワークフローを設定

f:id:cam-engineer:20180419135523p:plain

githubに登録しているsshキーをアクティベートします。

リポジトリをクローンします。

③〜⑤ Carthageのライブラリをビルドしたあと、キャッシュします。ライブラリに変更がない場合はキャッシュを読み込みます。

fastlaneのlaneを実行します。

●fastlane

○fastlaneでやること

  • コード署名
  • 日本語フォントインストール(後で記述します)
  • アプリのビルド、アーカイブ
  • 配布
  • Slackへの通知

fastlaneには、コード署名やビルドなど様々なアクションが用意されていて、それらの一連の処理をlaneとして記述して自動化します。laneはFastfileというファイルに記述します。

実際に開発環境用で使用しているFastfileの一部を紹介します。
※一部表示を変更しています。

lane :deploygate_dev_bitrise do 
    if is_ci?
      cocoapods

      match(
        type: "adhoc",
        readonly: true,
        verbose: true
      )

      sh("cp ../mimi/フォントファイル名.otf ~/Library/Fonts/")
      sh("cp ../mimi/フォントファイル名.otf ~/Library/Fonts/")
    end

    gym(
        workspace: "mimi.xcworkspace",
        configuration: "Release",
        scheme: "mimi_DEV",
        export_method: "ad-hoc",
        export_options: { compileBitcode: false }
    )
    deploygate(
      api_token: ENV["DEPLOYGATE_API_TOKEN"],
      user: ENV["DEPLOYGATE_USER_NAME"],
      message: last_git_commit[:message]
    )
    slack(
      message: "[DEV向いてます]deploygateに最新版をアップロードしました。(bitrise)"
    )
  end

まず、matchを使用してコード署名の処理を行います。

matchはfastlaneのアクションのひとつで、証明書の作成や取得などの管理を簡単に行うことができます。
作成された証明書などはgitのリポジトリで管理されます。 証明書周りのものを一元管理することにより、個人のmac環境に依存したりするのも防げるので、複数人開発の際は特にメリットが大きいです。 詳しくはこちら

次に、アプリ内で使用しているフォントファイルをlaneを実行するマシンにインストールする処理を書いています。 こちらは最後の方に説明します。

続いて、gymを使用してアプリのビルド・アーカイブを行います。 当プロジェクトでは、開発・ステージング・本番でそれぞれスキームを分けているので、ここではmimi_DEVを指定します。

アプリのアーカイブが完了したら、deploygateへ配布します。 fastlaneにdeploygateのアクションが用意されているので、非常に簡単です。ちなみに、last_git_commitで最後のコミット情報を取得できるので、それをアップロードに含めています。

最後に、Slackへの通知を行います。 こちらも同様にアクションが用意されているので簡単です。


●トリガーの設定

Bitriseで、githubへのプッシュをトリガーにワークフローを走らせられるように設定します。 設定方法は割愛しますが、mimiでは以下のように設定しています。

f:id:cam-engineer:20180419135548p:plain

ワークフローは複数作成することが可能なので、プッシュするブランチによって、走らせるワークフローを分けています。

色々と割愛しましたが、以上でアプリのビルド配布自動化が完了します。



詰まりどころ

Sierra以上の環境で、fastlaneのgym中に処理がハングする

 原因: macOS Sierraから、gymの途中でキーチェーンを使用するかどうかの確認ダイアログが出るようになったため、それによりハングしていた。

 解決策: 上記のダイアログを回避するコマンドをキーチェーンに対して実行することで解決できますが、matchのアクション内に実装されたため、matchを使用すれば解決します。

gymの途中、xibやstoryboardのコンパイルでハングする

 原因: はじめ、上記のキーチェーンに関するものだと思っていたが、xibやstoryboard内のUILabelなどに、日本語のカスタムフォントを使用していると発生することがわかった。

 解決策: Fastfileの記述のところにあるコマンドでフォントファイルを実行マシンにインストールすることで解決します。



まとめ

なぜBitrise?

・価格が比較的安い。
・基本GUIでセットアップがわかりやすい。
・自前のマシンを用意する必要がない。

 比較的安い50$/月でmimiの環境では十分な機能が揃っていて、ビルド時間もキャッシュを使用すればローカルとほぼ変わらないスピードでビルドができました。 GUIの管理画面が少し重たいですが、デザイン的には使いやすい感じになっています。

なぜfastlane?

・開発周りのめんどくさい作業が圧倒的に楽になる。
・一連の処理をできる限りfastlaneにまとめていれば、CIツールに依存されることがなく、環境が変わっても対応が楽。


mimiでは50$/月のTEAMプランを契約していますが、無料でお試し ( ※ ビルド10分制限がありますが ) もできるので、
CI環境構築を考えている方や、CIツールの乗り換えを考えている方は試しに使ってみてはいかがでしょうか。

また、fastlaneを使えばCIツールの乗り換えもスムーズにできますし、はじめて構築する場合もかなり便利になるのでおすすめです。