10分で理解: GitLab CI/CD 上で semantic-release を実行

# 概要

[GitLab CI/CD の設定方法](https://qiita.com/ken-miyashita/items/8118fc2ffa962432224e) を前回まとめたので、応用編として [semantic-release](https://github.com/semantic-release/semantic-release) を組み込む。
semantic-release を組み込むと、release branch への Merge Request を作成して merge をしたタイミングで、以下の処理を自動実行できる。

- [semantic versioning](https://semver.org/) に基づいて、バージョン番号の自動更新
- commit log、バージョン番号をまとめて、[GitLab Release](https://docs.gitlab.com/ee/user/project/releases/index.html) への新規バージョンを登録

https://qiita.com/ken-miyashita/items/8118fc2ffa962432224e

# semantic-release のインストール

参照：[Installation | semantic-release](https://github.com/semantic-release/semantic-release/blob/master/docs/usage/installation.md#installation)

本体と GitLab 用の config をインストールする。

```bash
$ yarn add semantic-release @semantic-release/gitlab-config --dev
```

# semantic-release の設定

参照：[Configuration | semantic-release](https://github.com/semantic-release/semantic-release/blob/master/docs/usage/configuration.md#configuration)

以下のような設定を行う。

* [@semantic-release/gitlab-config](https://github.com/semantic-release/gitlab-config) をベースとする。本来は、この `extends` だけを記述すればいいのだが、今回は npm へのパブリッシュは行わないので、以下の `plugins` に必要な処理を明示している。
* "release" branch の上で　semantic-release を実行する。デフォルトでは main branch 上で実行される。
* [@semantic-release/commit-analyzer](https://github.com/semantic-release/commit-analyzer): commit log を解析して、semantic versioning に基づいてバージョン番号を決める。
* [@semantic-release/release-notes-generator](https://github.com/semantic-release/release-notes-generator): 直前のリリース以降の新規 commit log 群からリリースノートの文面を作成する。
* [@semantic-release/gitlab](https://github.com/semantic-release/gitlab): [GitLab Releases](https://docs.gitlab.com/ee/user/project/releases/) に対してパブリッシュを行う。

```json:.releaserc.json
{
    "extends": "@semantic-release/gitlab-config",
    "branches": "release",
    "plugins": [
        "@semantic-release/commit-analyzer",
        "@semantic-release/release-notes-generator",
        "@semantic-release/gitlab"
    ]
}
```



# GitLab CI/CD への組み込み

[前回の CI/CD 設定](https://qiita.com/ken-miyashita/items/8118fc2ffa962432224e) に追加して、以下の `release-job` を Pipeline に追加する。

```yml:.gitlab-ci.yml
release-job:
    rules:
        - if: $CI_COMMIT_BRANCH == "release"
    stage: deploy         # deploy ステージで実行
    image: node:latest
    script:
        - yarn install
        - npx semantic-release
```

結果として Pipeline は以下のような構成となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1861827/d7e6ef56-403a-60d4-0808-872954691fd4.png)

# Personalized Access Token の設定

参照： 

* [CI configuration | semantic-release](https://github.com/semantic-release/semantic-release/blob/master/docs/usage/ci-configuration.md#ci-configuration) 
* [Personal access tokens | GitLab](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html)

semantic-release は、git repo への push を行う権限を必要とするので、GitLab の personalized access token を準備する。

GitLab 画面右上のユーザーアイコン > Edit Profile > Access Tokens で、トークンを作成する。
下図にあるように、scope = api のトークンが必要。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1861827/0fe18ad0-b024-a616-7030-915749612717.png)

GitLab 画面左のメニュー > Settings > CI/CD > Variables で、環境変数 `GITLAB_TOKEN` を登録する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1861827/6e012023-ba29-3885-ec9a-78f96460a785.png)


# GitLab 上での動作

## Pipeline の状態確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1861827/3cd2589c-438c-c13e-7398-4e7c238eeaa4.png)

## GitLab Releases の出力を確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1861827/53a180ed-6377-925e-6a88-39562b72dd08.png)

# 詳細情報

- [semantic-release/semantic-release: Fully automated version management and package publishing](https://github.com/semantic-release/semantic-release)
- [Semantic Versioning 2.0.0 | Semantic Versioning](https://semver.org)