Edited at

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

More than 3 years have passed since last update.

12月からアクトインディにジョインしたkou_honです。

私、スマートフォンアプリエンジニアをやっております。

得意なのはAndroidアプリ開発なのですが頑張ってiOSアプリ開発もしています。

周りがRubyエンジニアの方たちばかり(そしてみんな優秀!)で毛色が違いますが頑張っていく所存ですのでよろしくお願いします :smile:

今回はiOSアプリ開発に先立って、CI環境を構築したので備忘録も兼ねて構築手順を書いていこうと思います。

ちょっと長い記事になっていますが、難しいことは書いていないので軽い気持ちで読み進めていってください :smile:

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


CIツールの選定


やっぱりJenkins?

アクトインディでは現在Jenkinsを導入して開発を進めています。

当初はすでにある環境に乗っかろうと思ったのです。。。

「iOSのビルドにはMacマシンが必要だよねー」

ゴミ箱買う?」

「Webサービスあるんじゃない?」

開発メンバーのいろいろな意見を聞き、まずはWebサービスを検索したところさまざまなCIサービスがあることを知りました。

数多のCIサービスの中から今回はBitriseを使ってみることにしました。

無料枠でいろいろ検証出来そうだったところとモバイル開発に特化しているところが決め手でした。


構築の前の準備

①Xcodeプロジェクトのスキームを編集します。ヘッダーメニュー→「Product」→「Scheme」→「Edit Scheme...」をクリックします。

edit_scheme.png

②「Manage Scheme...」をクリックします。ビルド対象のスキームの「Shared」にチェックを入れて、「Close」をクリックします。

manage_scheme.png

③プロジェクトはGitHubにプッシュしておきます。

④プロビジョニングファイルと秘密鍵(p.12ファイル)とパスフレーズを用意します。

⑤DeployGateにビルドしたファイル(ipaファイル)を転送するコマンドをWebでアクセス出来るようにしておきます。


転送コマンド

#!/bin/bash

curl -F "file=@$BITRISE_IPA_PATH" -F "token=[トークン番号]" -F "message=deploy from bitrise" https://deploygate.com/api/users/[ユーザID]/apps

コマンドの詳細はこちら→DeployGate API

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


WebHookURL発行URL

https://[slackのチーム名].slack.com/services/new/incoming-webhook



Bitriseのアカウント作成

①まずはアカウント作成です。ブラウザでサインアップページを表示して、「Jump in!」ボタンをクリックします。

jump_in.png

②GitHubと連携するのでGitHubをクリックします。

bitrise-signup.png

③GitHubのログインページに飛びます。アカウントとパスワードを入力して「Sigh in」をクリックします。

github-sign-in.png

④BitriseからGitHubのアカウントにアクセスする権限を求められますので「Authorize application」をクリックします。

github-authorize.png

⑤Bitriseからパスワード入力を求められます。GitHubアカウントのパスワードを入力して「Finish sign up」をクリックします。

bitrise-sign-up-almost-in.png

⑥これでアカウント作成完了です。簡単ですね。

bitrise-login.png


GitHubとBitriseを連携

それではGitHubにアップしているリポジトリとBitriseを連携していきます。

①画面右上に表示されているアイコンをクリックするとメニューが表示されます。「Add new App」をクリックします。

add_new_app.png

②リポジトリを選択します。

select-repo.png

③SSH設定をします。「Auto-add this key」をクリックします。

setup_repository_access.png

④ブランチを選択します。「Specify your default branch」にブランチ名を記入して「Next」ボタンをクリックします。

validation_setup.png

⑤「Configure it manually」をクリックします。

project_build_configuration.png

⑥ビルド対象のブランチ名、XcodeのWorkspaceファイル、Xcodeプロジェクトのスキーム名を記入して「I'm ready」をクリックします。

specify_the_build_configuration.png

⑦「Register a Webhook for me!」をクリックして

webhook_setup.png

⑧「Your awesome app is ready to roll!」をクリックします。

your_awesome_app_is_ready_to_roll.png

⑨「MANAGE WORKFLOWS」をクリックします。

workflow.png

⑩「rename」をクリックします。workflowの名前を変更して、左カラムの「SAVE」ボタンをクリックします。

workflow_editor_rename.png

⑪左カラムの「Code signing & Files」をクリックします。

code_signing_and_files.png

⑫「+ Add Provisioning Profile」ボタンをクリックします。プロビジョニングファイルを選択してアップロードします。

⑬「+ Add Certificate Private Key」ボタンをクリックします。

秘密鍵(p.12)ファイルを選択してアップロードします。

その後パスフレーズを設定して、「Save password」ボタンをクリックします。

code_sigining_identity_password.png

⑭左カラムの「Triggers」をクリックします。

triggers.png

⑮「REMOVE TRIGGER」ボタンをクリックします。

表示されたトリガーをクリックして、トリガーを削除します。

triggers_clear.png

⑯「+ ADD TRIGGER」ボタンをクリックします。

add_trigger.png

⑰「Pattenr name」にブランチ名、「Triggerd Workflow」にワークフロー名を設定して、「ADD TRIGGER」ボタンをクリックしてトリガーが設定します。

triggers_added.png

⑱左カラムの「SAVE」をクリックします。下記のダイアログが表示されたら「OK」ボタンをクリックします。

add_config_saved_successfully.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

③下までスクロースすると「DELETE STEP」というボタンがあるのでそのボタンをクリックして、ステップを削除します。

deploy_to_bitri..._delete_step.png

④「Xcode: Create ...」の下にある+ボタンをクリックします。

deploy_to_bitri..._deleted.png

⑤Step一覧から「Remote Bash Script Runner」を選択して「ADD TO WORKFLOWS」をクリックします。

add_step.png

⑥「Script URL」にDeployGateへの転送コマンドが書かれたファイルのURLを設定し、「Replace variables in input?」にチェックを入れて、左カラムの「SAVE」をクリックします。

script_url.png

これでビルドしたものがDeployGateに配信出来るようになりました。簡単ですね。


BitriseとSlack連携

最後にデプロイ結果をslackに通知してもらうためにBitriseとSlackの連携をしていきます。

①「Remote Bash Script Runner」の後の+ボタンをクリックします。

表示されたダイアログの「ADD TO WORKFLOWS」ボタンをクリックします。

slack.png

②「Slack Webhook URL」には発行したSlackのWebHookURLを設定し、「Target Slack channel, group or username」にはWebHookURL発行の際に決定したチャンネル名を設定します。

slack_webhook_url.png

③「The message you want to send」にはデプロイ成功時のメッセージを設定し、「The message you want to send - If the build failed」にはデプロイ失敗時のメッセージを設定します。

the_message_you_want_to_send.png

④「Icon URL」にデプロイ成功時にslackに表示するアイコンURLを設定し、「Icon URL - If build failed」にはデプロイ失敗時にslackに表示するアイコンURLを設定します。

icon_url.png

⑤左カラムの「SAVE」をクリックします。

これでデプロイ結果がslackに通知されるようになりました。簡単ですね。

deploy_success.png


まとめ

これでiOSアプリ開発を支えるCI環境が構築されました。

上記の設定は最低限の設定です。

設定を変えたりステップを追加することでより便利なCI環境が構築出来ると思います。

私もBitriseは触りだして間もないです。触って新たに分かったことがあれば、またまとめて書こうと思います。


最後に

アクトインディではエンジニアを募集しています!!!

もちろん、スマフォアプリエンジニアも募集しています!!!

Androidアプリをつくりたい!250万組の親子を笑顔に!!

iOSアプリをつくりたい!250万組の親子を笑顔に!!

ここまで読んで頂きまして、ありがとうございました(∩´∀`)∩


参考ページ

CI SaaS / OSSをまとめてみたら25個もあったヨ

Bitrise

iOS用のCIサービスBitriseを使ってみた

CircleCIのiOSビルドが有料プラン化するらしいので、Bitriseの無料プランに乗り換えてみた