エラーを100回以上出して学んだ CIツール(Bitrise) の使い方 【設定全公開】

# はじめに
こんにちは！ iOSエンジニアの [やまたつ](https://twitter.com/yamatatsu109_ja)  です☺️
[Oshidori](https://apps.apple.com/jp/app/oshidori/id1463179915#?platform=iphone)  というアプリを個人で開発し、リリースしています！
この記事は**仕事で得た知見**を残すために書いております。
また、**iOSエンジニアを目指す方のポートフォリオにCIツールを追加するとき**に読んでもらえたら良いな〜と思ってできるだけ丁寧に書いております。

# 何書いてるか
会社から**「Slackからメッセージを送り、CIツールでビルドして DeployGate にアップロードして、結果を Slack に送る」**というミッションをいただき、悪戦苦闘しながら知識を身に付け、なんとか形になりました👏
この記事では、自分のアプリを元に上記の流れを再現していきたいと思います。（さすがに会社の設定は見せられないので笑）
この記事を書きながら  Bitrise, DeployGate, Slack の設定をしていきます！


# 背景
以下のツイートに対して知り合いが「記事待ってます！」とリプしてくれたので記事化に踏み切りました笑

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">先週から Bitrise (CIツール) をずっと触っていてコーディング何もしてない笑<br>Bitrise についてめちゃめちゃ詳しくなった気がする。<br><br>今度 Bitrise について記事書きたいな😊</p>&mdash; やまたつ(25)@Oshidori開発者_Swiftエンジニア (@ta__ta01) <a href="https://twitter.com/ta__ta01/status/1177024109869289472?ref_src=twsrc%5Etfw">September 26, 2019</a></blockquote>

Bitrise 公式からも「記事待ってるよ！」的なコメントをいただき、さらに背中を押されました笑

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Bitrise 公式のニュースに載ってる！嬉しい！記事書けって言われててわろた <a href="https://t.co/5zfvKUqry1">https://t.co/5zfvKUqry1</a> <a href="https://t.co/wlvqwnne1h">pic.twitter.com/wlvqwnne1h</a></p>&mdash; やまたつ(25)@Oshidori開発者_Swiftエンジニア (@ta__ta01) <a href="https://twitter.com/ta__ta01/status/1180065523519774721?ref_src=twsrc%5Etfw">October 4, 2019</a></blockquote>


# Bitrise の概要

CIツールです。Jenkins や Circle CI などを聞いたことがある方は馴染みがあると思いますが、それの仲間みたいなもので、モバイル開発に特化しているCIツールです！
手順（Workflow）を用意しておいて、定期実行だったり、トリガー（Slackのコマンド、git で マージした時）によって実行させたりできる便利なやつですね！
AppStoreConnect にもアップできるし、DeployGate、TestFlight の配布ツールにもアップできます。

まずはこの記事で概要を掴みました。
[【コード0行】BitriseでiOSアプリのデプロイ自動化してSlackに通知するまで](https://qiita.com/hirothings/items/18c767ba396d7a04ddeb)


Bitrise のアカウントはこちらから作成できます。

https://app.bitrise.io/referral/bc3c609d8d14fa45


# Bitrise への登録
登録してみましょう☺️
登録が終わったら、勝手にビルドされますが一旦放置で大丈夫です。
ここまでは楽勝✌️ ドキュメント見なくても行けます。
[iOS用のCIサービスBitriseを使ってみた
](https://qiita.com/keygx/items/ab6149476f43ec51eb5c#-workflow)

# 証明書をアップロードしておく
ここをみたらアップロードできる！Code Signing に .p12 ファイルをアップロードしましょう！
[iOS code signing - troubleshooting](https://devcenter.bitrise.io/jp/code-signing/ios-code-signing/ios-code-signing-troubleshooting/)


# DeployGate への登録
アカウント作成し終わったら、下の写真の「グループ」からアプリのページを新規作成します。
![スクリーンショット 2019-10-08 午後8.02.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/05d8ba97-f15a-1ede-7ed4-ef4842b81b82.png)

そして、**APIキーを控えておきます。**
![スクリーンショット 2019-10-08 午後8.02.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/738424cc-a972-06b0-1adf-d8894ebba3e5.png)



# Slack から実行する
この記事を読んだら登録できます！ 自分の Slack 環境に専用チャンネル作って、登録してみましょう。
[Slack上からBitriseのワークフローを実行する
](https://qiita.com/KazaKago/items/a367fd0b99499c8fbf73)

ちなみに自分の設定はこちら↓↓↓↓↓
`/bitrise_oshidori_ios` のコマンドを入力すると bitriseコマンドを呼び出す設定にしてます！
![スクリーンショット 2019-10-08 午後2.46.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/07e2b393-4a6f-d7ad-2b5b-18a674da7dc6.png)

可愛い画像を登録して、コマンドの説明欄に以下のような記述をしておきます。
`/bitrise_oshidori_ios b:master|w:deploygate` 
ブランチ指定とワークフロー指定をします！（bはブランチ、wはワークフローってこと）
ブランチは、Gitのブランチ名、ワークフローはBitriseで作ったワークフローの名前です！

![スクリーンショット 2019-10-08 午後2.48.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/699f1a2b-d1da-6516-e37d-fc7aa0ef06d8.png)

入力途中で予測変換みたいに出てきてくれて嬉しい😊
<img width="656" alt="スクリーンショット 2019-10-08 午後2.48.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/093f1022-5d3b-916c-4bc0-5bcbd5305061.png">

実際にコマンドを打つと、Bitriseと通信して、ビルドしてくれます。
今はエラーしか出ないと思いますが！！！実行してみることに価値がある。知らんけど🐗
`/bitrise_oshidori_ios b:master|w:primary` 
`/設定したコマンド b:ブランチ名|w:primary` とすると、実行できると思います！（primary は最初からあるワークフローです）
<img width="626" alt="スクリーンショット 2019-10-08 午後2.49.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/ed073af2-9839-382d-9a51-5f70d07ce83d.png">


# Bitrise のこれは知っとけ
ここからついに Bitrise を触っていきます💪
触るのはほぼ  Workflow なので軽く説明していきます。

以下の画像のような設定画面になっています。
<img width="1039" alt="スクリーンショット 2019-10-08 午後4.05.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/69ef7131-d2ed-c067-e637-cb648e12f9a2.png">

### workflows

手順を並べるところ。一番触るところ。いろんな項目があるのでなんでもできそうと思っている。

### Code Signing

証明書をおいておくとこ。 「~~.p12」ファイルとか
ここに証明書を置くから Bitriseがいろんなところにアップロードできるようになるんでしょうな。

### Secrets

全体で使える環境変数。公開したくないものを書いておく。例えば APIキーや、AppleID, Password など。

### Env Vars

全体で使える環境変数と、それぞれの workflow ごとに使う環境変数を設定できる。

### Triggers

workflow を実行するトリガーを設定（今回はSlackからなので使用しません）

### Stack

workflow を実行するパソコンのバージョンを選べる。Xcodeのバージョンも。
（iOS 13対応のSDK で出したいときは、 Xcode11 じゃないとダメなので設定を確認してください）

### bitrise.yml

上記の設定を全て取りまとめて、yml で表示してる。ここをいじることはないであろう。。。(ymlファイルはいじり方を知りません😇)


# Workflows の設定
workflow は一つの workflow で完結させても良いのですが、いくつかの workflow を作成し、結合させた方が良いです。
再利用性が高まったり、保守がしやすくなります（オブジェクト指向と同じ匂いがします🐶）
参考：[Bitrise のワークフローを分割して再利用性を高めよう](https://qiita.com/lovee/items/cc179ec2560ac6592d28)


まずは実際に自分が作成した workflow をお見せします！
4つの workflow で構成した `Oshidori_iOS_DeployGate` です！


![bitrise_oshidori_workflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/fcd91925-5370-e6cb-e279-da56a30cc232.png)

構成はこんな感じです↓↓↓↓↓↓↓

```
Chain_PrepareSetting
    ↓
Chain_SetupProject
    ↓
Chain_Archive
    ↓
Chain_Webhook
```

## それぞれの workflow の説明

イメージとしては、新しいパソコンでデプロイまで持っていく感じです！
**「新しいパソコンが手に入ったから、環境構築して、プロジェクトが動くようにして、アーカイブして、DeployGateにアップロードする」**
という手順になってます！

実行した際にエラーはつきものですが、必ずエラーを読むようにしてください！！！🙇‍♂️
ログがきちんと表示されているので、読むだけでどこが悪いのか分かります！

### Chain_PrepareSetting

環境構築の段階です！
この3つはお決まりとして覚えておくと良いでしょう。

#### ここで出るエラー
- `git clone` ができてない
  - ブランチ名が間違っている可能性が高いです。slack で送っているブランチ名を見直しましょう

### Chain_SetupProject

プロジェクトが動くように、`pod install` をしたり、GoogleService-Info.plist をダウンロードしています！
pods のバージョンを Podfile.lock に記載してあるバージョンに合わせましょう。
GoogleService-Info.plist は Git で管理したくないので、以下の記事を参考にしました。
[CIサービスBitriseを使ったAdHoc配信のサンプル](https://nnsnodnb.hatenablog.jp/entry/sample-use-bitrise)

詳細画像はこちら。
<img width="1309" alt="スクリーンショット 2019-10-08 午後8.09.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/e5790db9-fe4b-d332-f1c3-eec135cc918a.png">

(※企業で行った時はここに fastlane を使った環境構築や、 enterprise向けにプロジェクト構成を変更するスクリプトを書いたりしました。その時に必要だったことは、fastlaneの中で使うpasswordなどです。ここで死ぬほどエラーが出てました😭 権限なかったり、path が合ってなかったり、pod のバージョンが合ってなかったり、要因はたくさんありましたね。。。)

#### ここで出るエラー
- スクリプトがうまくいかない
  - ファイル階層が間違っていることがあります。スクリプト内に `pwd` を記述したりして階層を確認しましょう。
- Pods のバージョンでのエラー
  - Podfile.lock の一番下に記述してあるバージョンと合わせましょう。


### Chain_Archive

証明書の確認と、アーカイブをしています。
重要なのは、証明書と同じ `TEAM_ID` が設定されているかです！
`$TEAM_ID` という名前で、Secrets に設定しています。
証明書（Code Signing → CODE SIGNING IDENTITY → Team）の右に書いてある英数字です。

この辺↓↓↓↓↓↓
<img width="340" alt="スクリーンショット 2019-10-08 午後7.44.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/3fba5cbf-bb6e-7775-b803-e7e13d6dc1aa.png">


#### ここで出るエラー
- AutoProvision ができてない
  - この二つを行う
     -  [Apple DeveloperアカウントをBitriseと連携させる
](https://devcenter.bitrise.io/jp/getting-started/connecting-apple-dev-account/)
     -  [Major Noob reporting for duty sir! Simple iOS setup not working](https://discuss.bitrise.io/t/major-noob-reporting-for-duty-sir-simple-ios-setup-not-working/3860)
  - それでもできない時は、証明書を疑う。別の証明書を入れたり、本当に権限のある証明書なのか確認
- アーカイブできない
  - プロジェクト構成の問題だと思うので、プロダクトの環境構築が本当に行われているのか、README.md を見たりしましょう。
  - エラーを読み込みましょう   

### Chain_Webhook
DeployGate にアップロードして、終わったら Slack に流してます！
`DeployGateに登録する` の会で確保したAPIキーは Secrets に入れておきます。

これはOshidoriの設定画面です。参考にしてください。
 DeployGate↓↓↓↓
<img width="592" alt="スクリーンショット 2019-10-08 午後8.55.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/4bf55b8b-55ca-afd0-9ff0-749e017ebd91.png">

Slackはこの記事を見て、登録してみてください。
[SlackのWebhook URL取得手順](https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008)
Slack↓↓↓↓
<img width="490" alt="スクリーンショット 2019-10-08 午後8.56.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/86e0e7ef-2b6c-00ad-b564-ff54e58a29e7.png">

#### ここで出るエラー
- Permission Error
  - APIキー を見直しましょう
  - DeployGate: Owner Name には、グループ名を記述してください！自分のアカウント名書いてて、エラー出しました😭


## 各種設定画面
載せることができる範囲で公開します。

### Code Signing
<img width="1175" alt="スクリーンショット 2019-10-08 午後8.57.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/93ddb08d-320d-bccb-f42d-18cc5b7a20a1.png">

### Secrets
<img width="1381" alt="スクリーンショット 2019-10-08 午後8.59.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/50761000-7fbc-7840-abce-8310b90e56cd.png">

### Env Vars
<img width="1026" alt="スクリーンショット 2019-10-08 午後9.00.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/06174e8b-8609-faff-1def-44b48f9fa074.png">

こっちは特に設定していない。
<img width="696" alt="スクリーンショット 2019-10-08 午後9.01.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/2ebb69c5-f7b9-022e-52f9-410c5faae3e4.png">


# Slack から実行
`/bitrise_oshidori_ios b:master|w:Oshidori_iOS_DeployGate` を Slack から実行すると、

<img width="745" alt="スクリーンショット 2019-10-08 午後9.06.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/afaf9f95-4e83-3ed9-5301-aa8b66dbc1ae.png">

**キターーーーーーーーーーーーーーー🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉**

DeployGate を確認すると、

![スクリーンショット 2019-10-08 午後9.06.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/6ab542ca-8d52-cffa-9d79-b68877329286.png)

**ヨッシャーーーーーーーーーーーーーー🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉**



**Build Succeeded!** はとても気持ちいいのでぜひ体験してみてください☺️


# さいごに
簡単にやってる感じですが、これはエラーを合計150回以上出した体験の賜物です。（会社＋この記事作成にあたって）
タイトルでは100回以上とちょっと減らしました（なんで）
会社のは見せれないですが、今回の記事を書くために行ったビルド回数は13回ですね。頑張った😇
![bitrise_success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/7b3ed407-e7b9-e745-31f6-4f47ebe7c46b.png)

会社では13個のアプリを Bitrise で Deploygate と AppStoreConnect に上げる設定を作成しました。
多かったので140回以上エラー出してます。(workflowだけで30個以上作った)
そしてエラーの回数だけ、全社メールが飛んでいたことを後から知りました。笑
みんな、「どんだけエラーメール飛んでくるんや」って思ってただろうな。。。
無事に終わって何よりです😇

皆さんもガンガンエラー出して、Bitriseの使い方を学んでいきましょう😆

Bitrise とても使いやすくて良かったです☺️
公式のドキュメントもとても良いです！ほぼ書いてあるし。読みやすい。
Twitter で呟いたら公式アカウントが絡んでくるのも面白くて好感が持てました笑


## 参考文献まとめ
- [【コード0行】BitriseでiOSアプリのデプロイ自動化してSlackに通知するまで](https://qiita.com/hirothings/items/18c767ba396d7a04ddeb)
- [iOS用のCIサービスBitriseを使ってみた
](https://qiita.com/keygx/items/ab6149476f43ec51eb5c#-workflow)
- [iOS code signing - troubleshooting](https://devcenter.bitrise.io/jp/code-signing/ios-code-signing/ios-code-signing-troubleshooting/)
- [Slack上からBitriseのワークフローを実行する
](https://qiita.com/KazaKago/items/a367fd0b99499c8fbf73)
- [Bitrise のワークフローを分割して再利用性を高めよう](https://qiita.com/lovee/items/cc179ec2560ac6592d28)
- [CIサービスBitriseを使ったAdHoc配信のサンプル](https://nnsnodnb.hatenablog.jp/entry/sample-use-bitrise)
- [Apple DeveloperアカウントをBitriseと連携させる
](https://devcenter.bitrise.io/jp/getting-started/connecting-apple-dev-account/)
-  [Major Noob reporting for duty sir! Simple iOS setup not working](https://discuss.bitrise.io/t/major-noob-reporting-for-duty-sir-simple-ios-setup-not-working/3860)
-  [SlackのWebhook URL取得手順](https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008)

## Flutterアプリで Bitrise を使う方はこちら

https://qiita.com/yamatatsu10969/items/3590cc78c62e92718f28