# Node.jsパッケージの公開

このチュートリアルでは、継続的インテグレーション (CI) ワークフローの一部として、Node.js パッケージをレジストリに公開する方法について学びます。

## 概要

このガイドでは、継続的インテグレーション (CI) テストが成功した後、Node.js パッケージを GitHub Packages および npm レジストリに発行するワークフローを作成する方法について説明します。

## 前提条件

ワークフローの設定オプションと、ワークフローファイルの作成方法についての基本的な知識を持っておくことをおすすめします。 詳しくは、「[ワークフローの書き込み](/ja/enterprise-server@3.22/actions/how-tos/write-workflows)」をご覧ください。

Node.js プロジェクト用に CI ワークフローを作る方法については、「[Node.js のビルドとテスト](/ja/enterprise-server@3.22/actions/tutorials/build-and-test-code/nodejs)」をご覧ください。

また、以下の基本的な理解があれば役立ちます。

* [npmレジストリの利用](/ja/enterprise-server@3.22/packages/working-with-a-github-packages-registry/working-with-the-npm-registry)
* [変数に情報を格納する](/ja/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-variables)
* [GitHub Actions でのシークレットの使用](/ja/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)
* [ワークフローでの認証に GITHUB\_TOKEN を使用する](/ja/enterprise-server@3.22/actions/tutorials/authenticate-with-github_token)

## パッケージの設定について

`name` ファイル内の `version` および `package.json` フィールドでは、パッケージをレジストリにリンクするためにレジストリで使用される一意識別子を作成します。
`description` ファイルに `package.json` フィールドを含めることによって、パッケージのリスト ページの概要を追加できます。 詳細については、npm ドキュメントの「[package.json ファイルの作成](https://docs.npmjs.com/creating-a-package-json-file)」と「[Node.js モジュールの作成](https://docs.npmjs.com/creating-node-js-modules)」を参照してください。

ローカルの `.npmrc` ファイルが存在し、`registry` 値が指定されている場合、`npm publish` コマンドでは `.npmrc` ファイルに構成されたレジストリが使用されます。 `setup-node` アクションを使用して、既定のレジストリとスコープを構成するローカルの `.npmrc` ファイルをランナーに作成できます。 `setup-node` アクションは、プライベート リポジトリへのアクセスや node パッケージの公開に使われる認証トークンも入力として受け付けます。 詳細については、[`setup-node`](https://github.com/actions/setup-node/) をご覧ください。

`setup-node` アクションを使用して、ランナーにインストールされている Node.js バージョンを指定できます。

`publishConfig` ファイルに `package.json` フィールドを構成するステップをワークフローに追加する場合は、`setup-node` アクションを使用して registry-url を指定する必要はありませんが、パッケージを公開するレジストリは 1 つに限られます。 詳細については、npm ドキュメントの「[publishConfig](https://docs.npmjs.com/cli/v9/configuring-npm/package-json#publishconfig)」を参照してください。

## npmレジストリへのパッケージの公開

新しいリリースを公開するたびに、パッケージを公開するワークフローをトリガーできます。 次の例のプロセスは、type が `published` のリリース イベントがトリガーされたときに実行されます。 CI テストに合格すると、プロセスによってパッケージが npm レジストリにアップロードされます。 詳しくは、「[リポジトリのリリースを管理する](/ja/enterprise-server@3.22/repositories/releasing-projects-on-github/managing-releases-in-a-repository#creating-a-release)」をご覧ください。

ワークフロー中で npm レジストリに対して認証を受けた操作を行うためには、npm の認証トークンをシークレットとして保存しなければなりません。 たとえば、`NPM_TOKEN` というリポジトリ シークレットを作成します。 詳しくは、「[GitHub Actions でのシークレットの使用](/ja/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)」をご覧ください。

既定では、npm で `name` ファイルの `package.json` フィールドを使用して、公開されたパッケージの名前を判断します。 グローバルな名前空間に公開する場合は、パッケージ名だけを含める必要があります。 たとえば、`my-package` という名前のパッケージを `https://www.npmjs.com/package/my-package` に公開します。

スコープのプレフィックスを含むパッケージを公開している場合は、そのスコープを `package.json` ファイルの名前に含めます。 たとえば、npm スコープのプレフィックスが "octocat" で、パッケージ名が "hello-world"、`name` ファイル内の `package.json` は `@octocat/hello-world` である必要があります。 npm パッケージでスコープ プレフィックスが使用され、そのパッケージがパブリックである場合は、オプション `npm publish --access public` を使用する必要があります。 これは、意図せずプライベートパッケージを公開してしまうことを防ぐためにnpmが必要とするオプションです。

この例では、`NPM_TOKEN` 環境変数に `NODE_AUTH_TOKEN` シークレットを格納します。
`setup-node` アクションによって `.npmrc` ファイルが作成されると、`NODE_AUTH_TOKEN` 環境変数からトークンが参照されます。

```yaml copy
name: Publish Package to npmjs
on:
  release:
    types: [published]
jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
      - uses: actions/checkout@v6
      # Setup .npmrc file to publish to npm
      - uses: actions/setup-node@v7
        with:
          node-version: '20.x'
          registry-url: 'https://registry.npmjs.org'
      - run: npm ci
      - run: npm publish 
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
```

上の例では、`setup-node` アクションによって、ランナーに次の内容の `.npmrc` ファイルが作成されます。

```shell
//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}
registry=https://registry.npmjs.org/
always-auth=true
```

資格情報を適切に構成するには、`registry-url` で `https://registry.npmjs.org/` を `setup-node` に設定する必要があることに注意してください。

## GitHub Packages へのパッケージの発行

新しいリリースを公開するたびに、パッケージを公開するワークフローをトリガーできます。 次の例のプロセスは、type が `published` のリリース イベントがトリガーされたときに実行されます。 CI テストに合格すると、プロセスによってパッケージが GitHub Packagesにアップロードされます。 詳しくは、「[リポジトリのリリースを管理する](/ja/enterprise-server@3.22/repositories/releasing-projects-on-github/managing-releases-in-a-repository#creating-a-release)」をご覧ください。

### 宛先リポジトリの設定

GitHub Packages キーを使用してパッケージを`repository`にリンクすることは省略可能です。
`repository` ファイルに `package.json` キーを指定しない場合、GitHub Packages は、GitHub ファイルの `name` フィールドで指定した`package.json` リポジトリにパッケージを発行します。 たとえば、 `@my-org/test` という名前のパッケージは、 `my-org/test`GitHub リポジトリに発行されます。
`url` キーで指定された`repository`が無効な場合でも、パッケージは発行される可能性があります。ただし、意図したとおりにリポジトリ ソースにリンクされません。

`repository` ファイルに`package.json` キーを指定した場合、そのキー内のリポジトリがGitHub Packagesの宛先 npm レジストリとして使用されます。 たとえば、次の`package.json`を発行すると、`my-package``octocat/my-other-repo` リポジトリに発行GitHubという名前のパッケージが作成されます。 発行されると、リポジトリ ソースのみが更新され、パッケージは移行先リポジトリからアクセス許可を継承しません。

```json
{
  "name": "@octocat/my-package",
  "repository": {
    "type": "git",
    "url": "https://github.com/octocat/my-other-repo.git"
  },
}
```

### 宛先リポジトリへの認証

ワークフロー内の GitHub Packages レジストリに対して認証された操作を実行するには、 `GITHUB_TOKEN`を使用できます。 ワークフロー内のジョブが開始されるたびに、`GITHUB_TOKEN` シークレットはそのリポジトリのアクセス トークンに設定されます。 ワークフロー ファイルでこのアクセス トークンにアクセス許可を設定して、`contents` アクセス許可に対する読み取りアクセスと、`packages` アクセス許可に対する書き込みアクセスを付与する必要があります。 詳しくは、「[ワークフローでの認証に GITHUB\_TOKEN を使用する](/ja/enterprise-server@3.22/actions/tutorials/authenticate-with-github_token)」をご覧ください。

パッケージを別のリポジトリに発行する場合は、コピー先リポジトリ内のパッケージに書き込むアクセス許可を持つ personal access token (classic) を使用する必要があります。 詳細については、「[個人用アクセス トークンを管理する](/ja/enterprise-server@3.22/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens)」および「[GitHub Actions でのシークレットの使用](/ja/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)」を参照してください。

### ワークフローの例

この例では、`GITHUB_TOKEN` 環境変数に `NODE_AUTH_TOKEN` シークレットを格納します。
`setup-node` アクションによって `.npmrc` ファイルが作成されると、`NODE_AUTH_TOKEN` 環境変数からトークンが参照されます。

```yaml copy
name: Publish package to GitHub Packages
on:
  release:
    types: [published]
jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v6
      # Setup .npmrc file to publish to GitHub Packages
      - uses: actions/setup-node@v7
        with:
          node-version: '20.x'
          registry-url: 'https://npm.pkg.github.com'
          # Defaults to the user or organization that owns the workflow file
          scope: '@octocat'
      - run: npm ci
      - run: npm publish
        env:
          NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

`setup-node` アクションにより、ランナーに `.npmrc` ファイルが作成されます。
`scope` アクションに対して `setup-node` 入力を使用すると、`.npmrc` ファイルにスコープ プレフィックスが含まれます。 既定では、`setup-node` アクションにより、`.npmrc` ファイルのスコープが、そのワークフロー ファイルを含むアカウントに設定されます。

```shell
//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}
@octocat:registry=https://npm.pkg.github.com
always-auth=true
```

## Yarn を利用したパッケージの公開

パッケージマネージャーのYarnを使う場合、Yarnを使ってパッケージのインストールと公開が行えます。

```yaml copy
name: Publish Package to npmjs
on:
  release:
    types: [published]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      # Setup .npmrc file to publish to npm
      - uses: actions/setup-node@v7
        with:
          node-version: '20.x'
          registry-url: 'https://registry.npmjs.org'
          # Defaults to the user or organization that owns the workflow file
          scope: '@octocat'
      - run: yarn
      - run: yarn npm publish // for Yarn version 1, use `yarn publish` instead
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
```

発行中にレジストリで認証を行うには、認証トークンも `yarnrc.yml` ファイルで定義されていることを確認します。 詳しくは、Yarn のドキュメントの記事「[設定](https://yarnpkg.com/configuration/yarnrc#npmAuthToken)」をご覧ください。