[[📜2024-09-16 semantic-releaseでGitHub管理のパッケージリリースを自動化してみる]] の知見を活かしたうえで、[[Obsidianプラグイン]]のリリースにも適応してみる。
## 前提
[[Obsidianプラグイン]]のリリース方法や[[Bun]]プロジェクトの適応方法を知っていること。
- [[📕Obsidianプラグイン開発チュートリアル]]
- [[📕ObsidianのNode.jsプロジェクトをBunに移行する方法]]
2つ目の[[Bun]]については[[Node.js]]でも構わない。ただし、以下はすべて[[Bun]]を前提にしているため、[[Node.js]]用のコマンドに適宜置き換えて読み進めること。
## 適当対象
[[🦉Another Quick Switcher]]に適応してみる。
## `.releaserc.mjs`の追加
[[プラグイン (semantic-release)|プラグイン]]としては、[[exec (semantic-release)|exec]]を使って`prepare`のタイミングにリリースコマンドを差し込むところが特徴的。重要な部分はコメントで記載してあるのでそちらを参照。
```js
export default {
branches: ["master"],
// Obsidianプラグインはgit tagにvをつけてはいけないのでtagFormatを変更
tagFormat: "${version}",
plugins: [
[
"@semantic-release/commit-analyzer",
{
preset: "conventionalcommits",
releaseRules: [
{ breaking: true, release: "major" },
{ type: "feat", release: "minor" },
{ type: "build", 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: "build", section: "🤖 Build" },
{ type: "docs", hidden: true },
{ type: "refactor", hidden: true },
{ type: "test", hidden: true },
{ type: "ci", hidden: true },
{ type: "dev", hidden: true },
{ type: "chore", hidden: true },
],
},
},
],
[
"@semantic-release/exec",
{
// リリース作業直前にCIでビルド・テストを行い、version-bump.mtsでバージョン更新処理を行う. ${nextRelease.version}はsemantic-releaseが決めたバージョン
prepareCmd: "bun run ci && bun version-bump.mts ${nextRelease.version}",
},
],
[
"@semantic-release/github",
{
// Obsidianプラグインとして配布する必要のあるファイルを記載
assets: [
"main.js",
"styles.css",
"manifest.json",
"manifest-beta.json",
],
},
],
[
"@semantic-release/git",
{
// bun version-bump.mts で変更されたファイルすべてをコミット対象とする
assets: [
"package.json",
"manifest-beta.json",
"manifest.json",
"versions.json",
"bun.lockb",
],
message:
"chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}",
},
],
],
};
```
> [!info] 参考
> - [[タグのprefixであるvを除去 (semantic-release)|タグのprefixであるvを除去]]
以下は`package.json`の`scripts`。これはあくまで[[🦉Another Quick Switcher]]の例であり、各開発環境によってコマンドは異なるはず。
```json
"scripts": {
"dev": "bun esbuild.config.mts",
"build": "tsc -noEmit -skipLibCheck && bun esbuild.config.mts production",
"test": "jest",
"ci": "bun install && biome check src *.mts && bun run build && bun run test",
"prepare": "husky",
"pre:push": "tsc -noEmit -skipLibCheck && biome check src *.mts && bun run test"
},
```
## GitHub ActionsのYAML変更
こちらも[[🦉Another Quick Switcher]]の場合の一例。[[Discord]]通知など関係ない部分はカットしている。重要な部分はコメントで補足。
```yaml
name: "Release"
on: workflow_dispatch
permissions:
contents: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# Bunの利用に必要. Bunを使っていなければ不要
- uses: oven-sh/setup-bun@v2
# semantic-releaseでプリインされていないプラグイン・モジュールをインストール
- run: npm i -D --no-save conventional-changelog-conventionalcommits @semantic-release/git @semantic-release/exec
# semantic-releaseのアクション
- uses: cycjimmy/semantic-release-action@v4
with:
# バージョンは固定にしておいたほうがいい
semantic_version: 24.1.2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```
必要な設定はほとんど`.releaserc.mjs`に書かれているので比較的シンプル。[[プラグイン (semantic-release)|プラグイン]]インストールを忘れないよう気を付けるくらい。
## 参考コミット
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" />
<span class="link-card-v2-site-name">GitHub</span>
</div>
<div class="link-card-v2-title">
dev: Support semantic-release · tadashi-aikawa/obsidian-another-quick-switcher@171c71d
</div>
<div class="link-card-v2-content">
This is an Obsidian plugin which is another choice of Quick switcher. - dev: Support semantic-release · tadashi- ...
</div>
<img class="link-card-v2-image" src="https://opengraph.githubassets.com/5f6cd80817bbd860741724879705835a3c74cb312786029326f080439cf4086e/tadashi-aikawa/obsidian-another-quick-switcher/commit/171c71d6273cde73b1b4303376864aa8f23544c8" />
<a href="https://github.com/tadashi-aikawa/obsidian-another-quick-switcher/commit/171c71d6273cde73b1b4303376864aa8f23544c8"></a>
</div>