iOSアプリ用のCI環境を作ろう

12月からアクトインディにジョインしたkou_honです。
私、スマートフォンアプリエンジニアをやっております。
得意なのはAndroidアプリ開発なのですが頑張ってiOSアプリ開発もしています。
周りがRubyエンジニアの方たちばかり（そしてみんな優秀！）で毛色が違いますが頑張っていく所存ですのでよろしくお願いします :smile: 

今回はiOSアプリ開発に先立って、CI環境を構築したので備忘録も兼ねて構築手順を書いていこうと思います。
ちょっと長い記事になっていますが、難しいことは書いていないので軽い気持ちで読み進めていってください :smile: 

以下の構築手順でCI環境を構築すればGitHubのmasterブランチにソースがマージされたら、それをトリガーにBitriseがソースをクローン、ビルド、テスト、アーカイブを作ってDeployGateへデプロイ、slackへ結果を通知する環境が出来上がります。

#CIツールの選定
##やっぱりJenkins？
アクトインディでは現在Jenkinsを導入して開発を進めています。
当初はすでにある環境に乗っかろうと思ったのです。。。

「iOSのビルドにはMacマシンが必要だよねー」
「[ゴミ箱](http://www.apple.com/jp/mac-pro/)買う？」
「Webサービスあるんじゃない？」

開発メンバーのいろいろな意見を聞き、まずはWebサービスを検索したところさまざまなCIサービスがあることを知りました。
数多のCIサービスの中から今回は[Bitrise](https://www.bitrise.io)を使ってみることにしました。
無料枠でいろいろ検証出来そうだったところとモバイル開発に特化しているところが決め手でした。
#構築の前の準備
①Xcodeプロジェクトのスキームを編集します。ヘッダーメニュー→「Product」→「Scheme」→「Edit Scheme...」をクリックします。
<img width="1360" alt="edit_scheme.png" src="https://qiita-image-store.s3.amazonaws.com/0/21998/c94dc4e1-9316-a261-5f0c-310f46871f92.png">
②「Manage Scheme...」をクリックします。ビルド対象のスキームの「Shared」にチェックを入れて、「Close」をクリックします。
<img width="1360" alt="manage_scheme.png" src="https://qiita-image-store.s3.amazonaws.com/0/21998/a5b6b894-1df4-2dae-1e68-9e76bb282fbe.png">
③プロジェクトはGitHubにプッシュしておきます。
④プロビジョニングファイルと秘密鍵(p.12ファイル)とパスフレーズを用意します。
⑤DeployGateにビルドしたファイル(ipaファイル)を転送するコマンドをWebでアクセス出来るようにしておきます。

```lang:転送コマンド
#!/bin/bash
curl -F "file=@$BITRISE_IPA_PATH" -F "token=[トークン番号]" -F "message=deploy from bitrise" https://deploygate.com/api/users/[ユーザID]/apps
```
コマンドの詳細はこちら→[DeployGate API](https://deploygate.com/docs/api)

⑥slackとの連携用のWebHookURLを発行しておきます。発行は以下のURLで行えます。

```lang:WebHookURL発行URL
https://[slackのチーム名].slack.com/services/new/incoming-webhook
```
#Bitriseのアカウント作成
①まずはアカウント作成です。ブラウザで[サインアップページ](https://www.bitrise.io/users/sign_up)を表示して、「Jump in!」ボタンをクリックします。
![jump_in.png](https://qiita-image-store.s3.amazonaws.com/0/21998/5ea58f29-5f76-e9a6-ccb0-eb20a28571c1.png)
②GitHubと連携するのでGitHubをクリックします。
![bitrise-signup.png](https://qiita-image-store.s3.amazonaws.com/0/21998/1c737f2c-3df9-af52-9ac7-36a3614765f5.png)
③GitHubのログインページに飛びます。アカウントとパスワードを入力して「Sigh in」をクリックします。
![github-sign-in.png](https://qiita-image-store.s3.amazonaws.com/0/21998/ab118277-b8eb-1037-d174-72944b8c59b3.png)
④BitriseからGitHubのアカウントにアクセスする権限を求められますので「Authorize application」をクリックします。
![github-authorize.png](https://qiita-image-store.s3.amazonaws.com/0/21998/c3504241-bf4a-03d4-f282-83022df5673f.png)
⑤Bitriseからパスワード入力を求められます。GitHubアカウントのパスワードを入力して「Finish sign up」をクリックします。
![bitrise-sign-up-almost-in.png](https://qiita-image-store.s3.amazonaws.com/0/21998/600a4aac-0fc3-68e4-f933-5b1272b575ed.png)
⑥これでアカウント作成完了です。簡単ですね。
![bitrise-login.png](https://qiita-image-store.s3.amazonaws.com/0/21998/23691c02-459f-d564-0e38-40e1fa55cd37.png)
#GitHubとBitriseを連携
それではGitHubにアップしているリポジトリとBitriseを連携していきます。
①画面右上に表示されているアイコンをクリックするとメニューが表示されます。「Add new App」をクリックします。
<img width="247" alt="add_new_app.png" src="https://qiita-image-store.s3.amazonaws.com/0/21998/c89e9dff-e188-2d9b-e5d7-42c3b895bc12.png">
②リポジトリを選択します。
![select-repo.png](https://qiita-image-store.s3.amazonaws.com/0/21998/ca56ef60-dc5f-ae28-dc6a-6d2963c0c7a8.png)
③SSH設定をします。「Auto-add this key」をクリックします。
![setup_repository_access.png](https://qiita-image-store.s3.amazonaws.com/0/21998/afc65b04-2f94-8b8d-e579-59666695a623.png)
④ブランチを選択します。「Specify your default branch」にブランチ名を記入して「Next」ボタンをクリックします。
![validation_setup.png](https://qiita-image-store.s3.amazonaws.com/0/21998/dfaafbb5-621d-7090-8c21-2af79388a571.png)
⑤「Configure it manually」をクリックします。
![project_build_configuration.png](https://qiita-image-store.s3.amazonaws.com/0/21998/d161025e-0d0a-38d8-be11-cd38279f6e17.png)
⑥ビルド対象のブランチ名、XcodeのWorkspaceファイル、Xcodeプロジェクトのスキーム名を記入して「I'm ready」をクリックします。
![specify_the_build_configuration.png](https://qiita-image-store.s3.amazonaws.com/0/21998/66a2f3e0-9257-b7f8-72a0-c4b2b2765fb7.png)
⑦「Register a Webhook for me!」をクリックして
![webhook_setup.png](https://qiita-image-store.s3.amazonaws.com/0/21998/4e25c861-be50-6164-089a-f1140a8429b6.png)
⑧「Your awesome app is ready to roll!」をクリックします。
![your_awesome_app_is_ready_to_roll.png](https://qiita-image-store.s3.amazonaws.com/0/21998/72674a7a-3c82-0afc-660f-4f6c0c73c9c5.png)
⑨「MANAGE WORKFLOWS」をクリックします。
![workflow.png](https://qiita-image-store.s3.amazonaws.com/0/21998/1142611a-59ec-30af-d444-3c03927f3208.png)
⑩「rename」をクリックします。workflowの名前を変更して、左カラムの「SAVE」ボタンをクリックします。
![workflow_editor_rename.png](https://qiita-image-store.s3.amazonaws.com/0/21998/67bf914a-5e7b-ac38-d785-ee842083882e.png)
⑪左カラムの「Code signing & Files」をクリックします。
![code_signing_and_files.png](https://qiita-image-store.s3.amazonaws.com/0/21998/7fb8e658-7eda-4244-82c4-bb54ce0a60b2.png)
⑫「+ Add Provisioning Profile」ボタンをクリックします。プロビジョニングファイルを選択してアップロードします。
⑬「+ Add Certificate Private Key」ボタンをクリックします。
秘密鍵(p.12)ファイルを選択してアップロードします。
その後パスフレーズを設定して、「Save password」ボタンをクリックします。
![code_sigining_identity_password.png](https://qiita-image-store.s3.amazonaws.com/0/21998/e7785e7d-8fbc-4060-1438-8df30e7e308d.png)
⑭左カラムの「Triggers」をクリックします。
![triggers.png](https://qiita-image-store.s3.amazonaws.com/0/21998/381da569-4bf0-3fed-e0ab-84f38458de70.png)
⑮「REMOVE TRIGGER」ボタンをクリックします。
表示されたトリガーをクリックして、トリガーを削除します。
![triggers_clear.png](https://qiita-image-store.s3.amazonaws.com/0/21998/e76a1d34-f60b-56bd-895c-4de28c89ccb3.png)
⑯「+ ADD TRIGGER」ボタンをクリックします。
![add_trigger.png](https://qiita-image-store.s3.amazonaws.com/0/21998/37e109de-9426-a410-3c85-c00b6439f82d.png)
⑰「Pattenr name」にブランチ名、「Triggerd Workflow」にワークフロー名を設定して、「ADD TRIGGER」ボタンをクリックしてトリガーが設定します。
![triggers_added.png](https://qiita-image-store.s3.amazonaws.com/0/21998/0a41c80d-783a-3e09-2ae2-161f1ce90d72.png)
⑱左カラムの「SAVE」をクリックします。下記のダイアログが表示されたら「OK」ボタンをクリックします。
![add_config_saved_successfully.png](https://qiita-image-store.s3.amazonaws.com/0/21998/41a8b6e6-585d-57d2-fabb-d2530b5300c9.png)
これでGitHubとBitriseの連携でビルドまでは出来るようになりました。簡単ですね。
##XCTestでエラーが発生する場合の対処法
> xcode build failed with error: exit status 65

XCTestで上記のエラーが発生してテストが失敗する場合は以下の設定を試してください。

**①WorkFlowの「Certificate and profile installer」の後にある「Xcode: Unit Test」を削除します。**
**②「Certificate and profile installer」の後に「Remote Bash Script Runner」を追加します。**
**③HTTPアクセス出来る場所に以下のテスト用のコマンドを書いたファイルを用意します。**

```
#!/bin/bash
xcodebuild "-workspace" "./hugahoge.xcworkspace" "-scheme" "hugahoge" "clean" "build" "-destination" "platform=iOS Simulator,name=iPhone 6,OS=latest" test
```
**④2で追加した「Remote Bash Script Runner」の「Script URL」に3で用意したコマンドのURLを設定します。**

これでXCTestが実行出来る様になります。

#BitriseとDeploygateを連携
次はビルドしたものをDeployGateで配信したいのでBitriseとDeploygateの連携していきます。
①左カラムの「Workflow editor」をクリックします。
②「Deploy to bitri...」をクリックします。
![deploy_to_bitri....png](https://qiita-image-store.s3.amazonaws.com/0/21998/b78104fd-4e1e-dbb7-570e-4833eceb3270.png)
③下までスクロースすると「DELETE STEP」というボタンがあるのでそのボタンをクリックして、ステップを削除します。
![deploy_to_bitri..._delete_step.png](https://qiita-image-store.s3.amazonaws.com/0/21998/eb622461-1f95-05ef-b712-ef035b7bf573.png)
④「Xcode: Create ...」の下にある＋ボタンをクリックします。
![deploy_to_bitri..._deleted.png](https://qiita-image-store.s3.amazonaws.com/0/21998/c79010ba-ef2d-6e6a-9969-2c0eb9abfd95.png)
⑤Step一覧から「Remote Bash Script Runner」を選択して「ADD TO WORKFLOWS」をクリックします。
![add_step.png](https://qiita-image-store.s3.amazonaws.com/0/21998/702a2b5a-1f20-2cc0-9aa7-52a4d59e4694.png)
⑥「Script URL」にDeployGateへの転送コマンドが書かれたファイルのURLを設定し、「Replace variables in input?」にチェックを入れて、左カラムの「SAVE」をクリックします。
![script_url.png](https://qiita-image-store.s3.amazonaws.com/0/21998/3097043c-dbe7-d93b-9346-66d81b5380c4.png)
これでビルドしたものがDeployGateに配信出来るようになりました。簡単ですね。
#BitriseとSlack連携
最後にデプロイ結果をslackに通知してもらうためにBitriseとSlackの連携をしていきます。
①「Remote Bash Script Runner」の後の＋ボタンをクリックします。
表示されたダイアログの「ADD TO WORKFLOWS」ボタンをクリックします。
![slack.png](https://qiita-image-store.s3.amazonaws.com/0/21998/e051c885-b74f-3ebc-fac1-a1ad8d5c5a5d.png)
②「Slack Webhook URL」には発行したSlackのWebHookURLを設定し、「Target Slack channel, group or username」にはWebHookURL発行の際に決定したチャンネル名を設定します。
![slack_webhook_url.png](https://qiita-image-store.s3.amazonaws.com/0/21998/069664a2-566a-4d51-989b-e239f5a4cdef.png)
③「The message you want to send」にはデプロイ成功時のメッセージを設定し、「The message you want to send - If the build failed」にはデプロイ失敗時のメッセージを設定します。
![the_message_you_want_to_send.png](https://qiita-image-store.s3.amazonaws.com/0/21998/23d8023f-6e96-5a85-a3bc-cd08c0f2268f.png)
④「Icon URL」にデプロイ成功時にslackに表示するアイコンURLを設定し、「Icon URL - If build failed」にはデプロイ失敗時にslackに表示するアイコンURLを設定します。
![icon_url.png](https://qiita-image-store.s3.amazonaws.com/0/21998/450677f3-f417-6fa8-b19e-75f5022f07f1.png)
⑤左カラムの「SAVE」をクリックします。
これでデプロイ結果がslackに通知されるようになりました。簡単ですね。
![deploy_success.png](https://qiita-image-store.s3.amazonaws.com/0/21998/4598207e-c304-7fc8-e6cf-40bfbc5cc9af.png)
#まとめ
これでiOSアプリ開発を支えるCI環境が構築されました。
上記の設定は最低限の設定です。
設定を変えたりステップを追加することでより便利なCI環境が構築出来ると思います。
私もBitriseは触りだして間もないです。触って新たに分かったことがあれば、またまとめて書こうと思います。
#最後に
***アクトインディでは[エンジニアを募集](http://www.actindi.com/recruit/programmer)しています！！！***
もちろん、スマフォアプリエンジニアも募集しています！！！
[Androidアプリをつくりたい！250万組の親子を笑顔に！！](https://www.wantedly.com/projects/15947?ql=gaJpZM4AFTUI)
[iOSアプリをつくりたい！250万組の親子を笑顔に！！](https://www.wantedly.com/projects/913?ql=gaJpZM4AFTUI)

ここまで読んで頂きまして、ありがとうございました(∩´∀｀)∩
#参考ページ
[CI SaaS / OSSをまとめてみたら25個もあったヨ]()
[Bitrise](https://www.bitrise.io)
[iOS用のCIサービスBitriseを使ってみた]
(http://qiita.com/keygx/items/ab6149476f43ec51eb5c)
[CircleCIのiOSビルドが有料プラン化するらしいので、Bitriseの無料プランに乗り換えてみた](http://engineering.otobank.co.jp/entry/ios-build-switch-to-bitrise-from-circleci)