FlutterでCI(Github Action編)

下記環境でFlutterアプリを開発中です。

|ツールなど|バージョンなど|
|:--|:--|
| MacBook Air Early2015|macOS Mojave 10.14.5|
|Android Studio |3.6.1|
|Java |1.8.0_131|
|Flutter|1.12.13+hotfix.5|
|Dart |2.7.0|

テストが一通り書けてきたので、CIを回したくなってきました。

とりあえずいまいまは、無料で使えるところ、ということで、Github Actionsで回すことにしました。

# 1.ワークフローを作成する

Githubのリポジトリページに分かりづらいけどタブがあります。そこの[Actions]を選びます。
多分、最初はmasterに作ったほうが良いです(特に無視したいブランチがある場合)。

|![github_actions_tab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/e37ebae2-3645-4e1a-4370-30d710a4a445.png)|
|:--|

# 2.Simple workflowを選ぶ

**Simple workflow**の[Set up this workflow]を選ぶ

|<img width="847" alt="simple_workflow.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/521bd820-ea5e-39c3-0673-8f41ef6869c0.png">|
|:--|

**Simple workflow**が先頭に表示されていない場合は、[Set up a workflow yourself]でも可。

# 3.yamlを編集する

[Flutter action](https://github.com/marketplace/actions/flutter-action)というのを公開してくださっている方がいるので、そちらを利用して、下記のようなワークフローを作ってみました。

```yaml:.github/workflows/flutterci.yml
name: Flutter CI

on:
  push:
    branches:
      - 'develop'

jobs:
  prepare:
    runs-on: ubuntu-latest
    if: "! contains(github.event.head_commit.message, '[ci skip]')"
    steps:
      - run: echo "${{ github.event.head_commit.message }}"

  build:
    runs-on: macOS-latest
    needs: prepare

    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: '1.8'

      - name: Setup flutter
        uses: subosito/flutter-action@v1
        with:
          flutter-version: '1.12.13+hotfix.5'

      - name: Set up test tools
        run: |
          flutter pub get
          flutter pub global activate dart_dot_reporter
          flutter pub global activate junitreport
          pip install junit2html

      - name: Test
        run: |
          export PATH=$PATH:${FLUTTER_HOME}/bin/cache/dart-sdk/bin
          export PATH=$PATH:${FLUTTER_HOME}/.pub-cache/bin
          ./test.sh

      - name: Arcive test results
        if: always()
        uses: actions/upload-artifact@v1
        with:
          name: test-reports
          path: test-reports

      - name: Slack notification
        if: always()
        uses: homoluctus/slatify@master
        with:
          type: ${{ job.status }}
          job_name: '*Build and DebugCheck*'
          channel: '#general'
          commit: true
          token: ${{ secrets.GITHUB_TOKEN }}
          url: ${{ secrets.SLACK_WEBHOOK_URL }}
```

## prepareステップの解説

`prepare`ステップでは、最後のコミットが`[ci skip]`というコミットメッセージが始まっている場合、スキップするための設定をしています。

## buildステップの解説

- `runs-on: macOS-latest`
  - macOSにしていますが、ubuntuでも行けるはず。
- `needs: prepare`
  - `prepare`の条件を満たしていることを要求しています。結果、最後のコミットメッセージが`[ci skip]`で始まっているとビルドがスキップされます。
- `actions/checkout@v2`
  - 該当ブランチをチェックアウト
- `Set up JDK 1.8`
  - JDKのバージョンを８にしています。これはAndroidのバージョンに合わせています。
- `Setup flutter`
  - `Flutter action`を使ったflutter SDKのセットアップ
- `Set up test tools`
  - [以前の記事](https://qiita.com/kasa_le/items/3ce281bf713404a4e8c8)で紹介したhtmlファイルでテストレポートを出すため、必要なツールをインストールしています。
- `Test`
  - [以前の記事](https://qiita.com/kasa_le/items/3ce281bf713404a4e8c8)で紹介したhtmlファイルでテストレポートを出すために作成したシェルスクリプトを叩いています。その際に必要なPATHをその前に設定しています。
  -  `FLUTTER_HOME`は、`Flutter action`が設定してくれます。
- `Archive test results`
  -  テスト結果をアーティファクトにアップロード
- `Slack notification`
  - ビルド結果をSlackに通知
  - `${{secrets.GITHUB_TOKEN}}`は、 **自分でSecretsを作る必要はありません**([参照](https://help.github.com/ja/actions/configuring-and-managing-workflows/authenticating-with-the-github_token))。
 
# 3.commit

コミット・・・の前に、ファイル名を変更します。デフォルトだと、`blank.yml`になっていてかっこ悪いので(笑)

|<img width="572" alt="yaml_filename.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/41f96ecf-8d18-8e76-86f4-6988202562d3.png">|
|:--|

その後、[Start commit]ボタンを押して、適当なコミットメッセージを入れて[Commit new file]します。

対象リポジトリをmaster以外にしている場合は、masterの変更をそのリポジトリにマージしてからpushすると、最初のワークフロー実行がキックされます。

# 感想

初回だけで無く、たまにものすごく時間がかかることがあるので、テストツールのインストールあたりはキャッシュした方が良いかも・・・
`Flutter action`はキャッシュしているように見えるけど・・・