GitHubで使えるリリースノート(ChangeLog)自動生成ツール3選(2021年版)

![logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122958/edd5601b-a41a-af13-928d-30abf67c6e5e.png)

# はじめに

皆さんはソフトウェアの**リリースノート(ChangeLog)**をどのように作成・運用されているでしょうか？
もし「作成していない」「手動で作成している」ということであれば、作成にはかなりの工数がかかり、抜け・漏れが発生する可能性がございます。本記事ではそうしたリリースノートの作成の**工数を削減**し、**抜け・漏れを減らす**を方法として、GitHubで利用できるリリースノート(ChangeLog)自動生成ツールをご紹介いたします。

# 対象読者

- リリースノートの作成を自動化して楽したいと考えている方々

# リリースノート自動生成ツールの紹介

**実行環境**
Windows (WSL2 Ubuntu-20.04)

## 1. Spring IO github-changelog-generator

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122958/dffcf938-8836-092f-dd4d-e641dfc890ce.png)

### 1.1. 概要

Javaのフレームワークとして有名なSpringのChangeLog生成ツール。
Githubのissueとマイルストーンを指定し、ChangeLogを作成します。
コミットメッセージに依存せず、GitHubのIssuesとMilestoneから出力するシンプルな作りです。

GitHub : [https://github.com/spring-io/github-changelog-generator](https://github.com/spring-io/github-changelog-generator)

### 1.2. こんな方にオススメ

1. GitHub issueにてlabelとマイルストーンを利用しているプロジェクト
2. 過去にリリースしたリリースノートも作成したい
3. 特定のマイルストーンのみ出力したい
4. コミットメッセージにルールを作りたくない

### 1.3. 実行方法

```bash
docker run -it --rm -v $(pwd):/home \
  springio/github-changelog-generator:0.0.5 \
  java -jar github-changelog-generator.jar \
   --changelog.repository=[オーナー名]/[プロジェクト名] \
   --github.token=[GITHUB_TOKEN※] <マイルストーン> /home/ChangeLog.md
```

**※GITHUB_TOKENの払い出しについて**
GitHub APIを50回/時間の制限を解除するため、[パーソナルアクセストークン](https://github.com/settings/tokens/new)ページから払い出しておきましょう。(repoへのアクセス権限のみあればOKです)

**コマンド実行**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122958/f73592ca-549c-6291-7141-87a51778effb.png)

このファイルは `/home`にマウントしたカレントディレクトリ`$(pwd)`に出力されます。

### 1.4 出力結果

**markdownファイル**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122958/9f7e84b1-40d6-4e46-a823-e95e6a3514dc.png)

**GitHubの場合以下のように出力されます**
ForkしたリポジトリからのMergeされた場合はContributorsにユーザも付与されます。素敵ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122958/8dc47d4a-4619-1235-f9f9-8253fc9b2426.png)



## 2. github-changelog-generator

### 2.1. 概要

Ruby製のChangeLog生成ツール。
オプションが豊富で柔軟な出力が可能。サマリ機能、未リリースを出力する機能がある。

GitHub: [github-changelog-generator](https://github.com/github-changelog-generator/github-changelog-generator)

### 2.2. こんな方にオススメ

1. コミットメッセージにルールを作りたくない
2. オプションにて出力内容制御したい方(細かな[オプション](https://github.com/github-changelog-generator/github-changelog-generator/wiki/Advanced-change-log-generation-examples)による制御が可能)
3. テンプレート機能を利用しない方
4. Rubyのプロジェクトへ組み込みたい方（Rakefileへ設定を組み込むことが可能）

### 2.3. 利用方法
```bash
docker run -it --rm -v "$(pwd)":/usr/local/src/your-app ferrarimarco/github-changelog-generator -u [オーナー名] -p [プロジェクト名] --token [GITHUB_TOKEN※]
```

**※GITHUB_TOKENの払い出しについて**
GitHub APIを50回/時間の制限を解除するため、[パーソナルアクセストークン](https://github.com/settings/tokens/new)ページから払い出しておきましょう。(repoへのアクセス権限のみあればOKです)

**コマンド実行**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122958/1470f223-68f3-c3ad-558e-c99a37e758e9.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122958/42c5ab51-c3df-d0f8-c828-e9de9ff0cdaf.png)

このファイルは `/usr/local/src/your-app`にマウントしたカレントディレクトリ`$(pwd)`に出力されます。

### 2.4 出力結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122958/4b3a1648-5966-e8ff-126a-e39ff4f111fb.png)

## 3. conventional-changelog / semantic-release
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122958/a38e826d-aea3-ceab-35b8-92a37e1bfc96.png)

### 3.1 概要

JavaScript製のChangelog作成ツール。
atomやvscodeなどのIDEにも対応している。
ChangeLogの作成以外にもGithubリリースの作成、コミットメッセージのlint(解析)、コミットメッセージの規制など様々な機能が搭載されております。

### 3.2. こんな方にオススメ

1. ローカルリポジトリで動作させたい
2. コミットメッセージをルール化したい( デフォルトでは"[Angular Commit Message Conventions](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines)" が採用されております)
3. 設定ファイルを用いて細かく設定したい
4. nodejsプロジェクトで開発ツールとしても利用したい(Gitフックによるコミットメッセージの制御、コミットメッセージのLint機能など)

CI/CDのリリースワークフローへ組み込む場合は[semantic-release](https://github.com/semantic-release/semantic-release) を利用しましょう。とにかく多機能！

Github : [conventional-changelog](https://github.com/conventional-changelog/conventional-changelog)

### 3.3. 利用方法

```bash
# Install conventional-changelog-cliをインストールする
npm install -g conventional-changelog-cli

# ChangeLogを作成するgitリポジトリへ移動する
cd repo

# 実行する(初回実行時はすべて出力する)
conventional-changelog -p angular -i CHANGELOG.md -s -r 0

# 実行する(追加処理)
# conventional-changelog -p angular -i CHANGELOG.md -s
```

### 3.4 出力結果

今回は[angular](git clone https://github.com/angular/angular.git) にて実行しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122958/c14eb6c6-c32c-2aaf-bf15-0653be24046f.png)

## 番外編. git-chglog

Go製のChangeLog作成ツール。
マルチOSに対応してバイナリのみで動作可能。

GitHub : [git-chglog](https://github.com/git-chglog/git-chglog)
製作者のページ: [Go製のCHANGELOGジェネレータを作った](https://blog.wadackel.me/2018/git-chglog/)

#### 残念ながら：failed to get git-tag: exit status 128 エラー

Ubuntu20-04(WSL2にて起動)にてエラーが発生
PATHに/usr/local/git-coreを通してgit-tagを実行できるようにしたものの事象を解決にはいたりませんでした。
本事象は[git-chglog#23](https://github.com/git-chglog/git-chglog/issues/23)として登録済み。CI/CDで使うにはセットアップが容易（ダウンロードするだけ）なので今後に期待したいです。

---

# 応用編：CI/CDツールと連携してGithubへreleaseする

上述ではリリースノートを自動生成するツールについてご紹介させていただきました。
次はこの機能をCI/CDツールに組み込んで自動化し、Githubのreleaseへ登録します。

## GitHub releaseとは？

GitHubにはリリースしたアプリケーションのリリースノート・ソースコード・バイナリを表示する機能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122958/694dd376-93be-0934-0e3f-7f92e59253af.png)


## 前提

今回、本機能を実現にSpring-ioのgithub-changelog-generatorを利用します。
そのため、以下のルールで運用したいと思います。

- ChangeLogの作成はIssuesから取得、作成する
- Issuesにはマイルストーンが設定され、タグと連動している

### 集計対象
[spring-io](https://github.com/spring-io/github-changelog-generator)のデフォルトの仕様に準拠したものとします。（※カスタマイズ可能です）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122958/50ac575d-7d8b-809c-2cea-cc1fb7a91383.png)

## アーキテクチャ

tagをpushしたら対象マイルストーンに設定されたIssuesからChengaLogを作成しReleaseへ登録する。またソースコードもzipファイルへ圧縮し、アップロードする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122958/81b066a7-153e-b714-c0d9-f245cad006cf.png)

## リリースノートの作成

### 1. 前提

Github Issueにマイルストーンが設定すること

**マイルストーンの作成**
![github_001.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122958/fbbf7109-a0e3-23c2-4436-59d5abf2de36.gif)

**マイルストーンの関連付け**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122958/3ff76529-d715-f18d-a148-d2e68fd7d29f.png)

**マイルストーンがクローズされていること**
![github_002.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122958/d01a5de7-962a-0912-cfe1-aba2f056bb73.gif)

### 2. GitHub Actionのコードを作成する

```yaml
name: GitHub-auto-release

on:
   push:
     tags:
       - 'v*'

jobs:
  release:
    name: Create Relaese
    runs-on: ubuntu-latest
    steps:
      # ソースコードをチェックアウト
      - name: Checkout
        uses: actions/checkout@v2
      # タグバージョンを取得する
      - name: Get Tag Version
        id: get-version
        run: echo "::set-output name=tagVersion::${GITHUB_REF##*/}"
      # Javaのセットアップ(spring-io/github-changelog-generator 実行用)
      - name: Set up JDK
        uses: actions/setup-java@v1
        with:
          java-version: 11.0.x
      # リリースノート(CHANGELOG.md) の出力 ★本日の記事にて紹介した機能
      - name: Create Release Note
        id: create_relase_note
        run: |
          wget -q -O github-changelog-generator.jar https://github.com/spring-io/github-changelog-generator/releases/download/v0.0.5/github-changelog-generator.jar
          chmod +x github-changelog-generator.jar
          java -jar github-changelog-generator.jar \
              --changelog.repository=${GITHUB_REPOSITORY} \
              --github.token=${{ secrets.GITHUB_TOKEN }} \
              ${{steps.get-version.outputs.tagVersion}} ./CHANGELOG.md
      # GitHubへのリリース
      - name: Create release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{steps.get-version.outputs.tagVersion}}
          release_name: Release ${{steps.get-version.outputs.tagVersion}}
          body_path: ./CHANGELOG.md
          draft: false
          prerelease: false
      # GitHubへAssetをアップロード(今回はtarget/CHANGELOG.mdをアップロードする)
      - name: Create Release Asset
        run: |
          mkdir target
          mv CHANGELOG.md target/CHANGELOG.md
      - name: Upload Release Asset
        id: upload-release-asset
        uses: actions/upload-release-asset@v1.0.1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./target/CHANGELOG.md
          asset_name: CHANGELOG.md
          asset_content_type: application/txt
```

### 3. 実行結果

#### 3.1 tagを登録する
```
# masterブランチへv0.0.1というタグを設定し、リモートブランチへpushします
git tag v0.0.1 master
git push origin v0.0.1
```

#### 3.2. GitHub Actionが起動し、GitHubへリリースされる

![github_003.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122958/64194f52-51f7-54a9-59a8-239fbca03702.gif)

### 4. サンプルリポジトリ
上記は以下のリポジトリで実現されております。
[https://github.com/yukiusa/github-action-auto-release-sample](https://github.com/yukiusa/github-action-auto-release-sample)

# まとめ

今回はリリースノート(ChangeLog)自動生成ツールとして3つ紹介しました。
各ツールの導入難易度としては以下の通りでございます。

| #|  導入難度 | プロダクト| 用途|
| ---- | ---- | ---- | ---- |
|1|  :star: | spring-io/github-changelog-generator| GitHub Issuesのみで手軽に運用したい方|
|2| :star::star: | github-changelog-generator/github-changelog-generator| リリースノートの出力内容を細かく制御したい方 |
|3| :star::star::star::star: |conventional-changelog | コミットメッセージのルールも作り、プロジェクトツールとしても利用したい方 |

# さいごに

いかがだったでしょうか？

- IssueのlabelやMilestoneを活用する
- コミットログにルールを用いる

この2つのアプローチによりリリースノートの自動生成を可能とします。

どのように管理するかはプロダクトオーナー次第となりますが、
リリースノート(ChangeLog）作成を自動化することで以下のことが期待できます。

- 工数を削減
- 記述の抜け漏れを低減
- コミュニケーションを円滑化

今後のプロジェクト/プロダクトの改善活動の一つに取り入れてみてはいかがでしょうか？
最後まで読んでいただきありがとうございました。