[iOS] CircleCI, fastlane, Fabric を用いたCI環境と自動ベータ配布環境の構築「後編」

Date
March 18, 2016

こんにちは。CTOの kamoc です。 本記事は CircleCI, fastlane, Fabric を用いたiOSアプリCI環境と自動ベータ配布環境の構築【前編】 の続編記事となります。

前回の記事では CircleCI, fastlane を用いたiOSアプリのCI環境構築手順を紹介しました。 今回は、CircleCI上で作成したipaファイルを Fabric / Crashlytics に自動デプロイする部分について紹介していきます。

やりたいことの全体像と、今回の説明範囲は以下の通りです。

image
  1. XcodeでiOSアプリを開発
  2. GitHubにPush
  3. CircleCIがHookしてビルド/テストを実行
  4. Fastlaneでベータ配布版をビルド(.ipaファイルを作成)
  5. 4.で作成した.ipaファイルを Fabric/Crashlytics へアップロード
  6. Slackに通知

今回は5.の部分について紹介します。 それでは早速、導入手順に進んで行きます。

Fabric / Crashlytics の導入

Fabric についての説明はTwitter社のブログ

に詳しく書いてあるので、詳しい説明は割愛します。 今回は Fabric の中の Crashlytics を利用します。利用用途は以下の2点です。

AdHoc版のBeta配布

Beta版をテスターやクライアントのiPhoneからダウンロード・インストールしてもらうために利用します。 Beta配布には他にもTestFlightやDeployGateなどがありますが、Fabricが優れている点を以下に記載します。

  • アプリ起動時に最新版があったら更新を促すダイアログを表示する
  • UDIDの収集がラク

クラッシュレポート

今回の目的とは直接関係無いのですが、Fabricを使うことの大きなメリットに、アプリのクラッシュ情報を自動的に収集してくれることがあります。

クラッシュの頻度によって自動的に5段階のレベルに分けてくれます。 Levelが規定値を超えたらSlackに通知するように設定しています。

Fabricインストール手順

最初に、Fabric プラグインをインストールします。 こちらのリンクから、Xcode を選択してダウンロードしてください。

Fabric.app を起動したら、ID / Pass を入力してログインします。

あとは「+New App」を押して画面のチュートリアルに沿って進めて行きます。 チュートリアルがとてもわかりやすくできているので、ここは説明不要かと思います。

Fabric / Crashlytics の API Key, Build Secret の取得

API Key と Build Secret は Fabric の Organization ごとに決まっています。

Organization ページの組織名の下に API Key と Build Secret という表示があり、それらをクリックすると目的の文字列が得られます。

少しわかりにくいのでスクショを添付します。

image

Fabricユーザーグループの作成

続いて、FabricのWebダッシュボードからユーザーグループを作成します。 グループ単位で配信先を決めるので、テスターのグループ、開発者のグループといった グループ分けをしておくと後々便利です。

image

Fastfile の修正

前編記事で作成したFastlaneファイルからの変更点は以下のの2点です。

  1. before_all に Fabric の API Key と Build Secretを追加
  2. beta レーンに Fabric / Crashlytics へのアップロード処理を追加

修正後のFastfileは以下の通りです。

fastlane_version "1.66.0"

default_platform :ios

platform :ios do
before_all do
ENV["SLACK_URL"] = "https://hooks.slack.com/services/...."
ENV["CRASHLYTICS_API_TOKEN"] = "前の手順で入手したAPI Key" #=> 追加
ENV["CRASHLYTICS_BUILD_SECRET"] = "前の手順で入手したBuild Secret" #=> 追加
end

desc "テストを実行"
lane :test do
scan
end

desc "ベータ版をFabric/Crashlyticsにデプロイ"
lane :beta do
gym(scheme: "SikmiBlog", use_legacy_build_api: true)

# crashlytics にipaをアップロードする処理を追加
crashlytics(
crashlytics_path: './Pods/Crashlytics/iOS/Crashlytics.framework',
api_token: ENV['CRASHLYTICS_API_TOKEN'],
build_secret: ENV['CRASHLYTICS_BUILD_SECRET'],
ipa_path: 'SikmiBlog.ipa',
notifications: true,
notes: "[STG配布] Fastlaneによる自動デプロイ",
groups: "developer" #=> 複数のグループを指定する場合はカンマ区切りで入力
)
end

after_all do |lane|
slack(
message: "Successfully deployed new App Update."
)
end

error do |lane, exception|
slack(
message: exception.message,
success: false
)
end
end

circle.yml の修正

前編記事ではCocoaPodsを使っていないプロジェクトでしたが、 Fabric / Crashlytics 導入に伴い、CocoaPodsを入れたので、ワークスペースを指定するように変更します。 また、依存関係の処理を行うときに pod install を行う設定を追記します。

machine:
xcode:
version: 7.2
environment:
XCODE_SCHEME: SikmiBlog
XCODE_WORKSPACE: ./SikmiBlog/ZebraPress.xcworkspace #=> ここを変更
GYM_CODE_SIGNING_IDENTITY: "iPhone Distribution: Sikmi Inc. (WPSV9RT9QG)"
dependencies:
override:
- cd SikmiBlog && pod install #=> ここを追加
- cd SikmiBlog && bundle install
deployment:
develop:
branch: develop
commands:
- cd SikmiBlog && bundle exec fastlane beta

deployment設定では、ブランチによって挙動を変えることができるので、masterブランチであれば iTunesConnect へアップロード、develop ブランチであれば Fabric へアップロードといった定義をすることも可能です。

以上の手順を実施してGitHubにコードをPushすると、Fabricにベータ配布が行われるようになります。

付録 ハマりどころとその対応

最後に、環境構築時にハマったところと、その対処法を書いておきます。

Fabric / Crashlytics のテスターが0人になってしまう

これは、Crashlyticsへのアップロード処理で配布先を設定しない場合に発生します。 既にテスター登録を済ませた場合でも、配布先を指定する必要があります。

「Fabricユーザーグループの作成」と「Fastfile の修正」に記載したように、グループの登録と指定をおこなう必要があります。

Build successfully uploaded to Crashlytics Beta と表示されるのにbeta配布されない

よく見ると以下のエラーが出ていました。

[04:29:59]: -------------------------
[04:29:59]: --- Step: crashlytics ---
[04:29:59]: -------------------------
[04:29:59]: Uploading the build to Crashlytics Beta. Time for some ☕️.
$ ./Pods/Crashlytics/Crashlytics.framework/submit ***API Key*** *** Build Secret*** -ipaPath 'SikmiBlog.ipa' -notesPath '/var/folders/jm/fw86rxds0xn69sk40d18y69m0000gp/T/changelog20160318-1072-p88smz' -groupAliases 'developer' -notifications YES -debug NO
[04:29:59]: ▸ error: The submit binary delivered by cocoapods is in a new location, under '${PODS_ROOT}/Crashlytics/submit'. This script was put in place for backwards compatibility, but it relies on PODS_ROOT, which does not have a value in your current setup. Please update the path to the submit binary to fix this issue.
[04:29:59]: Build successfully uploaded to Crashlytics Beta ?

これは、Fastlaneファイルのcrashlyticsのパス指定が違っている場合に発生します。

crashlytics_path: './Pods/Crashlytics/Crashlytics.framework',

となっているのを

crashlytics_path: './Pods/Crashlytics/iOS/Crashlytics.framework',

と修正すると解決します。

まとめ

本記事では前編に引き続き、Fabric / Crashlytics に自動デプロイするための環境構築手順を紹介しました。 しばらく運用後、開発者やプロジェクト関係者から使用感についてヒヤリングをしてみようと思います。

しくみ製作所では QCD を改善するための取り組み、システム投資を積極的におこなっています。社員も募集中なので興味を持った方は、Twitter @kamomc か、 kamo(at)sikmi.com までお気軽にご連絡下さい。