【BitriseとGithub Actionsの比較】iOSアプリでCIをやってみた

# はじめに
参加しているエンジニアコミュニティーで開催された輪読会にて[iOSテスト全書](https://peaks.cc/books/iOS_testing)を読み、その後同コミュニティーで開催されたBitrise体験会に参加しました。
その際に学んだBitriseの導入部分と、一人体験会で触ってみたGithub Actions（記事を読みながらやっただけ）の簡単な比較をCI素人目線でまとめたいと思います。

CI素人と書きましたが、最近までCIという言葉も知りませんでしたので、

>**CIとは？**
>Continuous Integrationの略で、継続的インテグレーションと呼ばれています。
>開発者が書いた新しいコードとマスターブランチ（トランク）を頻繁に統合するプロセスです。新しい機能開発のためにブランチを作成する場合、つぎにマージするまでの期間が長くなるにしたがって変更量が多くなり、マージ作業が大変になるだけでなく、問題が含まれるコードの特定と分離が難しくなります。一回のコミットでの変更量を小さくして頻繁にマージすれば、問題の発見が早くなり対処が楽になります。問題発見のオーバーヘッドを小さくするために自動化されたテストを行います。

# CI対象
ソース ：　iOSアプリ（Swift)
管理　：　Github(Public)

# 体験後のざっくり比較
### Bitrise
**メリット**
GUIでポチポチ設定できる
ログが見やすい

**デメリット**
使い放題ではない
無料プランは 300クレジット/月使える（2クレジット/分 消費してた）

### Github Actions
**メリット**
Githubだけで完結する
Publicリポジトリであれば無料で制限なく使える

**デメリット**
セットアップが少し大変(ymlファイルを書かないといけない)
ログが見にくい

# セットアップ手順
かなりざっくりとですが、BitriseとGithub Actionsのセットアップ手順をまとめておきます。
## Bitrise

#### 1. Bitriseアカウント&Workspaceを作成
無料のHobbyプランを選択
![スクリーンショット 2022-01-27 20.19.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/3c1de724-a937-e68a-bd12-d64174c49f9b.png)
![スクリーンショット 2022-01-27 20.21.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/1a148548-d742-913b-8cf5-ac4505627b04.png)

#### ２. PublicなGithubのレポジトリを選択
右上の`Add New App on Web UI`から始める
![スクリーンショット 2022-01-27 20.23.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/7d65119c-574a-d6a8-c19b-0ee54f4be44b.png)
![スクリーンショット 2022-01-27 20.23.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/e7d7e82e-2094-0d25-ac2e-bdcdef2e13db.png)

#### ３. ブランチを指定
![スクリーンショット 2022-01-27 20.27.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/9ae11a65-a103-3a27-39fa-9716e214af0a.png)
#### ４. Xcodeのバージョンを指定
`Edit`からデフォルト値が変更可能
![スクリーンショット 2022-01-27 20.33.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/c41b24c8-5c05-c162-2295-d63da0311208.png)
![スクリーンショット 2022-01-27 20.30.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/ddfcd747-5b14-a826-12b3-79deed4ec4be.png)

その他は自由に設定（不要ならスキップしてもOK）
![スクリーンショット 2022-01-27 20.34.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/9bba2e75-91b1-99f7-8efb-e82c0c1b7e29.png)
#### ５. 動かしてみる
**Bitrise**上でやっても良いし、**Github**から指定した動作をして動かしても良い
![スクリーンショット 2022-01-28 9.06.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/31a805c2-0feb-569a-de16-b6ea04ffb01e.png)

## Github Actions
#### 1. GithubのレポジトリからGithub Actionsを始める
検索してiOSを選択しました。
![スクリーンショット 2022-01-27 19.11.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/5a517830-3ec6-55ba-640d-a32c9d0832c8.png)

#### ２. 自動生成されるymlファイルを修正してコミット
![スクリーンショット 2022-01-27 19.14.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/98509789-290a-55e2-5b22-5c712024c04a.png)
自由にカスタマイズできるようですが、まずは動くものという事で、Github Actionsの記事を参考に書いて見ました。〇〇〇〇は対象のソースから取得してください。
（自動生成されたものでも動くような気もしますが、けっこう修正しました）

```yml
name: iOS starter workflow

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  build:
    name: Build and Test default scheme using any available iPhone simulator
    runs-on: macos-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Show Xcode version # Xcodeのバージョンを表示
        run: xcodebuild -version
      - uses: actions/cache@v1 # キャッシュを使う
        with:
          path: Pods
          key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
          restore-keys: |
            ${{ runner.os }}-pods-
      - name: CocoaPods
        if: steps.cache-cocoapods.outputs.cache-hit != 'true'
        run: pod install
      - name: Build
        run: xcodebuild
              -workspace 〇〇〇〇.xcworkspace
              -scheme 〇〇〇〇
              -sdk iphonesimulator
              -configuration Debug
              build
      - name: Run tests
        run: xcodebuild
              -workspace 〇〇〇〇.xcworkspace
              -scheme 〇〇〇〇
              -sdk iphonesimulator
              -destination 'platform=iOS Simulator,name=iPhone 11 Pro Max'
              clean test
```

#### 3.　動かしてみる
下記のような条件にしましたが、自由に変えて対象の動作をすればビルドとテストが動きます。

```yml
on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]
```
![スクリーンショット 2022-01-27 19.51.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/aeeffabd-ab14-1aec-e0bf-a0dfb61e586d.png)

# 感想
Github Actionsのymlを書くところでかなり詰まりました。というか今でも正しい書き方が分かってなく。。。（間違いあればご指摘頂けると嬉しいです）
基本的には、設定が簡単でログも見やすい**Bitrise**を使っていきたいなという思いが強くなりましたが、Github ActionsはGithubだけで完結するが良いので勉強は継続していこうと思ったり。


私が参加させて頂いたBitrise体験会の動画（1時間弱）は、主催者の記事（1番下）から100円で見れます！
今回の記事では導入部分だけですが、体験会ではより高度なことも勉強できました。

https://fromkk.me/n/nc646bce8b19d

体験会参加者の記事も要チェックです。

https://note.com/oka_yuuji/n/nd0bcd692616a

# 参考
https://qiita.com/koogawa/items/ddf86b56d6b82ae11473

https://qiita.com/hirothings/items/0cd2561dbf6c53cf470c

https://qiita.com/uhooi/items/7d7caf09c0290f6b75fd

https://scrapbox.io/ebiken/GitHub_Actions_%E3%81%A7_iOS%E3%81%AEXcode_Project%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89%E3%82%92%E3%81%99%E3%82%8B

https://ulog.sugiy.com/github-actions-ios-build/