Changesetsでnpmへのリリースを自動化する

最近、筆者が管理するいくつかのGitHubリポジトリーにChangesetsを導入しました。これによってnpmへのリリース作業を自動化でき、負担が減りました。この記事では、Changesetsを導入する手順を詳しく解説します。
目次
Changesetsとは
Changesetsは、パッケージのバージョニングやリリースノートの作成、さらにはnpmへの公開までを自動化できるシステムです。Astroやpnpmの開発でも利用されています。
モノリポジトリーにも通常のシングルリポジトリーにも対応しています。また、コミットメッセージの形式についての制約がなく、生成されたリリースノートを編集することもできます。
Changesetsを使った開発は、次のような流れになります。
- コードに変更を加える
npx changesetを実行して変更の規模(major/minor/patch)とその内容を入力する- 変更をコミットし、プルリクエストを作成する
- プルリクエストをマージする
- Changesetsがバージョン番号の変更やリリースノートが含まれるプルリクエストを自動で作成する
- 複数の変更をまとめてリリースしたい場合は、1〜4を繰り返す(その間、Changesetsのプルリクエストは自動で更新される)
- 任意のタイミングでChangesetsのプルリクエストをマージすると、GitHubのリリースページが自動で作成され、パッケージがnpmへ公開される
この記事では、Changesetsを使って次のことを自動化するための設定方法を詳しく説明します。
- パッケージのバージョニング
- リリースノートの作成
- 自動で生成されたリリースノートは必要に応じて手動で編集できます
- GitHubのリリースページの作成
- npmへの公開
- 任意でnpmのprovenance statementsへの対応可
設定方法
ここからは、ChangesetsをGitHubリポジトリーで使うための手順を説明します。
CLIのインストール
まずは、ChangesetsのCLIをインストールします。
npm install -D @changesets/cli次に、設定ファイルを作成します。changesets initコマンドを実行すると、.changesetディレクトリーと設定ファイルが作成されます。
$ npx changeset init
🦋 Thanks for choosing changesets to help manage your versioning and publishing🦋🦋 You should be set up to start using changesets now!🦋🦋 info We have added a `.changeset` folder, and a couple of files to help you out:🦋 info - .changeset/README.md contains information about using changesets🦋 info - .changeset/config.json is our default config設定ファイルの編集
デフォルトでは、パッケージの公開設定がrestrictedになっています。一般向けにnpmで公開する場合は、.changeset/config.jsonのaccessをpublicに変更します。
{ "changelog": "@changesets/cli/changelog", "commit": false, "fixed": [], "linked": [], "access": "restricted", "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", "ignore": []}また、デフォルトではリリースノートが./CHANGELOG.mdとして生成されます。これが不要な場合は、changelogにfalseを設定します。
{ "changelog": "@changesets/cli/changelog", "changelog": false, "commit": false, "fixed": [], "linked": [], "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", "ignore": []}リリースノートの形式をカスタマイズすることも可能です。コミットやプルリクエストのリンク、コントリビューターの情報を含めたい場合は、@changesets/changelog-githubを利用します。<org>にはGitHubのユーザー名、<repo>にはリポジトリー名を指定します。
npm install -D @changesets/changelog-github{ "changelog": "@changesets/cli/changelog", // ``<org>/<repo>``にはGitHubのユーザー名とリポジトリー名を指定 "changelog": ["@changesets/changelog-github", { "repo": "<org>/<repo>" }], "commit": false, "fixed": [], "linked": [], "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", "ignore": []}リリース用のスクリプトの設定
package.jsonに、バージョン番号の変更時やnpmへの公開時に利用するスクリプトを設定します。ci:versionとci:publishは他の名前でも大丈夫ですが、その場合は後述のGitHub Actionsのコードを変更する必要があります。
{ // ...色々な設定 "scripts": { "ci:version": "changeset version", "ci:publish": "changeset publish" }}ビルド処理などが必要な場合は、ci:versionやci:publishに追加します。たとえば、私のリポジトリーでは次のように設定しています。
{ // ...色々な設定 "scripts": { "build": "tsc", "version": "npm run build && git add .", "ci:version": "changeset version && npm run version", "ci:publish": "npm run build && changeset publish" }}GitHub Actionsの設定
Changesetsを使ってリリースを自動化するために、GitHub Actionsを利用します。.github/workflows/release.ymlを作成し、次の内容を入力します。このコードは、公式のサンプルからSlack通知を削除したり、依存関係をアップデートしたりしています。
name: Release
on: push: branches: [main]
concurrency: ${{ github.workflow }}-${{ github.ref }}
jobs: release: runs-on: ubuntu-latest
strategy: matrix: node-version: [24.x]
steps: - uses: actions/checkout@v5
- name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }}
- run: npm ci
- name: Create Release Pull Request or Publish to npm id: changesets uses: changesets/action@v1 with: version: npm run ci:version publish: npm run ci:publish env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }}GitHubとnpmの設定
GitHub Actionsによるファイルの更新やプルリクエストの作成を許可するために、権限を変更します。
GitHubのリポジトリーの[Settings]>[Actions]>[General]を開きます。下にスクロールし、[Workflow permissions]を[Read and write permissions]に変更します。また、[Allow GitHub Actions to create and approve pull requests]をオンにします。
設定の変更後は[Save]ボタンをクリックしてください。

次に、リリースを自動化するために、npmのアクセストークンを作成します。npmに移動してプロフィールアイコンをクリックし、メニューから[Access Tokens]を選択します。

[Generate New Token]から[Classic Token]をクリックし、アクセストークンを発行します。

トークン名には分かりやすいものを設定し、種類では[Automation]を選択してください。

トークンが生成されたら、トークンをコピーします。トークンは一度しか表示されないので注意してください。
トークンをコピーしたらGitHubの設定画面に戻り、[Secrets and variables]>[Actions]から[Repository secrets]を作成します。シークレットの名前はNPM_TOKEN、値は先ほどコピーしたトークンを入力してください。
provenance statementsの設定(任意)
必須ではありませんが、npmのprovenance statementsを利用できます。provenance statementsは、npmパッケージの透明性を向上させられる機能です。日本語では「来歴証明」や「来歴情報」といったところでしょうか。
この機能を使うと、パッケージのnpmページにチェックマークのバッジが表示されるようになります。このバッジをクリックすると、パッケージがどのリポジトリーのどのコミットからどのようなシステムでビルドされたかを確認できます。

従来のnpmでは、GitHubで公開されているコードとnpmで公開されているコードが同一であるという保証がありませんでした。もちろん、自分でビルドして、npmで公開されているコードと差分を取れば確認できますが、逆にいえばそうしない限りは確認する手段がありませんでした。provenance statementsを使えば、GitHubのコードとnpmで公開されているコードが同一であることを簡単に証明できます。
この機能を利用するには、package.jsonのpublishConfig.provenanceをtrueを設定します。
{ // ...色々な設定 "publishConfig": { "provenance": true }}次に、.github/workflows/release.ymlに、必要なpermissionsを追加します。
name: Release
on: push: branches: [main]
concurrency: ${{ github.workflow }}-${{ github.ref }}
jobs: release: runs-on: ubuntu-latest
permissions: contents: write id-token: write pull-requests: write
strategy: matrix: node-version: [24.x]
steps: - uses: actions/checkout@v5
- name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }}
- run: npm ci
- name: Create Release Pull Request or Publish to npm id: changesets uses: changesets/action@v1 with: version: npm run ci:version publish: npm run ci:publish env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }}これで、npmのprovenance statementsを利用できるようになりました。
Botの導入(任意)
Changesetsには公式のBotがあります。このBotはChangesetsの動作に必須ではありませんが、導入するとプルリクエストにChangesetsのデータが含まれているかを確認してくれます。また、Changesetsのデータが含まれていない場合は、リンクから簡単に作成できるようになっています。


このBotはすべてのプルリクエストにメッセージを送信するので、必要なリポジトリーにだけ導入することをオススメします。
プルリクエストを作成する
これで、必要な設定がすべて完了しました。次に、練習を兼ねて、ここまでの変更を含むプルリクエストを作成しましょう。新しいブランチに切り替えます。
git checkout -b add-changesetsブランチを切り替えたら、changesetコマンドを実行します。まずは、変更の規模をpatch/minor/majorから選択します。ここでの選択は、バージョン番号の変更時に利用されます。たとえば、前回のバージョンからの変更の中で、もっとも大きな変更がminorだった場合、次のバージョンはマイナーバージョンが上がります。
$ npx changeset
🦋 What kind of change is this for async-query? (current version is 2.0.0) ...> patch minor major次に、変更の内容を入力します。変更の内容は、リリースノートに含まれるため、他の開発者が理解できるように簡潔に記述してください。
$ npx changeset🦋 What kind of change is this for async-query? (current version is 2.0.0) · patch🦋 Please enter a summary for this change (this will be in the changelogs).🦋 (submit empty line to open external editor)🦋 Summary » ci: add Changesets settings変更の内容を入力してエンターを押すと、入力内容を確認されます。内容に問題がなければ、yかエンターを押します。
$ npx changeset🦋 What kind of change is this for async-query? (current version is 2.0.0) · patch🦋 Please enter a summary for this change (this will be in the changelogs).🦋 (submit empty line to open external editor)🦋 Summary · ci: add Changesets settings🦋🦋 === Summary of changesets ===🦋 patch: async-query🦋🦋 Is this your desired changeset? (Y/n) » trueこれで、変更内容が記録されました。あとは、変更をコミットしてプルリクエストを作成します。
git add .git commit -m "ci: add Changesets settings"git push add-changesetsGitHubのリポジトリーにアクセスし、プルリクエストを作成します。先ほどChangesetsのBotを導入していた場合は、Botからのコメントが付いているはずです。
問題がなければプルリクエストをマージします。少し待つと、チェンジログの更新やバージョン番号の変更が含まれるプルリクエストが作成されます。チェンジログを修正したい場合は、このプルリクエストに対して変更を加えてください。

このプルリクエストを任意のタイミングでマージすると、GitHubのリリースページが自動で作成され、npmへの公開が行われます。お疲れさまでした!
まとめ
この記事では、Changesetsを使ってnpmへのリリースを自動化する手順を解説しました。Changesetsを導入することで、バージョニングやリリースノートの作成、GitHubのリリースページの作成、npmへの公開を自動化できます。
GitHubリポジトリーでの権限の設定やprovenance statementsの設定などまで書かれた記事が見つからなかったので、この記事を書きました。参考になれば幸いです。
参考
- changesets/changesets: 🦋 A way to manage your versioning and changelogs with a focus on monorepos
- changesets/action
- 参考にさせていただいた記事
- つまづいたときに参考にさせていただいたIssue
- 設定などを参考にさせていただいたリポジトリー
- mscharley/dot: A lightweight inversion of control framework for JavaScript and TypeScript
- cultureamp/kaizen-design-system: Culture Amp's Kaizen Design System :seedling:
- alvesvaren/zod-to-openai-tool: Easily create tools from zod schemas to use with OpenAI Assistants and Chat Completions, inspired by tRPC
- expressive-code/expressive-code: A text marking & annotation engine for presenting source code on the web.
- withastro/astro: The web framework for content-driven websites. ⭐️ Star to support our work!
記事をシェア
フォローして最新情報を入手
Googleの優先ソースに追加すると、このサイトの記事をGoogleで見つけやすくなります。また、ぜひXやRSSフィードもフォローしてください。
おすすめ記事
-1.png&w=1080&q=75)
生まれた時から、母国語よりも先にJavaScriptを使っていました。ネットの海のどこにもいなくてどこにでもいます。
Webフロントエンドプログラマーとして、TypeScriptを用いたWebアプリやブラウザー拡張機能を制作。Xのシャドウバン検知ツール「Shadowban Scanner」やリンクカード復活ツール「Restore Link Card」を公開し、国内外のメディアで紹介されました。iGEM 2023ではJapan-UnitedチームのWikiを制作してGrand Prizeの獲得に貢献。ブログではXやSNSの最新ニュース、不具合の検証と対処法、フロントエンド開発の知見を発信しています。



![npmのパッケージの設定画面のスクリーンショット。[Trusted Publisher]セクションの[Select your publisher]に[GitHub Actions]と[GitLab CI/CD]の2つのボタンが表示されている](/_next/image/?url=%2Fapi%2Fmedia%2Ffile%2Fnpm-trusted-publishing-settings.png&w=3840&q=75)




![Xのブックマーク画面に複数のフォルダーが表示されている画像。フォルダーの名前はそれぞれ[すべてのブックマーク][イラスト][面白い投稿]となっている](/_next/image/?url=%2Fapi%2Fmedia%2Ffile%2Fimage-1378.png&w=1920&q=75)
![[何を報告していますか?]というタイトルのダイアログで[スパム]にチェックが入っているスクリーンショット](/_next/image/?url=%2Fapi%2Fmedia%2Ffile%2Fx-report-post-spam-selected.png&w=1920&q=75)

![Xの設定の[アクセシビリティ、表示、言語]>[表示]>[フォントサイズ]のスクリーンショット](/_next/image/?url=%2Fapi%2Fmedia%2Ffile%2Fx-android-font-size-settings.png&w=3840&q=75)
![Xの設定画面のスクリーンショット。[アクセシビリティ、表示、言語]>[データ利用の設定]の中のようすが示されている](/_next/image/?url=%2Fapi%2Fmedia%2Ffile%2Fx-data-saver-high-resolusion-image-settings.png&w=3840&q=75)