GitHub Actions で作成した Release の説明に前回のReleaseに含まれる CHANGELOG.md との差分を表示させる方法について

#経緯
現状では、Tagがpushされたタイミングで自動ビルド&リリースが走るようになっているのですが、その際にリリースの説明に```CHANGELOG.md```の差分を表示したいと思い作ってみることにしました。

#サンプル
前提条件として、Releaseに上げているときのTagが```v*```である必要があります。
また、Release以外のときにTagが追加された場合や、GitHub Actions が実行されたタイミングでTagが無い場合では正常に動きません。(差分がTagが作成された地点からの差分になるため)
以下のサンプルはリポジトリ直下に```CHANGELOG.md```があるのを想定したサンプルです。

```yml:AutoRelease.yml
on:
  push:
    tags:
      - "v*"

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
    
      - name: Get diff from CHANGELOG
        run: |
          BEFORE=`git describe --tags v${GITHUB_REF#refs/*/v}^^`
          echo 'CHANGELOG<<EOF' >> $GITHUB_ENV
          git diff -u $BEFORE CHANGELOG.md | grep ^+ | grep -v ^+++ | sed s/^+// >> $GITHUB_ENV
          echo 'EOF' >> $GITHUB_ENV

      - name: Create release
        uses: softprops/action-gh-release@v1
        with:
          tag_name: ${{ env.RELEASE_VERSION }}
          name: Release ${{ env.RELEASE_VERSION }}
          body: ${{ env.CHANGELOG }}
          draft: false
          prerelease: false
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

#実際の動き方
##最初の状態
まず```CHANGELOG.md```はこのようになってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447593/1146e0c3-baab-b380-491a-6a86c959dd58.png)
そしてTagも設定しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447593/e13a516f-fa96-3eae-c809-3049c17728b9.png)
##CHANGELOG.md を更新してコミット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447593/e9bac4a4-fe1a-c479-3184-31b3d7078839.png)

このように```CHANGELOG.md```を2回のコミットにわけてTag```v1.1.0```を付与してPushします。
すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447593/0313b858-9343-da4f-582e-1a8d9b08a3da.png)
このように GitHub Actions が走り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447593/8d726e9f-5e53-8036-085c-dd79beb97822.png)
```CHANGELOG.md```の差分で追加されたところだけがReleaseのメッセージに表示されました。

#躓いた点や解説
サンプルを元に躓いた点と解説などを書いていきます。

##過去のタグやコミットログが取得出来ない
これは GitHub Actions にてチェックアウトする際に、最新分しかfetchしていないためです。
その為チェックアウト部分を下記のようにすることで解決できました。

```yml
      - name: checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
```
これでチェックアウト時にすべて fetch するようになりました。 

##現在のTagの1つ前のTagを取得する
これが以外と情報が少なくて手こずりました。
サンプルでは

```yml
BEFORE=`git describe --tags v${GITHUB_REF#refs/*/v}^^`
```
が該当する箇所です。

まず、```${GITHUB_REF#refs/*/v}```で現在のTagを取得しています。ただこれは```v*```の```*```部分だけしか取得出来ないので```v${GITHUB_REF#refs/*/v}```にしています。
そして```git describe```でTagを取得するのですがその際に現在のTagの後ろに```^^```を付ける事で過去のTagを取得出来ました。

##環境変数に複数行の出力結果を書き込む
まず、環境変数を出力する方法なんですが、これはドキュメントに書かれているように
``` run: echo "{name}={value}" >> $GITHUB_ENV　```
で環境変数を更新することが出来ます。
なので下記のように書いてみました。

```yml
echo 'CHANGELOG=`diff -u $BEFORE CHANGELOG.md | grep ^+ | grep -v ^+++ | sed s/^+//`' >> $GITHUB_ENV
```

しかし、このように書くと下記のようなエラーが出てしまい、複数行出力することが出来ませんでした。

```
Error: Unable to process file command 'env' successfully.
Error: Invalid environment variable format '
```

なので下記のようにしました。

```yml
echo 'CHANGELOG<<EOF' >> $GITHUB_ENV
git diff -u $BEFORE CHANGELOG.md | grep ^+ | grep -v ^+++ | sed s/^+// >> $GITHUB_ENV
echo 'EOF' >> $GITHUB_ENV
```

どうやらEOFが無いのが原因だったみたいです。

#さいごに
これで自動リリース時に、前回リリース分のCHANGELOG.mdとの差分で追加された部分がリリースメッセージに表示されるようになりました。
CHANGELOGの生成も自動化することで、もっと手間を減らせると思います。
また、もっとよい方法など有れば教えていただければ幸いです。