## 経緯
[[Conventional Commits]]を採用したので、どこまで自動化できるのかを試してみたい。一番有名そうな[[semantic-release]]を試してみる。
> [!attention]
> 何ができるかを試すだけで、この方式を採用するかは決めていない。
## リポジトリ作成
実運用しているリポジトリでの動作確認はリスキーなので、動作確認用のリポジトリを作成する。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<p class="link-card-title">tadashi-aikawa/semantic-release-sandbox</p>
<p class="link-card-description">Contribute to tadashi-aikawa/semantic-release-sandbox development by creating an account on GitHub.</p>
</div>
<img src="https://opengraph.githubassets.com/8a5fec7f8290630aadd07acb849dc328be68d8a5e7e0e8fb0d5140ae9c6ddb19/tadashi-aikawa/semantic-release-sandbox" class="link-card-image" />
</div>
<a href="https://github.com/tadashi-aikawa/semantic-release-sandbox"></a>
</div>
## Hello Worldスクリプト作成
適当に[[Bash]]スクリプトをつくる。これはなんでもいい。[[Bash]]でなくてもいい。
`hello.sh`
```bash
#!/bin/bash
echo "Hello"
```
[[コミットグラフ]]。
```
● 67e06e8 (HEAD -> main, origin/main) feat: add hello.sh
```
## sematic-releaseのインストール
ここから[[semantic-release]]が登場。まずはインストール。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<p class="link-card-title">semantic-release/docs/usage/installation.md at master · semantic-release/semantic-release</p>
<p class="link-card-description">:package::rocket: Fully automated version management and package publi ... </p>
</div>
<img src="https://opengraph.githubassets.com/fe5bea03e5284a0a6094bb1cf3aaa72523cd5705cfe75f1f20c7a6a55a28379d/semantic-release/semantic-release" class="link-card-image" />
</div>
<a href="https://github.com/semantic-release/semantic-release/blob/master/docs/usage/installation.md"></a>
</div>
上記ドキュメントには[[Node.js]]プロジェクトかどうかで推奨方法が違うと書かれている。
- [[Node.js]]プロジェクトの場合
- `npm i -D semantic-release`
- それ以外
- `npx semantic-release`
今回は[[Node.js]]プロジェクトではないため後者を利用するのが良さそう。
```console
$ npx semantic-release@24 -h
semantic-release
Run automated package publishing
Run automated package publishing
Usage:
semantic-release [options] [plugins]
Options
-b, --branches Git branches to release from [array]
-r, --repository-url Git repository URL [string]
-t, --tag-format Git tag format [string]
-p, --plugins Plugins [array]
-e, --extends Shareable configurations [array]
--ci Toggle CI verifications [boolean]
--debug Output debugging information [boolean]
-d, --dry-run Skip publishing [boolean]
-h, --help Show help [boolean]
Plugins
--verify-conditions [array]
--analyze-commits [string]
--verify-release [array]
--generate-notes [array]
--prepare [array]
--publish [array]
--success [array]
--fail [array]
Options:
--version Show version number [boolean]
```
> [!info]
> [[semantic-release]]のメジャーバージョンを指定してインストールすることが推奨されている
ローカルでコマンドを実行しても諸々エラーになるだけなので、ローカルはこれ以上関与しない。
## CIの設定
今回は[[GitHub Actions]]を利用する。なお、[[Bitbucket Pipelines]]はない。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<p class="link-card-title">semantic-release/docs/usage/ci-configuration.md at master · semantic-release/semantic-release</p>
<p class="link-card-description">:package::rocket: Fully automated version management and packa ... </p>
</div>
<img src="https://opengraph.githubassets.com/28f54231bb13cc316fc61ef428b55ecfe68d48ea6e58ce3ba9be352493a8241b/semantic-release/semantic-release" class="link-card-image" />
</div>
<a href="https://github.com/semantic-release/semantic-release/blob/master/docs/usage/ci-configuration.md"></a>
</div>
上記ドキュメントでは環境変数の設定に関してのみしか記載されてなさそう。調べてみると[[Semantic Release Action (GitHub Actions)]]というものがあるらしい。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<p class="link-card-title">Action For Semantic Release - GitHub Marketplace</p>
<p class="link-card-description">GitHub Action for Semantic Release</p>
</div>
<img src="https://avatars.githubusercontent.com/u/19383787?s=400&v=4" class="link-card-image" />
</div>
<a href="https://github.com/marketplace/actions/action-for-semantic-release"></a>
</div>
`.github/workflows/release.yaml` を作成する。
```yaml
name: "Release"
# 自動リリースにはしたくないので手動
on: workflow_dispatch
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- uses: cycjimmy/semantic-release-action@v4
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```
何が起こるのかあまり想像つかないのでとりあえずこれくらいにしてコミット/pushする。
## リリースしてみる
[[GitHub Actions]]のページから手動でリリースしてみる。[[コミットグラフ]]の状態は以下。
```
● 7610025 (HEAD -> main, origin/main) ci: add a "Release" workflow
● 67e06e8 feat: add hello.sh
```
### branchesのエラー
以下のエラーが発生。
```error
[8:31:49 AM] [semantic-release] › ✘ ERELEASEBRANCHES The release branches are invalid in the `branches` configuration.
marked(): mangle parameter is enabled by default, but is deprecated since version 5.0.0, and will be removed in the future. To clear this warning, install https://www.npmjs.com/package/marked-mangle, or disable by setting `{mangle: false}`.
marked(): headerIds and headerPrefix parameters enabled by default, but are deprecated since version 5.0.0, and will be removed in the future. To clear this warning, install https://www.npmjs.com/package/marked-gfm-heading-id, or disable by setting `{headerIds: false}`.
A minimum of 1 and a maximum of 3 release branches are required in the branches configuration (https://github.com/semantic-release/semantic-release/blob/master/docs/usage/configuration.md#branches).
This may occur if your repository does not have a release branch, such as master.
Your configuration for the problematic branches is [].
Error: AggregateError:
SemanticReleaseError: The release branches are invalid in the `branches` configuration.
```
どうやら 1 ~ 3 の `branches` を指定しないといけないっぽい。今回は`main`ブランチだけでよくて、[[GitHub Actions]]の設定で完結させたいので。
```diff
steps:
- uses: actions/checkout@v4
- uses: cycjimmy/semantic-release-action@v4
+ with:
+ branches: |
+ [
+ 'main'
+ ]
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```
ただ、[[semantic-release]]自体が[デフォルトでbranchesの値を持っている](https://github.com/semantic-release/semantic-release/blob/master/docs/usage/configuration.md#branches)のに設定が必要なのは腑に落ちない。また、[[Semantic Release Action (GitHub Actions)|Semantic Release Action]]にも以下の記載がある。
> branches will override the branches attribute in your configuration file. If the attribute is not configured on both sides, the default is:
と思ったが.. その続き..
> ```
> [
> '+([0-9])?(.{+([0-9]),x}).x',
> 'master',
> 'next',
> 'next-major',
> {name: 'beta', prerelease: true},
> {name: 'alpha', prerelease: true}
> ]
> ```
とあるので`main`ブランチは含まれてなさそう。最終的に以下のようにした。
```yaml
name: "Release"
on: workflow_dispatch
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- uses: cycjimmy/semantic-release-action@v4
with:
branches: |
[
'master',
'main',
{name: 'beta', prerelease: true},
{name: 'alpha', prerelease: true}
]
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```
コミットグラフ。
```
● f5198c6 (HEAD -> main, origin/main) ci: fix release branches
● 7610025 ci: add a "Release" workflow
● 67e06e8 feat: add hello.sh
```
### git pushが403エラー
権限がなくてエラーになってそう。
```error
[8:47:20 AM] [semantic-release] › ✘ The command "git push --dry-run --no-verify https://x-access-token:[secure]@github.com/tadashi-aikawa/semantic-release-sandbox HEAD:main" failed with the error message remote: Permission to tadashi-aikawa/semantic-release-sandbox.git denied to github-actions[bot].
fatal: unable to access 'https://github.com/tadashi-aikawa/semantic-release-sandbox/': The requested URL returned error: 403.
```
contentsのwrite権限を追加してみる。
```yaml
permissions:
contents: write
```
```diff
name: "Release"
on: workflow_dispatch
+ permissions:
+ contents: write
+
jobs:
```
### package.jsonがないというエラー
rootに`package.json`がないから[[npm]]にリリースできないというエラー。
```error
[8:58:46 AM] [semantic-release] › ✘ ENOPKG Missing `package.json` file.
marked(): mangle parameter is enabled by default, but is deprecated since version 5.0.0, and will be removed in the future. To clear this warning, install https://www.npmjs.com/package/marked-mangle, or disable by setting `{mangle: false}`.
marked(): headerIds and headerPrefix parameters enabled by default, but are deprecated since version 5.0.0, and will be removed in the future. To clear this warning, install https://www.npmjs.com/package/marked-gfm-heading-id, or disable by setting `{headerIds: false}`.
A package.json file (https://docs.npmjs.com/files/package.json) at the root of your project is required to release on npm.
Error: AggregateError:
SemanticReleaseError: Missing `package.json` file.
```
そもそも[[npm]]にリリースすることを想定していない。[[GitHub]]にリリースできればいいんだけど、これは利用用途の想定違い??
どうやらプラグインを指定する必要があるらしい。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<p class="link-card-title">semantic-release/docs/usage/plugins.md at master · semantic-release/semantic-release</p>
<p class="link-card-description">:package::rocket: Fully automated version management and package publishing - se ... </p>
</div>
<img src="https://opengraph.githubassets.com/28f54231bb13cc316fc61ef428b55ecfe68d48ea6e58ce3ba9be352493a8241b/semantic-release/semantic-release" class="link-card-image" />
</div>
<a href="https://github.com/semantic-release/semantic-release/blob/master/docs/usage/plugins.md"></a>
</div>
[デフォルトで有効なプラグイン](https://github.com/semantic-release/semantic-release/blob/master/docs/usage/configuration.md#plugins)は以下。
```json
[
"@semantic-release/commit-analyzer",
"@semantic-release/release-notes-generator",
"@semantic-release/npm",
"@semantic-release/github"
]
```
関係ありそうな[[プラグイン (semantic-release)|プラグイン]]をいくつか抜粋。今回必要かも含め。
| プラグイン | 役割 | 必要か? |
| ----------------------- | --------------------------------------------- | ---- |
| [[commit-analyzer]] | リリースバージョンのtypeをコミットメッセージから決定 | O |
| release-notes-generator | 最終リリースからの変更コミットを元にリリースノートを作成 | O |
| github | [[GitHub Actions]]認証情報検証 + GitHubリリースのpublish | O |
| npm | [[npm]]認証情報検証 + リリースtarball作成 + npmへpublish | X |
| git | [[Git]]認証情報検証 + リリースコミット/タグのpush | O |
| changelog | [[Change log]]の作成および検証 | X |
そのため設定ファイルとして `.releaserc.json` を作成する。せっかくなので、先ほど指定した `branches` も `main`ブランチだけに対象を減らしてこちらに統一する。
```json
{
"branches": ["main"],
"plugins": [
"@semantic-release/commit-analyzer",
"@semantic-release/release-notes-generator",
"@semantic-release/github",
"@semantic-release/git"
]
}
```
`.github/workflows/release.yaml`からは`branches`を削除。
```yaml
name: "Release"
on: workflow_dispatch
permissions:
contents: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- uses: cycjimmy/semantic-release-action@v4
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```
コミットグラフ。
```
● b167f3d (HEAD -> main, origin/main) ci: specify needed plugins
● 93e29b4 ci: add write contents permission
● f5198c6 ci: fix release branches
● 7610025 ci: add a "Release" workflow
● 67e06e8 feat: add hello.sh
```
成功した。
## リリース結果を確認する
### コミットグラフ
`v1.0.0`のタグが作成されている。
```
● b167f3d (HEAD -> main, origin/main) [v1.0.0] ci: specify needed plugins
● 93e29b4 ci: add write contents permission
● f5198c6 ci: fix release branches
● 7610025 ci: add a "Release" workflow
● 67e06e8 feat: add hello.sh
```
`v1`未満の場合どうなるのか気になるが、それは別途検討するので一旦スルー。
### リリースページ
LGTM。
![[Pasted image 20240916183818.png]]
## 機能追加コミットをしてみる
機能追加コミットをしたら、バージョンが `v1.1.0` になることを確かめる。
```
● 0f6535d (HEAD -> main, origin/main) feat: support an argument
● b167f3d [v1.0.0] ci: specify needed plugins
● 93e29b4 ci: add write contents permission
● f5198c6 ci: fix release branches
● 7610025 ci: add a "Release" workflow
● 67e06e8 feat: add hello.sh
```
これでリリース。よさみ。
![[Pasted image 20240916184301.png]]
## バグ修正コミットをしてみる
次はバグ修正コミット。バージョンが `1.1.1` になることを確かめる。
```
● bcff4bf (HEAD -> main, origin/main) bug: the argument is not displayed correctly if it contains whitespace
● 0f6535d [v1.1.0] feat: support an argument
● b167f3d [v1.0.0] ci: specify needed plugins
● 93e29b4 ci: add write contents permission
● f5198c6 ci: fix release branches
● 7610025 ci: add a "Release" workflow
● 67e06e8 feat: add hello.sh
```
[[アクション (GitHub Actions)|アクション]]を実行したら成功はしたがリリースはされなかった。よく見ると `bug` という間違ったtypeを指定してしまっていた。force pushで修正する。
```
● 5ef42e9 (HEAD -> main, origin/main) fix: the argument is not displayed correctly if it contains whitespace
● 0f6535d [v1.1.0] feat: support an argument
● b167f3d [v1.0.0] ci: specify needed plugins
● 93e29b4 ci: add write contents permission
● f5198c6 ci: fix release branches
● 7610025 ci: add a "Release" workflow
● 67e06e8 feat: add hello.sh
```
OK。
![[Pasted image 20240916185014.png]]
## Breaking changesを含むリリースをしてみる
期待するバージョンは `v2.0.0`。
```
● 1856668 (HEAD -> main, origin/main) feat!: change the command name from "hello" to "greet"
● 5ef42e9 [v1.1.1] fix: the argument is not displayed correctly if it contains whitespace
● 0f6535d [v1.1.0] feat: support an argument
● b167f3d [v1.0.0] ci: specify needed plugins
● 93e29b4 ci: add write contents permission
● f5198c6 ci: fix release branches
● 7610025 ci: add a "Release" workflow
● 67e06e8 feat: add hello.sh
```
残念ながらリリースされなかった。おそらく `feat!:` の `!` に対応していなそうに見える。
<div class="link-card">
<div class="link-card-header">
<img src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon-64.png" class="link-card-site-icon"/>
<span class="link-card-site-name">minerva.mamansoft.net</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<p class="link-card-title">📝commit-analyzerがコミットメッセージtype後の!をbreaking changeとして認識してくれない</p>
<p class="link-card-description">commit-analyzerが`feat!: hoge` のようなコミットメッセージをBreaking changeと認識してくれない。</p>
</div>
<img src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/Notes/attachments/troubleshooting.webp" class="link-card-image" />
</div>
<a class="internal-link" data-href="Notes/📝commit-analyzerがコミットメッセージtype後の!をbreaking changeとして認識してくれない.md"></a>
</div>
%%[[📝commit-analyzerがコミットメッセージtype後の!をbreaking changeとして認識してくれない]]%%
依存関係として `conventional-changelog-conventionalcommits` の追加が必要。
```console
npm i -D conventional-changelog-conventionalcommits
```
[[npmパッケージ]]であれば`package.json`に追加するが、今回はそうではないので[[GitHub Actions]]の[[YAML]]に追加。しれっと`semantic_version`も最新化。指定しないとv21を使ってて古かったので。
```yaml
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npm i -D --no-save conventional-changelog-conventionalcommits
- uses: cycjimmy/semantic-release-action@v4
with:
semantic_version: 24.1.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```
> [!hint]
> `--no-save` をつけないと `package.json` や `package-lock.json` が生成されてしまう。また、`-D` を抜くとモジュールは見つからない。
`.releaserc.json`にも`preset`を指定。
```json
{
"branches": ["main"],
"plugins": [
["@semantic-release/commit-analyzer", { "preset": "conventionalcommits" }],
[
"@semantic-release/release-notes-generator",
{
"preset": "conventionalcommits"
}
],
"@semantic-release/github",
"@semantic-release/git"
]
}
```
やっとできた!
![[Pasted image 20240916194038.png]]
## v1以前のバージョン
v1以前のバージョンでの動作確認もする。リポジトリを新しく作成して `v0.1.0` のタグをつけておく。
```console
git tag v0.1.0
git push --tags
```
これで実行したら `v0.2.0` になった。
```
● c0cf9a5 (HEAD -> main, origin/main) [v0.2.0] ci: fix
● 538d2f4 ci: add release workflows
● c78f54f feat: new feature
● 33a55da [v0.1.0] Add empty license
```
続いてBreaking changeを入れてみる。せっかくなのでbugfixもあわせて。
```
● 5aeb16b (HEAD -> main, origin/main) feat!: only print the first argument
● 8207f88 fix: Not print !
● c0cf9a5 [v0.2.0] ci: fix
● 538d2f4 ci: add release workflows
● c78f54f feat: new feature
● 33a55da [v0.1.0] Add empty license
```
これで実行する... なんと `v1.0.0` になってしまった... (期待値は `v0.3.0`)
## ローカルでデバッグする
今更だが、都度[[GitHub Actions]]の実行するのはしんどいのでローカルデバッグできるようにする。今欲しいのはバージョン決定ロジックの検査環境なので、それ以外のプラグインは除外しておく。あとのことを考えて `.releaserc.json` は `.releaserc.mjs` に変更する。
```js
{
"branches": ["main"],
"plugins": [
["@semantic-release/commit-analyzer", { "preset": "conventionalcommits" }],
// [
// "@semantic-release/release-notes-generator",
// {
// "preset": "conventionalcommits"
// }
// ],
// "@semantic-release/github",
// "@semantic-release/git"
]
}
```
必要なプラグインをローカルでインストールしておく。
```console
npm i -D --no-save @semantic-release/git conventional-changelog-conventionalcommits
```
バージョンを取得して設定を分岐... もできなくもないが、v1以上に切り替わるタイミングは一度しかないため、TODOコメントで凌いだ方が楽。よって `.releaserc.mjs` は以下のようになる。
```js
export default {
branches: ["main"],
plugins: [
[
"@semantic-release/commit-analyzer",
{
preset: "conventionalcommits",
releaseRules: [
{ breaking: true, release: "minor" }, // TODO: v1になったら release: "major" にする
{ type: "feat", section: "Features", release: "minor" },
{ type: "fix", section: "Bug Fixes", release: "patch" },
{ revert: true, release: "patch" },
],
},
],
// [
// "@semantic-release/release-notes-generator",
// {
// "preset": "conventionalcommits"
// }
// ],
// "@semantic-release/github",
// "@semantic-release/git"
],
};
```
あとは `--dry-run` つきで実行すればよい。
```console
npx semantic-release@24 --dry-run
```
## CHANGELOG
せっかくなので`CHANGELOG.md`もつくってみる。
```console
npm i -D --no-save @semantic-release/changelog
```
プラグインのページに以下の警告があった。
> Please consider whether committing release notes to a file is worth the added complexity compared to other available options for capturing release notes.
たしかに[[GitHub]]リリースしている場合は不要だと思う。しかし、[[Bitbucket Cloud]]やその他の事情によって良いリリース手段がない場合は、`CHANGELOG.md`は選択肢の1つになりうるので試す。
`.releaserc.mjs`
```js
export default {
branches: ["main"],
plugins: [
[
"@semantic-release/commit-analyzer",
// 中略
],
[
"@semantic-release/release-notes-generator",
// 中略
],
"@semantic-release/changelog",
"@semantic-release/github",
[
"@semantic-release/git",
{
assets: ["CHANGELOG.md"],
},
],
],
};
```
以下のような`CHANGELOG.md`ができた。
```markdown
## [2.0.0](https://github.com/tadashi-aikawa/semantic-release-sandbox/compare/v1.0.0...v2.0.0) (2024-09-16)
### ⚠ BREAKING CHANGES
* Destroy docs
### Bug Fixes
* hoge bug ([3c18e24](https://github.com/tadashi-aikawa/semantic-release-sandbox/commit/3c18e24a8d4de51b4d294faf63e3cba672bfe322))
### Documentation
* Destroy docs ([80c9dfc](https://github.com/tadashi-aikawa/semantic-release-sandbox/commit/80c9dfc00144c56af3da73143b6ec6bee8449e44))
```
## npmモジュールプロジェクトの場合
`.releaserc.mjs`に`semantic-release/npm`を追加する。
```js
export default {
branches: ["master"],
plugins: [
[
"@semantic-release/commit-analyzer",
{
preset: "conventionalcommits",
releaseRules: [
{ breaking: true, release: "minor" }, // TODO: v1になったら release: "major" にする
{ type: "feat", section: "Features", release: "minor" },
{ type: "fix", section: "Bug Fixes", release: "patch" },
{ revert: true, release: "patch" },
],
},
],
[
"@semantic-release/release-notes-generator",
{
preset: "conventionalcommits",
},
],
"@semantic-release/npm",
"@semantic-release/github",
"@semantic-release/git",
],
};
```
`package.json`の`private`が`true`なら、デフォルトで`package.json`のバージョンだけをアップするにとどめてくれる。[[npmレジストリ]]とのやりとりは発生しないので、認証情報なども不要。
## まとめ
最終成果物として必要なモノを提示しておく。`CHANGELOG.md`は作らない方向で。
`.releaserc.mjs`
```js
export default {
branches: ["main"],
plugins: [
[
"@semantic-release/commit-analyzer",
{
preset: "conventionalcommits",
releaseRules: [
{ breaking: true, release: "minor" }, // TODO: v1になったら release: "major" にする
{ type: "feat", section: "Features", release: "minor" },
{ type: "fix", section: "Bug Fixes", release: "patch" },
{ revert: true, release: "patch" },
],
},
],
[
"@semantic-release/release-notes-generator",
{
"preset": "conventionalcommits"
}
],
// npmモジュールプロジェクトの場合はコメントアウト解除
// "@semantic-release/npm",
"@semantic-release/github",
"@semantic-release/git"
],
};
```
`.github/workflows/release.yaml`
```yaml
name: "Release"
on: workflow_dispatch
permissions:
contents: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npm i -D --no-save conventional-changelog-conventionalcommits
- uses: cycjimmy/semantic-release-action@v4
with:
semantic_version: 24.1.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```
### 2024/09/23 追記
このノートを書いた後、そこそこ変更があったので最新版も掲載しておく。
> [!info]
> 最新情報は [[📕よく使う.releaserc.mjs]] を参照
```js
export default {
branches: ["main"],
plugins: [
[
"@semantic-release/commit-analyzer",
{
preset: "conventionalcommits",
releaseRules: [
{ breaking: true, release: "minor" }, // TODO: v1になったら release: "major" にする
{ type: "feat", release: "minor" },
{ type: "style", release: "minor" },
{ type: "fix", release: "patch" },
{ type: "refactor", release: "patch" },
{ revert: true, release: "patch" },
],
},
],
[
"@semantic-release/release-notes-generator",
{
preset: "conventionalcommits",
presetConfig: {
types: [
{ type: "feat", section: "✨ Features" },
{ type: "style", section: "🎨 Styles" },
{ type: "fix", section: "🛡️ Bug Fixes" },
{ type: "docs", hidden: true },
{ type: "refactor", hidden: true },
{ type: "test", hidden: true },
{ type: "ci", hidden: true },
{ type: "build", hidden: true },
{ type: "dev", hidden: true },
{ type: "chore", hidden: true },
],
},
},
],
// npmモジュールプロジェクトの場合はコメントアウト解除
// "@semantic-release/npm",
"@semantic-release/github",
"@semantic-release/git",
],
};
```