iOSのCIにモバイル向けCI、Bitriseを導入する(CocoaPods, GitHub Privateレポジトリ対応版)

iOS向けのビルドにCircle CIやTravis CIの利用検討をしたのですが、利用状況を考慮しながらできるだけコストを抑えて利用できるサービスを検討した結果、Bitriseを利用することにしました。

BitriseはiOSやAndroid, Xamarinに対応したCIサービスとなっています。

Werkerなどを利用して、Dockerにビルド環境を固めて都度Dockerを利用してビルドすることで、通常の無料利用することなども考えましたが、iOSでそれなりに実績のあるやり方で信頼性のあるやり方がいまいち思い当たらなかったのでiOS向けのCIサービスを利用しました。

以下、利用に当たって注意点も含めて導入方法を説明します。

![スクリーンショット 2017-03-15 15.28.56.png](https://qiita-image-store.s3.amazonaws.com/0/81083/1120e2f6-2a3c-1c02-ab47-f1969f25ac72.png "スクリーンショット 2017-03-15 15.28.56.png")


# CI対象のアプリの設定を追加
1.[Sign up!]を選択。
2.以下の4つの方法で登録できます。ここではGitHubで登録するので[Sign up with GitHub]を選択。

- eメール
- GitHub
- BitBucket
- GitLab


3.[+ADD]から[Add new app]

# ビルド設定
## Repository connected

次に以下の中からレポジトリから選択します。

- GitHub
- BitBucket
- GitLab
- Other/Manual

デフォルト状態のGitHubのタブを選択します。

GitHub認証の場合、既にMY REPOSもしくはOTHERS' REPOSの項目がありますので、対象のレポジトリを選択します。

### 注意点
GitHubのプライベートレポジトリを使用する場合はHTTPS URLではなく、SSH URLを使用しないといけない仕様になっています。

#### SSH URLへの置き換え
CocoaPodsを使用する場合、Podfile中のhttpsのURLをgit@で始まるURLに書き換える必要があります。

Before

```
pod 'SampleLib', :git => 'https://github.com/user/SampleLib.git', :tag => '0.1.0'
```

After

```
pod 'SampleLib', :git => 'git@github.com:user/SampleLib.git', :tag => '0.1.0'
```

#### `pod install`を実行可能にする
##### 1.GitHubに自分の公開鍵を登録していない場合は以下の手順で追加しておく。

GitHubの以下のURL(Settings > SSH and GPG keys)から[New SSH key]を選択する。
https://github.com/settings/keys

Keyには `ssh-keygen`などで生成した`id_rsa.pub`の中身を貼り付ける。

Title: My public key
Key: ssh-rsa xxxxxxxxxxxxxxxxx hayashier@hayashier-no-MacBook-Pro.local


#### 2.SSH Agentを起動する
`pod install`するときは、以下のコマンドでssh-agentを起動しておきます。

```
$ eval `ssh-agent`
$ ssh-add ~/.ssh/id_rsa
```

.zshrcなどの設定に追加しておくといちいち`pod install`等をする度に上記のコマンドを実行しなくても済むようになる。

確認のために以下のコマンドを入力する。

```
$ ssh-add -l
2048 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx /Users/hayashier/.ssh/id_rsa (RSA)
$ ssh -T git@github.com
Hi hayashier! You've successfully authenticated, but GitHub does not provide shell access.
```

http://devcenter.bitrise.io/faq/adding-projects-with-submodules/
http://blog.bitrise.io/2014/11/17/technical-update-private-cocoapods-support.html

## Setup repository access
1. Bot用のGitHubアカウントの作成
デプロイ専用にGitHubアカウントを作成します。

2.デプロイ用RSA鍵の作成
`ssh-keygen`コマンドを実行し、デプロイ専用の鍵を発行します。

3.発行した鍵の公開鍵をGitHubの以下のURL(Settings > SSH and GPG keys)から[New SSH key]を選択する。
https://github.com/settings/keys

Keyには `ssh-keygen`などで生成した`id_rsa_bot.pub`などの中身を貼り付ける。

4.Do you need to use an additional private repository?と聞かれますが、[AUTOMATIC]と[ADD OWN SSH]の選択肢で、[ADD OWN SSH]を選択します。

先程予め作成した`id_rsa_bot`などのデプロイ用のRSAの鍵の秘密鍵の中身を貼り付けて、[All done]を選択します。

プライベートなCocoaPodsのライブラリをGitHubに追加した際は、プロジェクトにBot用ユーザを追加する。
http://devcenter.bitrise.io/faq/adding-projects-with-submodules/

## Validation setup
ブランチ名を入力して、[Next]を選択。

Branch name: develop

## Validation setup
VALIDATING REPOSITORYと表示され、validationが始まる。
しばらくすると、VALIDATION COMPLETE!の表示に変わる。

No Shared Schemes Found For Project: xxxxxxxxxxxx.Xcworkspace.という忠告が表示される。
[Proceed anyway]を選択。

## Project build configuration
Project (or Workspace) path: xxxxxxxxx.xcworkspace
Scheme name: sample_project
iOS stack: Xcode 8.2.x, on macOS 10.12 (Sierra)

[Confirm]を選択。

## Webhook setup
[Skip the webhook registration]を選択。

[We've kicked off your first test build for you!]


# ワークフローのカスタマイズ
1.プロジェクト直下の[Workflow]タブを選択。

2.サイドメニューの[Workflow editor]から[primary]タブを選択し、ワークフローのカスタマイズをします。


例えば、テストを実行しないようにするには、[Xcode Test for iOS]のステップを選択し、ゴミ箱のアイコンをクリックします。


## Slackの設定の追加
1.ワークフローの[Deploy to Bitrise.io - Apps, Logs, Artifacts]の直後の[+]を選択。
すると、Add Stepのタイトルのポップアップが表示される。
2.Filter by titleにSlackと入力し、現れるSend a Slack messageに対して、[Add to workflows]を選択。
3.Slack Webhook URLにSlackで発行したWebhook URLを入力する。ただし、Slack APIではなく、Webhook URLの場合はここにチャンネル情報も含まれているため、Target Slack channel, group or usernameの項目は空欄にしておかないといけない。

4.変更が終わったら、[Save]を選択。変更を無視する場合は[Discard]を選択する。

## Triggerの設定
### WebHookの設定
1.プロジェクト直下の[Code]タブを選択。
2.WEBHOOKSから[GitHub (Code Push, Pull Request, Tag Push)]を選択。
3.表示される以下のようなURLをメモしておく。

```
https://hooks.bitrise.io/h/github/xxxxxxxxxxxxxxxxxxxx
```

4.GitHubの対象のレポジトリから[Settings] > [Webhooks]で[Add webhook]を選択して先程のURLを追加する。

### Triggerの設定
1.プロジェクト直下の[Workflow]を選択。
2.サイドメニューから[Triggers]を選択。
PUSH,PULL REQUEST,TAGをトリガーに指定できる。

3.ここではCIを回す頻度を抑えるために、PUSHのデフォルト設定はゴミ箱アイコンをクリックして削除する
また、PULL REQUESTのdevelopブランチへのmergeの前にビルド結果を確認できるように以下のように入力する。
SOURCE BRANCH: *
TARGET BRANCH: develop

以上で完了です。


# 参考
https://www.bitrise.io/