GitHub ActionsでktlintFormatのコミットを作成する

# 概要

Androidのアプリ開発でktlintFormatを適用したいです。
毎回自分でやるのは手間なので、GitHub Actionsでやらせていきます。

# 前提
ktlintFormatが実行できること
以下のコマンドが実行できればOK
```sh
./gradlew ktlintFormat
```
# 結論

```ktlint.yaml
name: ktlint CI

permissions:
  actions: write
  checks: write
  contents: write

on:
  push:
    branches:
      - "master"
      - "docs/actions"
    paths-ignore:
      - README.md
  pull_request:
    branches: [ "master" ]
    paths-ignore:
      - README.md

jobs:
  ktlint:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
      - name: Set up Java 17
        uses: actions/setup-java@v3
        with:
          distribution: microsoft
          java-version: 17

      - name: Checkout
        uses: actions/checkout@v2
        with:
          ref: ${{ github.head_ref }} # 現在のbranchを指定する
          fetch-depth: 0

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew

      - name: Run ktlintFormat
        run: ./gradlew ktlintFormat

      # ktlintFormatの結果、ファイルに差分の有無をチェックする
      - name: Check if there are any changes
        id: verify_diff
        run: |
          git diff --quiet . || echo "changed=true" >> $GITHUB_OUTPUT

      - name: Run Push
        # ファイルに差分があるときにのみpushする
        if: steps.verify_diff.outputs.changed == 'true'
        run: |
          git config user.name github-actions
          git config user.email github-actions@github.com
          git add app/src/*
          git commit -m "[Auto] ktlintFormat"
          git push
```

# 詳細

ポイントを絞って補足していきます。

### 権限の追加
コミットを作成するにあたって権限を付与する必要があります。
すべては不要かもしれません。

```ktlint.yaml
permissions:
  actions: write
  checks: write
  contents: write
```

### ブランチの変更
現在のブランチに切り替えなければならないケースがあります。

```ktlint.yaml
   - name: Checkout
        uses: actions/checkout@v2
        with:
          ref: ${{ github.head_ref }} # 現在のbranchを指定する
          fetch-depth: 0
```

### gradlewの実行権限

gradlewの実行権限を付与する

```ktlint.yaml
      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
```

### ktlintFomratの実行

ここまででktlintFomratを実行する準備ができました。
ktlintFormatを実行します。

```ktlint.yaml
      - name: Run ktlintFormat
        run: ./gradlew ktlintFormat
```

### ファイル変更の有無をチェック

ktlintFormatにより、ファイルに変更があるかどうかを確認します。

```ktlint.yaml
      - name: Check if there are any changes
        id: verify_diff
        run: |
          git diff --quiet . || echo "changed=true" >> $GITHUB_OUTPUT
```

### プッシュする

ファイルに変更がある場合にのみコミットを作成し、pushする
```ktlint.yaml
    　- name: Run Push
        if: steps.verify_diff.outputs.changed == 'true'
        run: |
          git config user.name github-actions
          git config user.email github-actions@github.com
          git add app/src/*
          git commit -m "[Auto] ktlintFormat"
          git push

```

# 注意
ktlintFormatを実行しても解決しない指摘に関しては、あらかじめ発生しないようにしておく必要があります。
例えば、以下の指摘の場合にはAndroid Studioの設定でワイルドカードのimportを禁止するようにしておくのがよいでしょう。
```
Wildcard import (cannot be auto-corrected)
```

# 参考
以下、参考にさせていただきました。
- [はじめてのGitHub ActionsでPUSHをトリガーにテキスト追記](https://monomonotech.jp/kurage/memo/m220216_github_actions_hello_world.html)
- [GitHub Actions上でgit commitするときにgit userをどうするか](https://qiita.com/thaim/items/3d1a4d09ec4a7d8844ce)
- https://github.com/actions/checkout#push-a-commit-using-the-built-in-token