# Публикация пакетов Node.js

В этом руководстве вы узнаете, как публиковать пакеты Node.js в реестр в рамках рабочего процесса непрерывной интеграции (CI).

## Введение

В этом руководстве показано, как создать рабочий процесс, который публикует пакеты Node.js в GitHub Packages реестры и npm после прохождения тестов непрерывной интеграции (CI).

## Необходимые компоненты

Рекомендуется иметь базовое представление о параметрах конфигурации рабочих процессов, а также о том, как создавать файл рабочего процесса. Дополнительные сведения см. в разделе [Написание рабочих процессов](/ru/enterprise-server@3.22/actions/how-tos/write-workflows).

Дополнительные сведения о создании рабочего процесса CI для проекта Node.js см. в разделе [Создание и тестирование для Node.js](/ru/enterprise-server@3.22/actions/tutorials/build-and-test-code/nodejs).

Также могут быть полезны базовые знания в следующих областях:

* [Работа с реестром npm](/ru/enterprise-server@3.22/packages/working-with-a-github-packages-registry/working-with-the-npm-registry)
* [Хранение сведений в переменных](/ru/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-variables)
* [Использование секретов в GitHub Actions](/ru/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)
* [Использование GITHUB\_TOKEN для проверки подлинности в рабочих процессах](/ru/enterprise-server@3.22/actions/tutorials/authenticate-with-github_token)

## Сведения о конфигурации пакета

`name` Поля `version` в `package.json` файле создают уникальный идентификатор, который реестры используют для связывания пакета с реестром. Вы можете добавить сводку для страницы описания пакетов, включив `description` поле в `package.json` файл. Дополнительные сведения см. в разделе ["Создание файла](https://docs.npmjs.com/creating-a-package-json-file) package.json" и ["Создание модулей](https://docs.npmjs.com/creating-node-js-modules) Node.js" в документации npm.

Если локальный `.npmrc``registry` файл существует и имеет указанное значение, команда использует реестр, `npm publish` настроенный в `.npmrc` файле. Действие можно использовать `setup-node` для создания локального `.npmrc` файла в средстве выполнения, который настраивает реестр и область по умолчанию. Действие `setup-node` также принимает в качестве входных данных маркер проверки подлинности, используемый для доступа к частным реестрам или публикации пакетов узлов. Дополнительные сведения см. в разделе [`setup-node`](https://github.com/actions/setup-node/).

Указать версию Node.js, установленную в средстве выполнения тестов, можно с помощью действия `setup-node`.

Если вы добавите шаги в рабочий процесс для настройки `publishConfig` полей в `package.json` файле, вам не нужно указывать URL-адрес реестра с помощью `setup-node` действия, но вы будете ограничены публикацией пакета в одном реестре. Дополнительные сведения см [. в статье publishConfig](https://docs.npmjs.com/cli/v9/configuring-npm/package-json#publishconfig) в документации по npm.

## Публикация пакетов в реестре npm

Рабочий процесс можно активировать для публикации пакета каждый раз при публикации нового выпуска. Процесс в следующем примере выполняется при активации события выпуска типа `published` . Если тесты CI проходят, процесс отправляет пакет в реестр npm. Дополнительные сведения см. в разделе [Управление выпусками в репозитории](/ru/enterprise-server@3.22/repositories/releasing-projects-on-github/managing-releases-in-a-repository#creating-a-release).

Для выполнения аутентифицированных операций с реестром npm в рабочем процессе необходимо сохранить маркер проверки подлинности npm в виде секрета. Например, создайте секрет репозитория `NPM_TOKEN`. Дополнительные сведения см. в разделе [Использование секретов в GitHub Actions](/ru/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

Рабочий процесс можно активировать для публикации пакета каждый раз при публикации нового выпуска. Процесс в следующем примере выполняется при активации события выпуска типа `published` . Если тесты CI проходят, процесс отправляет пакет GitHub Packagesв . Дополнительные сведения см. в разделе [Управление выпусками в репозитории](/ru/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` этом разделе используется в качестве целевого реестра npm.GitHub Packages Например, публикация приведенных ниже `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 для проверки подлинности в рабочих процессах](/ru/enterprise-server@3.22/actions/tutorials/authenticate-with-github_token).

Если вы хотите опубликовать пакет в другом репозитории, необходимо использовать personal access token (classic) разрешение на запись в пакеты в целевом репозитории. Дополнительные сведения см. в разделе \[AUTOTITLE и [Управление личными маркерами доступа](/ru/enterprise-server@3.22/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens)]\(/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` файле. Дополнительные сведения см [. в статье "Параметры](https://yarnpkg.com/configuration/yarnrc#npmAuthToken) " в документации Yarn.