fastlaneとBitriseでiOSアプリのCI始めました

iOSアプリを開発している吉岡です。少し前にdaabを使ったチャットボットのハッカソン会場にお邪魔してチャットボット開発の雰囲気を楽しんだりしているこの頃です。

はじめに

directというサービスのiOSアプリをビルドするためにfastlaneを使用しています。しかしいままではずっと開発者のマシンで実行していて、ビルドにリソースがとられて他の作業ができないなどの問題をかかえていたのでCIサービスでビルドできるようにしました。ついでにPull Requestと連携したテストを実行するようにもしました。ベストプラクティスでは無いかもしれませんが、実際の現場でCIを導入した例として参考にしていただければと思います。

====

前提条件

  • fastlane導入済み
  • Xcode8でビルド
  • CocoaPodsとCarthageを併用している
  • GitHubのPrivateリポジトリでソース管理している
  • Fabric BetaでAdHoc署名アプリの配信をしたい
  • iTunesConnectへの登録もしたい
  • GitHubでPull requestをしたときにXCTestを実行したい

fastlaneについて

ビルドやテスト、iTunes Connectへの登録など様々なことをコマンドラインで実行できるOSSのツールです。もともとiOS向けに開発されてきたためか、iOSエンジニアを中心に多くの開発者に利用されているようです。2017/07時点では活発に開発が行われており、ひと月に何度もバージョンアップがあることも珍しくありません。

github.com

担当しているプロジェクトでは現在、Fabric Betaでの配信、iTunes Connectへの登録、単体テストの実行などに使っており、便利な使い方があればどんどん導入範囲を広げたいと思っています。

今回やったこと

すでにfastlaneの導入はすんでいたので、下記のようなことを行いました。

  • CIサービスの選定
  • Xcodeプロジェクトの修正
  • Bitriseの設定
  • fastlaneの設定修正

CIサービスの選定

CIサービスは有名どころがいくつかありますが、Bitriseを利用することにしました。決め手は有料プランにて月あたりのビルド回数やビルド総時間の制限が無かったことです。他のサービスだとひと月あたりにビルドできる回数やビルドに使える総時間が決められているものがあり、GitHubにPull Requestを出すたびにテストを流すには心許ないかなと思いました。その中では同時ビルド数あたりの単価が安かったことや必要な機能を満たしていそうなので決めました。

Xcodeプロジェクトの修正

BitriseのようなCI環境でビルドをするためにはスキームの保存が必要です。 プロジェクトのManage Schemesを選択して、CIでビルドしたいSchemeのSharedを有効にします。

f:id:yoshioka_lisb:20170711171424p:plain

f:id:yoshioka_lisb:20170711171655p:plain

ファイルが増えるので忘れずにコミットしてください。

Bitriseの設定

Bitriseのアカウントを作成後 、GitHubのリポジトリをBitriseのAppとして追加しました。 基本的な手順はUIに従って下記のように行いました。

  1. BitriseのADD APPから新規アプリ登録
  2. GitHubのssh keyの登録
  3. アプリ署名用証明書(p12)の登録
  4. 実行する fastlane の lane 名を環境変数で登録
  5. Fastfileの各種lane用のWorkFlowを追加
  6. Apple IDのパスワードを設定
  7. Pull Requestをテストするための設定

プロビジョニングプロファイルはsighで解決するのでBitriseには登録していません。 順調にいかず、いくつかはまったところがあるので紹介します。

Apple IDのパスワードを設定

担当しているプロジェクトのFastfileではsighやdeliverを使ったものがあるので、Apple IDのパスワードが必要です。 普段開発者のマシンで実行しているときは、初回だけパスワードの入力を求められて以降はキーチェーンの値を使っていました。 CI環境では同じように出来ないので、そのまま実行するとエラーになります。

FASTLANE_PASSWORDという環境変数にパスワードを設定することでCI環境でもsighやdeliverのようなアクションが動作するようになります。

f:id:yoshioka_lisb:20170711161706p:plain

Pull Requestをテストするための設定

GitHubでPull Requestを出すと、Bitriseでテストされてその結果がPull Requestの画面に表示されるように出来ます。

f:id:yoshioka_lisb:20170711164231p:plain

必要な設定は「GitHubでWebhookの設定を追加」と「BitriseのTriggersにPull Requestを追加」の2つだけです。

GitHubでWebhookの設定を追加

BitriseのWebhook URLを取得します。

Codeを選択 f:id:yoshioka_lisb:20170711164816p:plain

GitHub用のURLをコピー f:id:yoshioka_lisb:20170711185019p:plain

GitHubにWebhookを追加 f:id:yoshioka_lisb:20170711165421p:plain

Content typeapplication/jsonにすることとWhich events would you like to trigger this webhook?を個別にPull RequestPullを選択するところがポイントです。

参考 : http://devcenter.bitrise.io/webhooks/adding-a-github-webhook/

BitriseのTriggersにPull Requestを追加

Pull Requestでtest用のWorkFlowが実行されるように設定します。 f:id:yoshioka_lisb:20170711170330p:plain

fastlaneの設定修正

そのままBitriseでfastlaneを実行してみたのですがビルドが通らずいくつか修正が必要となりました。全てのケースに当てはまりませんが、同じことではまる方もいるかもしれませんので何をしたのかを記載します。開発者のマシンでビルドできていてもCI環境ではビルドできないことは様々な原因が考えられるので、このケースに限らず個別につぶしていく必要があります。

担当プロジェクトではFastfileは大まかに下記のような設定で使っています。 アクションの引数などは省略して記載していますし、実際にはExtension用にもsighを実行しているのですがここでは省略しています。

before_all do
  cocoapods
  carthage
end

lane :test do 
  scan
end

lane :beta do 
  sigh
  gym
  crashlytics
end

lane :deploy do 
  sigh
  gym
  deliver
end

プロビジョニングプロファイルが解決できない

※2018/09/04追記: ここで紹介しているのは、Fastfile内でdisable_automatic_code_signingenable_automatic_code_signingを使う方法やgymの引数で証明書を指定する方法ですが、iOSDC Japan 2018で発表された詳解Fastfileにてよりよい方法が紹介されています。

sighでプロビジョニングプロファイルを解決しているつもりでしたが、Xcodeプロジェクトの自動署名設定のため、指定が出来ていなかったようです。Xcode7の頃は問題が無かったようですが、そのままXcode8でも使い続けてしまったのがよくなかったようです。それを解決するため、 gymdisable_automatic_code_signingenable_automatic_code_signingで挟むようにしました。

lane :beta do 
  sigh
  disable_automatic_code_signing(path: "Project.xcodeproj") #★追加
  gym
  enable_automatic_code_signing(path: "Project.xcodeproj") #★追加
  crashlytics
end

このアクションは、Xcodeプロジェクトの自動署名を無効にしたり有効にできます。これを使うことで普段の開発は自動署名を使いつつCIではプロビジョニングプロファイルの指定が出来ます。

さらに、署名に使用する証明書の指定をgymの引数に追加しました。

lane :beta do 
  sigh
  disable_automatic_code_signing(path: "Project.xcodeproj")
  gym(
    xcargs: "CODE_SIGN_IDENTITY='iPhone Distribution: L is B Corp.'"  #★追加
  )
  enable_automatic_code_signing(path: "Project.xcodeproj")
  crashlytics
end

これでsighで取得したプロビジョニングプロファイルが指定できるようになりました。

おわりに

開発効率改善のためにBitriseの有料プランを契約してくれた会社に感謝の気持ちでこの記事を書きました。 そんな弊社で働きたい方は、是非お話を聞きに来て下さい。

採用情報 | 株式会社L is B(エルイズビー)

タイトルとURLをコピーしました