FlutterでもDangerを使いたい！！

iOSアプリやAndroidアプリを開発する際にDangerを使っていました。
Flutterでも使えないか調べたところ[danger-flutter_lint](https://github.com/mateuszszklarek/danger-flutter_lint)というものを発見したので試してみようと思います!

https://github.com/mateuszszklarek/danger-flutter_lint

## そもそもDangerって？
CIで実行し、警告などをPullRequestにコメントしてくれるものです。
Githubでは、このように書かれていました。
> Danger runs after your CI, automating your team's conventions surrounding code review.  
> This provides another logical step in your process, through this Danger can help lint your rote tasks in daily code review.  
> You can use Danger to codify your team's norms, leaving humans to think about harder problems.

ref) https://github.com/danger/danger#what-is-danger

## danger-flutter_lintのざっくりな使い方
1. `$ flutter analyze` を叩き、その結果をテキストファイルに保存
2. Dangerがそのテキストファイルを読み取り、PullRequestにコメントする

## 使用方法
今回のサンプルのリポジトリはこちらです

**リポジトリ**

https://github.com/idonuntius/DangerFlutterLintSample

**PullRequest**

https://github.com/idonuntius/DangerFlutterLintSample/pull/3

### Dangerをインストール
#### 1. Gemfileの設定
Gemfileに `danger` と `danger-flutter_lint` を追加

```Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

gem 'danger'
gem 'danger-flutter_lint'
```

#### 2. bundle install
`bundle install` の `--path` オプションがdeprecatedになったため、 `bundle config` を使用

```sh
$ bundle config set path 'vendor/bundle'

$ bundle install
```

### Dangerfileの設定

```Dangerfile
// danger
warn("WIPだよ〜〜〜〜〜〜") if github.pr_title.include? "[WIP]"

// danger-flutter_lint
flutter_lint.only_modified_files = true
flutter_lint.report_path = "flutter_analyze_report.txt"
flutter_lint.lint(inline_mode: true)
```

* danger
  * GithubのPullRequestのタイトルに「[WIP]」がついていた場合、警告します
  * 他にも警告など様々なことをカスタマイズできます
* danger-flutter_lint
  * only_modified_files: 新しく追加したファイル、編集したファイルのみ対象にする
  * report_path: `flutter analyze` の実行結果を出力したファイルを指定（次のGithub Actionsで `flutter_analyze_report.txt` というファイル名にしています）
  * lint: 結果をPullRequestに表示する

### Github Actionsの設定
Github Actionsを自分で設定するのは初めてなので、何か間違っているところがありましたら教えてください！

```yml
name: DangerFlutterLint

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]
  workflow_dispatch:
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: setup repository
        uses: actions/checkout@v2
      
      - name: setup Flutter
        uses: subosito/flutter-action@v1.5.3
        with:
          channel: stable

      - name: pub get
        run: flutter pub get
        
      - name: flutter analyze
        run: flutter analyze > flutter_analyze_report.txt
        
      - name: setup ruby
        if: ${{ failure() }}
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: 2.7
          bundler-cache: true
          
      - name: run danger
        if: ${{ failure() }}
        uses: MeilCli/danger-action@v5.0.1
        with:
          plugins_file: Gemfile
          install_path: vendor/bundle
          danger_file: Dangerfile
          danger_id: danger-pr
        env:
          DANGER_GITHUB_API_TOKEN: ${{ secrets.DANGER_TOKEN }}
```

## 結果
下記のスクショのようにコメントされました！
![スクリーンショット 2021-12-19 11.42.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265145/cc221d45-e0ac-59be-1279-71846c41a2e4.png)

## 終わりに
FlutterでもDangerが使えました！
DangerはFlutter lintの警告を表示させるだけではなく、PullRequestに関わる様々なことに使えるので凄い便利ですよね。