Bitrise Shipを使ってみた(iOS編)

この記事は[Bitrise Advent Calendar 2019](https://qiita.com/advent-calendar/2019/bitrise)の記事です
前回はAnzNetJpさんで[[Bitrise]Utility Workflowsの紹介](https://blog.anzfactory.xyz/articles/20191218/bitrise-utility-workflows/)でした

フラー株式会社でiOSエンジニアとその他諸々をやらせていただいているAtsushiIzuです。
フラー株式会社では、スマホアプリの実利用データを提供する[App Ape](https://ja.appa.pe/)というサービスと、アプリやウェブといったプロダクトをお客様と一緒に共創していく[共創スタジオ](https://www.kyoso-studios.com/)という2つのサービスを展開しています。

私は共創スタジオに所属しており、共創スタジオで使用しているBitriseについて触れていきます :relaxed: 

# Bitrise Shipとは？
## Bitrise？
Bitriseはハンガリーにオフィスを構えており、BitriseというCI/CDサービスを展開しています。
基本的にすべてGUI上で設定が行なえ、難しい設定をすることなく使用できることが特徴と考えています。

フラーでは、2016年からアプリのビルド・配信において、すべてBitriseで行っております。

※ちなみに、ハンガリーは温泉で有名ですが、フラーも[福利厚生で温泉に入れる](https://note.com/fuller/n/nf08db58c8eef)ことで有名(？)です

## Bitrise Ship？
Bitrise ShipはBitrise上で使用可能なアドオンで、現在ベータ版となっています。

Bitrise Shipでは、以下のような機能を持っています。
- 過去のビルドバージョンの管理
- AppStore/GooglePlayなどのストア情報の管理
- 特定のビルドバージョンのテスターへの配布
- AppStore/GooglePlayへのデプロイ

主に、QAや、アプリのリリースをサポートするアドオンとなっています。
詳細は[こちらの記事](https://blog.bitrise.io/bitrise-ship-jp)をご覧ください！

## 元々の利用想定
フラーでは、Bitrise Shipをクローズドβのときから利用しておりました。

Bitrise Shipでは、QAの機能としてAdHoc版のアプリを配信する機能が追加されるとのことだったので、元々その機能を利用することを考えていました。
フラーではFabricを用いてアプリのベータ版の配信を行っているのですが、Firebaseに統合されるため、Fabricはサービスを終了するとのことで、移行先を探しているところにちょうどBitrise Shipが…！という感じです。
(ちょうどパーカーも貰ったし使ってみようかなという感じです)

ただ、ベータ版ではその機能はまだ使えず。。
デプロイはfastlaneで行っていたので、Bitrise Shipを見送っていたのですが、よーく考えてみると共創スタジオとしては最高の機能だったので、今回使ってみることにしました。

## なんで使うの？
共創スタジオでは、お客様と一緒にアプリを作っていきますが、アプリをリリースする際のアカウントはお客様のアカウントであることが多く、そのチームにフラーのエンジニアを追加してもらっています。

しかし、諸所の事情により追加できる人数が限られていたりして、エンジニア数人しか追加できないということがあります。ただ、ストア情報は基本ディレクターが考え、編集しているため、ディレクターから提供してもらってエンジニアが更新するというエンジニアに負担がかかる運用でした。

Bitrise Shipではこの問題が解決できます！
AppStore/GooglePlayの権限は追加できなくても、フラーで管理しているBitrise上でストア情報を編集できるためディレクターの方々をBitriseに追加すればエンジニアの負担がなくストア情報の更新ができます。

エンジニアはいつもどおりGitHubを更新するだけで、Bitrise Shipに反映されるため、負担は一切ありません…！

という感じで前置きがかなり長くなりましたが、実際にBitrise Shipの使い方です。

# Bitrise Shipの使い方
## Workflowの設定
フラーでは、証明書の管理はfastlane matchで、ビルド＆配信はfastlaneで…とすべてをfastlaneで行っていたため、元々のワークフローはスゴくシンプルでした。

<img width="373" alt="スクリーンショット 2019-12-19 17.48.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546638/d82d95a4-2f2c-02e5-9531-f56f674a2d31.png">

fastlaneのレーンを実行して、Slack通知するだけですね。

Shipを利用する際には、ワークフローを変える必要があったので、以下のように変更しています。
<img width="363" alt="スクリーンショット 2019-12-19 18.11.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546638/ad0b696c-4297-6d03-2825-01883f519997.png">

元々レーンの中にあったfastlane match(証明書のダウンロード)を別のStepとして用意して、Shipに
必要なXcode Archive & Export for iOSとDeploy to Bitrise.ioを追加しています。

この2つがないとShipにアップロードされないので、注意が必要です。
それぞれでShipが利用できるバージョンが決まっていますので、バージョンにも気をつけてください。

また、証明書でfastlane matchを使っていますが、実際にはBitriseで証明書を管理すべきだと思います。(Bitrise Shipで使うので)

これで、ビルドをすることでShipにipaがアップロードされ、Shipを利用できる状況になりました :relaxed: 

## Bitrise Shipの設定
次はBitrise Shipの設定になります。

ShipへはAdd-onsからいけます
<img width="1439" alt="スクリーンショット 2019-12-20 7.58.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546638/5bc6b374-9455-036b-d54b-e9f58a289ccd.png">


Shipに移動すると、バージョンの一覧が表示されます。
<img width="1439" alt="スクリーンショット 2019-12-20 8.00.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546638/c200ad90-43d3-326b-2ff2-dc380fa6ec58.png">

この一覧からバージョンを選択することで、各バージョンごとの情報を編集・確認ができます。
が、その前にまずはこのアプリ全体の設定を行います。右上のSettingsからアプリ全体の設定をします。

<img width="1439" alt="スクリーンショット 2019-12-20 8.43.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546638/149258aa-578f-44d8-cb6d-1b3cade67360.png">

必要な情報は
- App SKU
- ログインメールアドレス
- ログインパスワード
- Provisioning Profiles
- Code Signing Identity
です。
AppStore/GooglePlayにアップロードするため、これらの情報を埋める必要があります。
Provisioning ProfilesとCode Signing Identityについては、WorkflowのCode Signingから設定することで、ShipのSettingsにも表示されます。
(fastlane matchにも対応して欲しいな…)

そのあとは、一覧からバージョンを選択し、そのバージョンの情報を入力していきます。
すべて入力していくと、 :rocket: が表示され、AppStore/GooglePlayへのアップロードが可能となります！
:tada: :tada: :tada: :tada: 

<img width="1440" alt="スクリーンショット 2019-12-19 15.43.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546638/01132706-e38d-47b5-2391-3724dcd25f0b.png">

## :rocket: 

いよいよ、AppStore/GooglePlayへアップロードする工程です。
対象バージョンの右側のPublishボタンを押すことで、内部でBitriseが動いてAppStore/GooglePlayへアップロードされます。

ということで、いざPublish…！

<img width="979" alt="スクリーンショット 2019-12-20 8.51.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546638/22e0f31c-aa95-c962-14e3-8a83f9e47af4.png">

:sob: 

エラーが出ると、このような表示になります :sob: 
Activityのタブからエラーログを取得することができるので、エラーログを確認します。。

`failed to download json config file, error: failed to get response, statuscode: 500, body: {"message":"Internal Server Error"}`

:thinking: 

設定したストア情報が良くないのかサーバーエラーになっているようです。
いろいろと試してみたのですが、うまく行かず。。引き続き確認します :bow: 

# まとめ

ということで、Bitrise Shipを使って、アップロードを行う直前まで行きましたが、最後うまくいきませんでした。。
エラーについては確認して、解消したら追記します。

ただ、Bitrise Shipはベータ版ではありますが、使い方によってはエンジニアの負荷が下がる
めっちゃ良いツールと思っています。
今後のアップデートに期待です!!

## 個人的な要望リスト
今回使ってみて個人的に感じた改善点です

- fastlane matchと連携できるようになってほしい → 証明書類をすべてmatchで管理しているので
- ストア画像の並び替えができるようになってほしい → AppStoreConnectでは簡単に並び替えできるので
- App Titleを変更できるようにして欲しい → 変更の仕方がわからなかったのです
- QA機能を使いたい → 元々の目的がこれだったので、早く使いたいなーと思ってます



以上です！ありがとうございました :bow: