Github ActionsでDanger+SwiftFormat

## はじめに
まずは、あけましておめでとうございます。
去年は新卒でいろいろとヨイショしていただいたので今年はもっと自走できる用にしたいと思います。

本稿はiOSプロジェクトで`Danger`と`SwiftFormat`によるプルリクの検査を`Github Actions`で行おうとしたときのメモです。
Github Actionsについては本稿では詳しく述べません（できない）のであしからず…

## workflow file
とりあえず結論から。2020/1/2 時点で使用しているのは以下のworkflow fileです

※2020/1/2 修正: cacheを使うようにしました。[参考](https://sarunw.com/tips/caching-dependencies-in-github-actions/)

```yaml
name: Danger

on: [pull_request]

jobs:
  build:
    runs-on: macos-latest

    steps:
    - uses: actions/checkout@v1

    - name: Setup ruby
      uses: actions/setup-ruby@v1
      with:
        ruby-version: '2.6.3'

    - name: Cache bundle
      uses: actions/cache@v1
      with:
        path: vendor/bundle
        key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-gem-

    - name: Bundle install
      run: |
        gem install bundler
        bundle config path vendor/bundle
        bundle install --jobs 4 --retry 3

    - name: Cache CocoaPods
      uses: actions/cache@v1
      with:
        path: Pods
        key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-pods-

    - name: Pod install
      run: bundle exec pod install

    - name: Run danger
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: bundle exec danger
```

コードで大体わかると思いますが、以下のことを行っています。

0. プルリク（関連のイベント）をトリガーに
1. ブランチのチェックアウト
2. Rubyのインストール
3. Bundleのキャッシュ
3. BundlerのインストールとGemfileのライブラリをインストール
4. CococaPodsのキャッシュ
4. Podfileのライブラリをインストール
5. Dangerを実行


## ライブラリ構成
SwiftFormat込みでこのworkflowを動かすには、

```
Bundler
  ├ Danger
  ├ danger-swiftformat
  └ CococaPods
      └ SwiftFormat/CLI
```
の構成でのライブラリの管理が最低限必要になります。
<details><summary>Gemfile</summary><div>

```
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "cocoapods", "1.8.4"
gem "danger", "6.1.0"
gem "danger-swiftformat", "0.6.0"
```
</div></details>
<details><summary>Podfile</summary><div>

```
target 'HOGE' do
  pod 'SwiftFormat/CLI', :git => 'https://github.com/nicklockwood/SwiftFormat', :tag => '0.40.14', :configurations => ['Debug']
end
```
</div></details>
<details><summary>Dangerfile</summary><div>

```
swiftformat.binary_path = "Pods/SwiftFormat/CommandLineTool/swiftformat"
swiftformat.check_format(fail_on_error: true)
```
</div></details>

## はまったところ
### Github Actionsは元々dangerサポート？
Github ActionsでDangerやりたいなーと調べていたとき、
>Github Actionsは元々dangerサポートしているので run: danger でおｋ

みたいな記事を参考にしてやってたのですが、`no such command`でどっちやねんってなってました。
結局Bundlerでインストールして`bundle exec danger`でうまくいきました。

### Invalid \`Dangerfile\` file: No such file or directory - swiftformat
これは単純にSwiftFormatのバイナリファイル（実行するファイル）を指定していなかったためでした。
`swiftformat.binary_path = "Pods/SwiftFormat/CommandLineTool/swiftformat"`で明示的に指定して解決しました。

### Invalid \`Dangerfile\` file: Error running SwiftFormat: Error: Pods/SwiftFormat/CommandLineTool/swiftformat: 12: Pods/SwiftFormat/CommandLineTool/swiftformat: Syntax error: "(" unexpected
これは結構悩みました… エラー文言に惑わされて、パスの文字列に変な文字でも入ってるかな？と最初疑いましたが関係ありませんでした。
結論から言うと、実行環境を`ubuntu-latest`から`macos-latest`にしたことで解決しました。
ちゃんと検証していないので確定ではないですが… 僕のMacのローカル環境でのSwiftFormatのバイナリのパスは`Pods/SwiftFormat/CommandLineTool/swiftformat`だったのですが、Ubuntuでは違うものになるのかなと推測しています。

## 最後に
`Github Actions`便利ですね！
はじめはBitriseで同じことをしようと思っていましたが、明らかにスマートに実装できています。

新年1日目から投稿できた！