[Bitrise][iOS] GitHubのPull RequestをBitriseでフックしてUnit Testする

今までtarget branchにmergeされた時点でUnit Testを行いArchiveしてFabric配布していたのだが、そもそも開発フロー的にUnit Testが成功していることが前提でtarget branchにmergeされるべきなのでなんとかしたい、と同僚からごもっともなご意見があったので、Pull Request作成時点およびsource branchにpushされたらUnit Testを行うようにしてみた。

# 設定箇所のYAML
Unit Testだけ行う単純なworkflowの追加。

```YAML:bitrise.yml
...
workflows:
  unit_test:
    steps:
    - activate-ssh-key@3.1.1:
        run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}'
    - git-clone@3.5.2: {}
    - cache-pull@1.0.0: {}
    - certificate-and-profile-installer@1.8.8: {}
    - cocoapods-install@1.7.1: {}
    - carthage@3.1.3:
        inputs:
        - carthage_options: "--platform iOS --cache-builds"
    - set-xcode-build-number@1.0.5:
        inputs:
        - plist_path: "$BITRISE_INFO_PLIST_PATH"
        - build_version: "$BITRISE_BUNDLE_VERSION"
    - xcode-test@1.18.10:
        inputs:
        - project_path: <WORKSPACE_NAME>.xcworkspace
        - scheme: "$BITRISE_SCHEME"
...
```
develop ブランチがターゲットのプルリクをフックしてunit_test workflowを実行する。

```YAML:bitrise.yml
...
trigger_map:
- pull_request_source_branch: "*"
  pull_request_target_branch: develop
  workflow: unit_test
...
```

# 作業
## Webhook追加
まずはGitHub 側にPull Request and PushのWebhookを用意する。
`GitHubプロジェクト > Settingsタブ > Webhooks`
<img width="753" alt="github_webhook.png" src="https://qiita-image-store.s3.amazonaws.com/0/156085/cadd7750-aa17-8061-9b7e-6ee6025e0a49.png">

既に `https://hooks.bitrise.io` から始まるURLで`pull_request and push` のフックがあればスキップ。
無い場合は[以前書いた記事](https://qiita.com/a_jike/items/a97933a70cd4946d068e)の **1-1** を行い追加してください。

## Workflow追加
BitriseにUnit Testだけ行うworkflowを作る。
既存の配布workflowをベースにして作ると楽。
<img width="434" alt="add_worflow.png" src="https://qiita-image-store.s3.amazonaws.com/0/156085/45986948-9767-41c7-7d71-591b85693462.png">

不要なステップを削除して最後にUnit Testを行うようにする。
![unit_test_workflow.png](https://qiita-image-store.s3.amazonaws.com/0/156085/808cd3b4-d90c-3799-e50d-a2e14116bdef.png)



## Trigger追加
Bitriseの `Workflow Editor > Triggers > Pull Request` に追加する。
`SOURCE BRANCH` は * にしておく。
workflowは上で作成したものを指定する。
<img width="716" alt="trigger_pull_request.png" src="https://qiita-image-store.s3.amazonaws.com/0/156085/00f03dbc-9164-1c4b-1cc6-743d4e72d125.png">


## 配布用のworkflowからUnit Testを外しておく
target branchにmergeされた後に発動する配布workflowがある場合、もうそこではUnit Test不要なのでステップを外しておく。これで少し早くなる。

## Pull Request
プルリクしてみるとGitHubにもこのような形で表示される。
workflowの実行が終わるまで待つ。
<img width="581" alt="pull_request_checking.png" src="https://qiita-image-store.s3.amazonaws.com/0/156085/39fe2865-8df7-9a9a-3525-dcc504ca17c8.png">

テストが失敗した場合、mergeできない。
<img width="588" alt="pull_request_failed.png" src="https://qiita-image-store.s3.amazonaws.com/0/156085/dffb38dc-064c-1afd-eebe-f669a65aead9.png">

テストが成功した場合、merge 可。
<img width="582" alt="pull_request_succeed.png" src="https://qiita-image-store.s3.amazonaws.com/0/156085/5f9f95ad-8c88-076d-7c27-f4a9db368313.png">

# 感想
Bitriseの稼働が若干増えるが、プルリクした時やそれに変更を加えるごとにテスト実行してくれるようになったのでかなり安心。
mergeされてから「Unit Test通らないんですけどー」とかなくなるので、少なくともUnit Testだけ修正しないとならないチケットはもう作らなくて済むし、それを防ぐために毎回レビュー時にテスト実行しなくても良くなるのですごく楽になる！！はず！
あと配布時のビルドも数分早くなるので嬉しい。
ありがとう同僚！

---
https://www.bitrise.io/

```
                              MMMMMMMMMMMM                                
                              MMMMddddNMMM                                
                              MMMM    mMMM                                
                              MMMMssssNMMM                                
                              MMMMMMMMMMMM                                
                                 sMMMMd                                   
                                 yMMMMd                                   
      MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM      
      MMMMdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdMMMM      
      MMMM                                                      MMMM      
      MMMM                                                      MMMM      
     MMMMM                                                      MMMMMM    
  MMMMMMMM                                                      MMMMMMMM  
 MMM' MMMM           .yy.                        .yy.           MMM  'MMM 
MMMh  MMMM         .MMMMMMl.                  .lMMMMMMM.        MMM   hMMM
MMM   MMMM       .MMMMMmNMMMl.               .MMMMNmMMMM.       MMM    MMM
MMMs  MMMM       .hhhh   yhhh.               .hhhh   hhh+       MMM   sMMM
 MMM. MMMM                                                      MMM  .MMM 
  MMMNMMMM                                                      MMMMNMMM  
    MMMMMM                                                      MMMMMM    
      MMMM                                                      MMMM      
      MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM      
      MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM      
      MMMM                                                      MMMM      
      MMMM                                                      MMMM      
      MMMM                                                      MMMM      
      MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM      
      MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM      
```