[BITRISE][iOS][Android] CI をBITRISE に移行した時のメモ

iOS/AndroidプロジェクトでCI環境をBITRISEに移行したのでメモ書きを共有します。  

BITRISEからFabric Betaへのdistributionも行いましたが、内容がてんこ盛りになってしまうため、また別の機会に共有します。

BITRISEは無料で使うことができますが、ビルド回数やビルド時間、メンバー数など若干制限があります。$50/月の有料プランでも非常にお得な感じがします。
https://www.bitrise.io/pricing

# :pen_ballpoint: Sign Up
GitHubアカウントでサインアップ。
<img style="border:1px solid #999;" width="734" alt="signin.png" src="https://qiita-image-store.s3.amazonaws.com/0/156085/1e226971-b13a-8910-ad0c-505a6e66d531.png">

# :heavy_plus_sign: アプリの追加
## Add new app
1. *Add new app* を押下する。  
<img style="border:1px solid #999;" width="765" alt="addnewapp.png" src="https://qiita-image-store.s3.amazonaws.com/0/156085/d380b424-6d85-513e-4d94-039acf00191d.png">

2. リポジトリ一覧が表示される。この画面の先頭にアプリの追加先アカウントの選択ポップアップがあるので、チームで共有したい場合はチームのアカウントを選択します。  
<img style="border:1px solid #999;" width="934" alt="addnewappto.png" src="https://qiita-image-store.s3.amazonaws.com/0/156085/e1752fa8-1bf9-e3e5-0829-b5b94126a419.png">

## Setup repository access
AUTOMATIC の *No, auto-add SSH key* を選択して自動的にSSH keyが追加されるようにする。
<img style="border:1px solid #999;" width="1000" alt="auto_add_ssh_key.png" src="https://qiita-image-store.s3.amazonaws.com/0/156085/ccd423a1-daa9-7370-ccb0-8db7d23e4348.png">

## Validation setup
1. developに変更（デフォルトはmaster）
2. Nextを押してスキャンする。  
<img style="border:1px solid #999;" width="1000" alt="validation_setup.png" src="https://qiita-image-store.s3.amazonaws.com/0/156085/89b8d06f-f6b0-21dc-8bf8-fd413492ef76.png">

3. 数分かかり、Validation complete!します。


## Project build configuration (iOS)
<img style="border:1px solid #999;" width="1000" alt="build_configuration.png" src="https://qiita-image-store.s3.amazonaws.com/0/156085/42329d3c-ab9d-ce64-3270-7d9b4766e1fc.png">

iOS
- Project (or Workspace) path
- Scheme name
- iOS stack
iOS stack を`Xcode 8.3.x, on macOS 10.12 (Sierra)`に変更
<img style="border:1px solid #999;" width="1000" alt="select_build_configuration.png" src="https://qiita-image-store.s3.amazonaws.com/0/156085/50556895-5757-b3c5-d5c1-764411a226ec.png">
<img style="border:1px solid #999;" width="790" alt="change_build_configuration.png" src="https://qiita-image-store.s3.amazonaws.com/0/156085/40dc4ac4-d3cf-a94d-9b5f-360115481057.png">

プロジェクトにFastfileを含んでいる場合、Fastlaneで対応することもできるらしい。

Next > Confirmで次のステップへ

## Project build configuration (Android)
![build_configuration_android.png](https://qiita-image-store.s3.amazonaws.com/0/156085/85e2d5b6-2c20-3116-15f9-aaa019a43b98.png)

Android
- Path to the cradle file to use
- Gradlew file path
- Select a stack

Confirmで次のステップへ

## Webhook setup
特にフックしないのでSkipします。
メールよりSlackとかの方が良い場合ここで設定します。（後からWorkflowでstepを追加してもOK!）


# :hammer: ビルド
問題がなければ通る。

自分の場合、Podfileなどでプライベートなライブラリを指定していたので、以下を実行しておいた。
1. Podfile中に記載しているURLのスキームを`https`から`ssh`に変更
2. Private keyをコピー
```$ pbcopy < ~/.ssh/id_xxxx_rsa```
3. `BITRISE > アプリ > Settings > SSH Settings`にペーストして追加

参照：http://devcenter.bitrise.io/faq/adding-projects-with-submodules/

# :clipboard: Code Signing
## Code Siginingの設定
`アプリ > Workflow > Code Signingタブ`を開く
1. *PROVISIONING PROFILE* 
   iOS Dev Centerからダウンロードした.mobileprovisionファイルをドラッグ＆ドロップして追加する。  
2. *CODE SIGNING IDENTITY* 
  .p12ファイルをドラッグ＆ドロップして追加する。  
3. 2で追加したp12のパスワードを入力

## XcodeプロジェクトのCodesigning Style設定
Xcode8のCodesigning StyleがAutomaticになっている場合、BITRISE上でCodesignがうまくいかないためManualに切り替えておく必要があります。  

Xcode:
1. `Project > Target > Build Settings > Signing > Provisioning Profile`
   Debug, Releaseでそれぞれ適切なProvisioningを選択（事前にmobileprovisionをダウンロードして取り込んでおくこと）  
2. `Project > Target > Build Settings > Signing > Development Team`
  Debug, Releaseでそれぞれ適切なチームを選択（事前にp12ファイルをキーチェーンに追加しておくこと）
参照：https://blog.bitrise.io/xcode-8-and-automatic-code-signing

## codesigndoc
codesigndocというローカル環境でビルド確認できるツールがあるので実行しておけば、特にややこしいiOSの証明書関連のビルドが通るかどうかを事前チェックすることができる。

```
$ bash -l -c "$(curl -sfL https://raw.githubusercontent.com/bitrise-tools/codesigndoc/master/_scripts/install_wrap.sh)"
```

1. `.xcodeproj`か`.xcworkspace`の選択

```
Please drag-and-drop your Xcode Project (.xcodeproj)
   or Workspace (.xcworkspace) file, the one you usually open in Xcode,
   then hit Enter.  
```  
どちらかをドラッグ＆ドロップ(＝full pathで指定)してEnter

2. ビルド対象のschemeを選択する

```
Select the Scheme you usually use in Xcode
```

# :iphone: デバイス登録
`Account Settings > Test devices`で登録可能。  
BITRISE のdeploy でinstall する場合に必要。
Enterprise buildする場合や別のstepでdistributionする場合、必要ないはず。

# :hammer: 再ビルド
1. App画面の右上にある`Start/Schedule a Build`をクリック
2. 表示されたBuild configuration画面の`Workflow (optional)`でworkflowを選択する
3. `Start Build`する

# :heavy_plus_sign: Stepの追加
![fabric_step.png](https://qiita-image-store.s3.amazonaws.com/0/156085/d2d4524a-05f9-fef5-6813-f341bf750910.png)

ビルドしたipaをFabricに上げたり、iTunes ConnectでSubmitしたりできます。
iOSならFabric Betaで共有する便利なstepがありますが、
Androidの場合はGradle Runnerというstepでgradle実行してアップロードする必要があります。

# :heavy_plus_sign: 環境変数の追加
<img width="743" alt="add_env_vars_list.png" src="https://qiita-image-store.s3.amazonaws.com/0/156085/38791752-035b-f540-73ef-06e966ae1e85.png">

`Env Vars`タブから環境変数を定義することができます。
各stepで共通の変数はここに定義しておけば便利。  

また *Script* stepを使えば`envman add`を実行することにより動的に追加することもできます。(`export`は通用しなかった)  
Info.plistのBundle Version基準による自動インクリメントの例：

```
.
.
.
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $plistPath)
echo "Current build number $buildNumber"
buildNumber="${buildNumber%.*}.$((${buildNumber##*.}+1))"
echo "New build number $buildNumber"

envman add --key BITRISE_BUNDLE_VERSION --value $buildNumber
.
.
.
```

上記例の場合、Info.plistの書き換えやその後のgitへのpushが必要になり、バージョン管理的に適切でないなら、手っ取り早い手としては、BITIRISE上でのビルドナンバーを仕込むのが吉。
*Set Xcode Project Build Number* stepので$BITRISE_BUILD_NUMBERを指定してやるだけ。
![set_build_number.png](https://qiita-image-store.s3.amazonaws.com/0/156085/6d8d1aa4-7bcf-1f4e-4e96-2910dbb59ffc.png)


# YAMLフォーマットで管理
![yml_editor.png](https://qiita-image-store.s3.amazonaws.com/0/156085/048f60ee-28be-dd84-d420-bdda3b347715.png)

1. Workflow > bitrise.ymlタブを選択
2. "Download currently saved config"ボタンからymlファイルをダウンロード
3. bitrise.yml editorで直接編集すると設定が反映されます

設定は全てymlファイルとしてダウンロード&編集ができるため慣れてきたら、ymlの直接編集の方が効率が良いかもしれない。  
プロジェクトに含めておけばバージョン管理もできる。

# BITRISE CLIでローカル実行
コマンドラインで実行することができます。  

1. brewでbitirseをインストール

```
$ brew install bitrise
```

2. バージョン確認

```
$ bitrise
VERSION: 1.10.0
```

3. セットアップ

```
$ bitrise setup
```

4. 初期化

```
$ bitrise init
```

5. 設定  
ブラウザ上で設定したymlファイルに置き換える。  
`App画面 > Workflow > bitrise.ymlタブ`を選択し、`Download currently saved config`でダウンロードしたbitrise.ymlと置き換える。

6. workflow一覧確認

```
$ bitrise run
```  

7. workflowを指定してrun

```
$ bitrise run WORKFLOW_ID
```

—-
非常に便利です、BITRISE。 
長々と書き連ねましたが、ブラウザ上でポチっていけば基本終わります。

今回はMacのSafariから操作しましたが、iOSのSafariからも操作できてしまいます。*少し怪しい部分もあるので要注意

---

[Expose an Environment Variable and use it in another Step](http://devcenter.bitrise.io/tips-and-tricks/expose-environment-variable/)

[使用可能なBITRISE 環境変数一覧](http://devcenter.bitrise.io/faq/available-environment-variables/)