TravisCIからBitriseへの移行

みなさんCIはうまく回せていますか？:smile_cat:
私はTravisCI+Fastlaneを使っていたのですが、Appleアカウントが2段階認証必須になったことで無事死亡しました:innocent::clap::clap:
一応[組織アカウントであれば回避方法がある](https://speakerdeck.com/domonr/aruarult-domonr-2019-03-19)のですが、個人アカウントではどうすることもできず、Bitrise+Fastlaneに乗り換える決断をすることになりました:rocket:
この記事では移行するにあたって参考にしたページや実際の作業について書いていきます📝

# TravisCI+Fastlaneでしていたこと
詳細は[こちら記事](https://qiita.com/Yaruki00/items/8e0a76a740b0fcd399c2)にまとめてありますが、かいつまんで書くと以下のことをしていました。

### Travis
- Xcodeバージョン指定
- cocoapodsのインストールとキャッシュ管理
- CIが動くブランチとトリガーの指定
- fastlaneの実行
- 環境変数の設定

### Fastlane(括弧内はaction)
- 証明書とプロビジョニングプロファイルの取得(`import_certificate`, `sigh`)
- アーカイブとエクスポート(`gym`)
- DeployGateにアップ(`deploygate`)
- Slackに成否の通知(`slack`)

# Bitrise+Fastlaneでしていること
TravisCI+Fastlaneの時にFastlaneでしていたことの一部をBitriseでやるようになりました。

### Bitrise
- Xcodeバージョン指定
- cocoapodsのインストールとキャッシュ管理
- CIが動くブランチとトリガーの指定
- **証明書~~とプロビジョニングプロファイル~~の設定**(最初は両方アップロードしてましたが、`sigh`が使えることが後でわかったので証明書だけに変わりました)
- fastlaneの実行
- 環境変数の設定

### Fastlane(括弧内はaction)
- プロビジョニングプロファイルの取得(`sigh`)
- アーカイブとエクスポート(`gym`)
- DeployGateにアップ(`deploygate`)
- Slackに成否の通知(`slack`)

# Bitriseあれこれ

## 始めるまで
アカウント作ったりリポジトリと連携したりという部分ですが、ここらへんはいくらでも参考記事がすでにあるので、そちらに譲ります。
若干UIが変わっていたりしますが、基本的にはガイドに従ってポチポチやれば問題ないはず。
[iOS用のCIサービスBitriseを使ってみた](https://qiita.com/keygx/items/ab6149476f43ec51eb5c)
[[iOS] Bitriseを導入する手順について](https://dev.classmethod.jp/smartphone/iphone/prepare-for-ios-app-distribution-part-3/)

## Xcodeバージョン指定
[利用可能なスタック](https://devcenter.bitrise.io/jp/infrastructure/available-stacks/)
Bitriseでは仮想マシンのバージョン(Xcodeのバージョン含む)のことをスタックと呼んでいます。スタックを指定することによって、どのXcodeバージョンでビルドさせるかを変えられます。

## ステップとワークフロー
[ステップ](https://devcenter.bitrise.io/jp/getting-started/getting-started-steps/)
ステップは事前に定義された入力・出力変数があるスクリプト実行のブロックをあらわします。 たくさんのステップが標準で用意されており、例えばリポジトリを`git clone`する、`pod install`を実行するなどのステップがあります。大抵のことは標準のステップで事足りますが、不十分な場合は自作することもできるようです。

[ワークフロー](https://devcenter.bitrise.io/jp/getting-started/getting-started-workflows/)
ワークフローは複数のステップの集まりです。アプリのビルド時に、ステップがワークフローで定義されたステップが実行されます。ワークフローエディタなるGUIが用意されており、そこでポチポチすることでワークフローを編集できます。テキストが好みの方はyamlでも編集することができます。

[こちらの記事](https://qiita.com/lovee/items/cc179ec2560ac6592d28)のようにワークフローを分割して再利用すると良い感じにできます。

## CIが動くブランチとトリガーの指定
[ビルドのトリガー](https://devcenter.bitrise.io/jp/builds/triggering-builds/triggering-builds/)
手動による開始、スケジュールによる開始、トリガーイベントによる開始が選べます。ブランチへのプッシュやPull Requestをトリガーにすることができます。

## 証明書とプロビジョニングプロファイルの設定
[Bitrise上でのiOSコード署名](https://devcenter.bitrise.io/jp/code-signing/ios-code-signing/code-signing/)
Bitriseではビルド時に使用する証明書とプロビジョニングプロファイルを事前にアップロードしておくことができます。テストデバイスを増やすなどでファイルが更新されるたびにアップし直さなければならないので若干面倒ではありますが、これによってTravisCI(上での`sigh`実行)ではできなかった2段階認証をかわすことができます。
下記のAppleアカウントとの連携をすることでFastlaneの`sigh`も実行できることを確認しました。というわけで、TravisCI上で使っていたFastlaneのlaneがそのままBitriseで使えました。

## 環境変数の設定
[秘密と環境設定](https://devcenter.bitrise.io/jp/builds/env-vars-secret-env-vars/)
他のCIよろしく環境変数を設定しておくことができます。ちょっとおもしろいのが、秘密にすべきものとその他で分かれていることです。秘密にしないものはプルリクエストによって引き起こされるビルドで公開される、と書かれているので注意が必要です。

## Appleアカウントとの連携
[App Store Connect 2FA solved on Bitrise](https://blog.bitrise.io/app-store-connect-2fa-solved-on-bitrise)
BitriseのアカウントとAppleのアカウントを連携させることができるみたいです。これによって2段階認証を通すことができるので、App Store Connectへのビルドアップロードであったり、Fastlaneの`sigh`なども使えそうです。
ただし、連携させることのできるAppleアカウントは1つだけみたいです。複数使っている場合は都度切り替えるしかないのでしょうか・・・
[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)
アカウント連携したはずなのに`No Apple developer account found for this build.`というエラーが出るという場合は、Appのteam設定が足りてない可能性があるので確認してみましょう。

# 使ってみた感想
親切なUIになっていて、導かれるがままにポチポチすれば大抵のことはできてしまうので、敷居は低いかなと思いました:cherry_blossom:
ステップもほぼほぼデフォルト設定で使えるものばかりでした:feet:
Fastlaneがだいたいそのまま使えたのも良かったです:100:

気になるところとしては、若干画面描画に時間がかかることがあるかなというのと、Appleアカウントを1つしか連携できないことです:scream_cat:
アカウントに関しては、いろんな組織と一緒にアプリを作ればいろんなアカウントがあるわけで、複数登録できるようになると非常に嬉しいです:pray: