この記事では、GitHub Actions を使って monorepo 内の npm パッケージを手動で公開する仕組みを構築する手順を解説します。
Note
この記事はアルファ版(プレリリース版)のパッケージを公開するための簡易的なフローを紹介しています。正式版のリリースには、CHANGELOG の更新や依存関係の確認など、追加の考慮事項があります。
npm は 2025年12月9日に大きなセキュリティ変更を行いました。
2025年12月9日をもって Classic Token は完全に廃止されました:
代わりに推奨されているのが Trusted Publishing です。OpenID Connect(OIDC)を使用して、GitHub Actions から直接 npm に認証できます。
メリット:
Warning
pnpm は現時点で Trusted Publishing (OIDC) をサポートしていません。
そのため、ビルドや依存関係のインストールには pnpm を使用し、公開ステップのみ npm publish を使用します。
各パッケージに対して、Trusted Publisher を設定します。
@example/core)your-org(GitHub のオーナー名)your-repo(リポジトリ名)npm-publish.ymlenvironment を使用していない場合)Important
この設定を公開するパッケージすべてに対して行ってください。
Trusted Publishing では package.json の repository.url が GitHub URL と一致している必要があります。
{
"repository": {
"type": "git",
"url": "https://github.com/your-org/your-repo.git",
"directory": "packages/core"
}
}.github/workflows/npm-publish.yml を作成します。
name: Publish npm package
on:
workflow_dispatch:
inputs:
package:
description: '公開するパッケージを選択'
required: true
type: choice
options:
- '@example/core'
- '@example/utils'
- '@example/cli'
version_type:
description: 'バージョンの上げ方'
required: true
type: choice
default: 'prerelease'
options:
- prerelease # 0.1.0-alpha.1 → 0.1.0-alpha.2
- prepatch # 0.1.0-alpha.1 → 0.1.1-alpha.0
- preminor # 0.1.0-alpha.1 → 0.2.0-alpha.0
- premajor # 0.1.0-alpha.1 → 1.0.0-alpha.0
jobs:
publish:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main' # main ブランチからのみ実行可能
permissions:
contents: write
id-token: write # OIDC Trusted Publishing に必要
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup pnpm
uses: pnpm/action-setup@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '24'
cache: 'pnpm'
registry-url: 'https://registry.npmjs.org'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Configure git
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- name: Get package directory
id: package-dir
run: |
# パッケージ名からディレクトリを取得
# 実際のプロジェクト構成に合わせて変更してください
case "${{ inputs.package }}" in
"@example/core")
echo "dir=packages/core" >> $GITHUB_OUTPUT
;;
"@example/utils")
echo "dir=packages/utils" >> $GITHUB_OUTPUT
;;
"@example/cli")
echo "dir=packages/cli" >> $GITHUB_OUTPUT
;;
esac
- name: Build package
run: pnpm turbo build --filter="${{ inputs.package }}"
- name: Bump version
id: version
working-directory: ${{ steps.package-dir.outputs.dir }}
run: |
npm version ${{ inputs.version_type }} --preid=alpha --no-git-tag-version
NEW_VERSION=$(node -p "require('./package.json').version")
echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT
- name: Commit version bump
run: |
git add .
git commit -m "release(${{ inputs.package }}): ${{ steps.version.outputs.new_version }}"
git push
- name: Create git tag
id: tag
run: |
TAG_NAME="${{ inputs.package }}@${{ steps.version.outputs.new_version }}"
git tag "$TAG_NAME"
git push origin "$TAG_NAME"
echo "tag_name=$TAG_NAME" >> $GITHUB_OUTPUT
- name: Create GitHub Release
run: gh release create "${{ steps.tag.outputs.tag_name }}" --title "${{ steps.tag.outputs.tag_name }}" --generate-notes --prerelease
env:
GH_TOKEN: ${{ github.token }}
# Trusted Publishing: pnpm pack + npm publish
# pnpm pack で workspace:* を実際のバージョンに解決した tarball を作成
- name: Publish to npm (Trusted Publishing)
working-directory: ${{ steps.package-dir.outputs.dir }}
run: |
pnpm pack
npm publish *.tgz --access=public --tag alpha --provenance
- name: Summary
run: |
echo "## Published successfully! :rocket:" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "- **Package:** ${{ inputs.package }}" >> $GITHUB_STEP_SUMMARY
echo "- **Version:** ${{ steps.version.outputs.new_version }}" >> $GITHUB_STEP_SUMMARY
echo "- **Tag:** alpha" >> $GITHUB_STEP_SUMMARY
echo "- **Auth:** Trusted Publishing (OIDC)" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "[View on npm](https://www.npmjs.com/package/${{ inputs.package }})" >> $GITHUB_STEP_SUMMARYポイント:
id-token: write パーミッションが必須npm publish --provenance で provenance 証明書も自動生成GitHub リポジトリの Actions タブを開きます。
左側のサイドバーから Publish npm package を選択します。
prerelease: アルファ版の番号のみ上げる(例: 0.1.0-alpha.1 → 0.1.0-alpha.2)prepatch: パッチバージョンを上げる(例: 0.1.0-alpha.1 → 0.1.1-alpha.0)preminor: マイナーバージョンを上げる(例: 0.1.0-alpha.1 → 0.2.0-alpha.0)premajor: メジャーバージョンを上げる(例: 0.1.0-alpha.1 → 1.0.0-alpha.0)ワークフローが正常に完了すると:
package.json のバージョンが更新される@example/core@0.1.0-alpha.12)が作成されるTrusted Publisher の設定が正しくない可能性があります:
package.json の repository.url が正しいか確認id-token: write パーミッションがあるか確認Trusted Publishing を使用する場合、npm >= 11.5.1 が必要です。Node.js 22 以前には npm 10.x しか同梱されていないため、Node.js 24 以上を使用してください。
package.json と npm のバージョンを確認してくださいpnpm install が正常に完了しているか確認アルファ版から正式版に移行する場合は、ワークフローを修正するか、別のワークフローを作成してください:
version_type の選択肢に patch, minor, major を追加--preid=alpha オプションを条件付きで適用alpha から latest に変更2025年12月の npm セキュリティ変更により、Classic Token は使用できなくなりました。Trusted Publishing (OIDC) を使用することで、トークン管理から解放され、より安全にパッケージを公開できます。
pnpm は現時点で OIDC をサポートしていないため、公開ステップのみ npm publish を使用しますが、ビルドや依存関係のインストールには引き続き pnpm を使用できます。