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時点では活発に開発が行われており、ひと月に何度もバージョンアップがあることも珍しくありません。
担当しているプロジェクトでは現在、Fabric Betaでの配信、iTunes Connectへの登録、単体テストの実行などに使っており、便利な使い方があればどんどん導入範囲を広げたいと思っています。
今回やったこと
すでにfastlaneの導入はすんでいたので、下記のようなことを行いました。
- CIサービスの選定
- Xcodeプロジェクトの修正
- Bitriseの設定
- fastlaneの設定修正
CIサービスの選定
CIサービスは有名どころがいくつかありますが、Bitriseを利用することにしました。決め手は有料プランにて月あたりのビルド回数やビルド総時間の制限が無かったことです。他のサービスだとひと月あたりにビルドできる回数やビルドに使える総時間が決められているものがあり、GitHubにPull Requestを出すたびにテストを流すには心許ないかなと思いました。その中では同時ビルド数あたりの単価が安かったことや必要な機能を満たしていそうなので決めました。
Xcodeプロジェクトの修正
BitriseのようなCI環境でビルドをするためにはスキームの保存が必要です。 プロジェクトのManage Schemes
を選択して、CIでビルドしたいSchemeのSharedを有効にします。
ファイルが増えるので忘れずにコミットしてください。
Bitriseの設定
Bitriseのアカウントを作成後 、GitHubのリポジトリをBitriseのAppとして追加しました。 基本的な手順はUIに従って下記のように行いました。
- BitriseのADD APPから新規アプリ登録
- GitHubのssh keyの登録
- アプリ署名用証明書(p12)の登録
- 実行する fastlane の lane 名を環境変数で登録
- Fastfileの各種lane用のWorkFlowを追加
- Apple IDのパスワードを設定
- Pull Requestをテストするための設定
プロビジョニングプロファイルはsighで解決するのでBitriseには登録していません。 順調にいかず、いくつかはまったところがあるので紹介します。
Apple IDのパスワードを設定
担当しているプロジェクトのFastfileではsighやdeliverを使ったものがあるので、Apple IDのパスワードが必要です。 普段開発者のマシンで実行しているときは、初回だけパスワードの入力を求められて以降はキーチェーンの値を使っていました。 CI環境では同じように出来ないので、そのまま実行するとエラーになります。
FASTLANE_PASSWORD
という環境変数にパスワードを設定することでCI環境でもsighやdeliverのようなアクションが動作するようになります。
Pull Requestをテストするための設定
GitHubでPull Requestを出すと、Bitriseでテストされてその結果がPull Requestの画面に表示されるように出来ます。
必要な設定は「GitHubでWebhookの設定を追加」と「BitriseのTriggersにPull Requestを追加」の2つだけです。
GitHubでWebhookの設定を追加
BitriseのWebhook URL
を取得します。
Code
を選択
GitHub用のURLをコピー
GitHubにWebhookを追加
Content type
をapplication/json
にすることとWhich events would you like to trigger this webhook?
を個別にPull Request
とPull
を選択するところがポイントです。
参考 : http://devcenter.bitrise.io/webhooks/adding-a-github-webhook/
BitriseのTriggersにPull Requestを追加
Pull Requestでtest用のWorkFlowが実行されるように設定します。
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_signing
とenable_automatic_code_signing
を使う方法やgymの引数で証明書を指定する方法ですが、iOSDC Japan 2018で発表された詳解Fastfileにてよりよい方法が紹介されています。
sighでプロビジョニングプロファイルを解決しているつもりでしたが、Xcodeプロジェクトの自動署名設定のため、指定が出来ていなかったようです。Xcode7の頃は問題が無かったようですが、そのままXcode8でも使い続けてしまったのがよくなかったようです。それを解決するため、 gym
をdisable_automatic_code_signing
とenable_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の有料プランを契約してくれた会社に感謝の気持ちでこの記事を書きました。 そんな弊社で働きたい方は、是非お話を聞きに来て下さい。