# Создание и тестирование для Node.js

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

> \[!NOTE]
> GitHub Enterprise Serverразмещенные в данный момент средства выполнения не поддерживаются в GitHub.

## Введение

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

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

Рекомендуется иметь базовое представление о Node.js, YAML, параметрах конфигурации рабочих процессов, а также о том, как создавать файл рабочего процесса. Дополнительные сведения см. в разделе:

* [Написание рабочих процессов](/ru/enterprise-server@3.22/actions/how-tos/write-workflows)
* [Начало работы с Node.js](https://nodejs.org/learn/getting-started/introduction-to-nodejs)

### Использование локальных средств выполнения GitHub Enterprise Server

При использовании действий установки (например `actions/setup-LANGUAGE`) GitHub Enterprise Server с локальными средствами выполнения, возможно, потребуется настроить кэш средств на запусках, у которых нет доступа к Интернету. Дополнительные сведения см. в разделе [Настройка кэша инструментов для локально размещенных средств выполнения без доступа к Интернету](/ru/enterprise-server@3.22/admin/managing-github-actions-for-your-enterprise/managing-access-to-actions-from-githubcom/setting-up-the-tool-cache-on-self-hosted-runners-without-internet-access).

## Использование шаблона рабочего процесса Node.js

Чтобы быстро приступить к работе, добавьте шаблон рабочего процесса в `.github/workflows` каталог репозитория.

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

1. На GitHubперейдите на главную страницу репозитория.

2. Под именем репозитория щелкните **<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-play" aria-label="play" role="img"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path></svg> Actions**.

   ![Снимок экрана: вкладки для репозитория github/docs. Вкладка "Действия" выделена оранжевым контуром.](/assets/images/help/repository/actions-tab-global-nav-update.png)

3. Если в вашем репозитории уже используется рабочий процесс, нажмите кнопку **Создать рабочий процесс**.

4. На странице "Выбор рабочего процесса" показан выбор рекомендуемых шаблонов рабочих процессов. Найдите "Node.js".

5. Отфильтруйте выбор рабочих процессов, щелкнув **"Непрерывная интеграция**".

6. В рабочем процессе "Node.js" нажмите кнопку **"Настроить**".

   Если вы не найдете шаблон рабочего процесса "Node.js", скопируйте следующий код рабочего процесса в новый файл, который вызывается `node.js.yml` в `.github/workflows` каталоге репозитория.

   ```yaml copy
   name: Node.js CI

   on:
     push:
       branches: [ "main" ]
     pull_request:
       branches: [ "main" ]

   jobs:
     build:
       runs-on: ubuntu-latest

       strategy:
         matrix:
           node-version: [18.x, 20.x]
           # See supported Node.js release schedule at https://nodejs.org/en/about/releases/

       steps:
       - uses: actions/checkout@v6
       - name: Use Node.js ${{ matrix.node-version }}
         uses: actions/setup-node@v7
         with:
           node-version: ${{ matrix.node-version }}
           cache: 'npm'
       - run: npm ci
       - run: npm run build --if-present
       - run: npm test
   ```

7. Измените рабочий процесс по мере необходимости. Например, измените версии узла, которые вы хотите использовать.

8. Щелкните **Зафиксировать изменения**.

## Указание версии Node.js

Самый простой способ указать версию Node.js — использовать действие, предоставленное `setup-node`GitHub. Дополнительные сведения см. описании [`setup-node`](https://github.com/actions/setup-node/).

Действие `setup-node` принимает версию Node.js в качестве входных данных и настраивает ее в средстве выполнения. Действие `setup-node` находит определенную версию Node.js из кэша инструментов в каждом средстве запуска и добавляет необходимые двоичные файлы в переменную `PATH`, которая сохраняется до конца задания.
`setup-node` Использование действия — это рекомендуемый способ использования Node.js, GitHub Actions так как он обеспечивает согласованное поведение между различными средствами выполнения и различными версиями Node.js. При использовании локального средства выполнения необходимо установить Node.js и добавить его в `PATH`.

Шаблон рабочего процесса включает в себя стратегию матрицы, которая создает и тестирует код с помощью Node.js версий, перечисленных в `node-version`. Значение x в номере версии — это подстановочный знак, соответствующий последнему дополнительному и исправлению, доступному для версии. Каждая версия Node.js, указанная в массиве `node-version`, создает задание, которое выполняет одни и те же действия.

Каждое задание может получить доступ к значению, определенному в массиве `node-version` матрицы, с помощью контекста `matrix`. Действие `setup-node` использует контекст в качестве входных данных `node-version`. Действие `setup-node` настраивает каждое задание с использованием разных версий Node.js перед созданием и тестированием кода. Дополнительные сведения о стратегиях матриц и контекстах см. в разделе \[AUTOTITLE и [Синтаксис рабочего процесса для GitHub Actions](/ru/enterprise-server@3.22/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstrategymatrix)]\(/actions/reference/workflows-and-actions/contexts).

```yaml copy
strategy:
  matrix:
    node-version: ['18.x', '20.x']

steps:
- uses: actions/checkout@v6
- name: Use Node.js ${{ matrix.node-version }}
  uses: actions/setup-node@v7
  with:
    node-version: ${{ matrix.node-version }}
```

Кроме того, можно создавать и тестировать код с использованием конкретных версий Node.js.

```yaml copy
strategy:
  matrix:
    node-version: ['10.17.0', '17.9.0']
```

Либо можно создавать и тестировать код с помощью одной версии Node.js.

```yaml copy
name: Node.js CI

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v6
      - name: Use Node.js
        uses: actions/setup-node@v7
        with:
          node-version: '20.x'
      - run: npm ci
      - run: npm run build --if-present
      - run: npm test
```

Если вы не указываете версию Node.js, GitHub использует версию среды по умолчанию Node.js.
Дополнительные сведения см. в разделе [Средства выполнения тестов, размещенные в GitHub](/ru/enterprise-server@3.22/actions/concepts/runners/github-hosted-runners#preinstalled-software-for-github-owned-images).

## Установка зависимостей

GitHub-размещенные средства выполнения имеют npm и диспетчеры зависимостей Yarn. Вы можете использовать npm и Yarn для установки зависимостей в рабочем процессе перед созданием и тестированием кода. На Windows и GitHubLinux также установлены средства выполнения Grunt, Gulp и Bower.

Можно также кэшировать зависимости, чтобы ускорить рабочий процесс. Дополнительные сведения см. в разделе [Справочник по кэшированию зависимостей](/ru/enterprise-server@3.22/actions/reference/workflows-and-actions/dependency-caching).

### Пример использования npm

В этом примере устанавливаются версии в `package-lock.json` файле или `npm-shrinkwrap.json` файле и не будут обновляться файлы блокировки. Выполнение `npm ci` обычно осуществляется быстрее, чем `npm install`. Дополнительные сведения см. в статье [`npm ci`](https://docs.npmjs.com/cli/ci.html) и [вводе `npm ci` более быстрых и надежных сборок.](https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable)

```yaml copy
steps:
- uses: actions/checkout@v6
- name: Use Node.js
  uses: actions/setup-node@v7
  with:
    node-version: '20.x'
- name: Install dependencies
  run: npm ci
```

С помощью `npm install` установки зависимостей, определенных в `package.json` файле. Дополнительные сведения см. в статье [`npm install`](https://docs.npmjs.com/cli/install).

```yaml copy
steps:
- uses: actions/checkout@v6
- name: Use Node.js
  uses: actions/setup-node@v7
  with:
    node-version: '20.x'
- name: Install dependencies
  run: npm install
```

### Пример использования Yarn

В этом примере устанавливаются зависимости, определенные в `yarn.lock` файле, и предотвращается обновление `yarn.lock` файла. Дополнительные сведения см. в статье [`yarn install`](https://yarnpkg.com/en/docs/cli/install).

```yaml copy
steps:
- uses: actions/checkout@v6
- name: Use Node.js
  uses: actions/setup-node@v7
  with:
    node-version: '20.x'
- name: Install dependencies
  run: yarn --frozen-lockfile
```

Кроме того, можно установить зависимости, определенные в `package.json` файле.

```yaml copy
steps:
- uses: actions/checkout@v6
- name: Use Node.js
  uses: actions/setup-node@v7
  with:
    node-version: '20.x'
- name: Install dependencies
  run: yarn
```

### Пример использования частного реестра и создания NPMRC-файла

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

Чтобы пройти проверку подлинности в частном реестре, нужно сохранить маркер проверки подлинности npm в виде секрета. Например, создайте секрет репозитория `NPM_TOKEN`. Дополнительные сведения см. в разделе [Использование секретов в GitHub Actions](/ru/enterprise-server@3.22/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).

В приведенном ниже примере в `NPM_TOKEN` секрета хранится токен проверки подлинности npm. Действие `setup-node` настраивает `.npmrc` файл для чтения маркера проверки подлинности npm из переменной `NODE_AUTH_TOKEN` среды. При использовании `setup-node` действия для создания `.npmrc` файла необходимо задать `NODE_AUTH_TOKEN` переменную среды с секретом, содержащим маркер проверки подлинности npm.

Перед установкой `setup-node` зависимостей используйте действие для создания `.npmrc` файла. Это действие имеет два входных параметра. Параметр `node-version` задает версию Node.js, а параметр `registry-url` задает реестр по умолчанию. Если в реестре пакетов используются области, необходимо использовать параметр `scope`. Дополнительные сведения см. в статье [`npm-scope`](https://docs.npmjs.com/misc/scope).

```yaml copy
steps:
- uses: actions/checkout@v6
- name: Use Node.js
  uses: actions/setup-node@v7
  with:
    always-auth: true
    node-version: '20.x'
    registry-url: https://registry.npmjs.org
    scope: '@octocat'
- name: Install dependencies
  run: npm ci
  env:
    NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
```

В приведенном выше примере создается `.npmrc` файл со следующим содержимым:

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

### Примеры кэширования зависимостей

Можно кэшировать и восстанавливать зависимости с помощью [`setup-node`действия](https://github.com/actions/setup-node).

В следующем примере кэшируются зависимости для npm.

```yaml copy
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v7
  with:
    node-version: '20'
    cache: 'npm'
- run: npm install
- run: npm test
```

В следующем примере кэшируются зависимости для Yarn.

```yaml copy
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v7
  with:
    node-version: '20'
    cache: 'yarn'
- run: yarn
- run: yarn test
```

В следующем примере кэшируются зависимости для pnpm (версия 6.10 или более поздняя).

```yaml copy
# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.
# Они предоставляются сторонним поставщиком, и на них распространяются
# отдельные условия обслуживания, политика конфиденциальности и поддержка
# документации.

# NOTE: pnpm caching support requires pnpm version >= 6.10.0

steps:
- uses: actions/checkout@v6
- uses: pnpm/action-setup@0609f0983b7a228f052f81ef4c3d6510cae254ad
  with:
    version: 6.10.0
- uses: actions/setup-node@v7
  with:
    node-version: '20'
    cache: 'pnpm'
- run: pnpm install
- run: pnpm test
```

Если у вас есть особые требования или вам нужно управлять кэшированием более детально, можно использовать [действие `cache`](https://github.com/marketplace/actions/cache). Дополнительные сведения см. в разделе [Справочник по кэшированию зависимостей](/ru/enterprise-server@3.22/actions/reference/workflows-and-actions/dependency-caching).

## Создание и тестирование кода

Вы можете использовать те же команды, которые используются для создания и тестирования кода в локальной среде. Например, если выполнить `npm run build` шаги сборки, определенные в `package.json` файле и `npm test` запустить набор тестов, вы добавите эти команды в файл рабочего процесса.

```yaml copy
steps:
- uses: actions/checkout@v6
- name: Use Node.js
  uses: actions/setup-node@v7
  with:
    node-version: '20.x'
- run: npm install
- run: npm run build --if-present
- run: npm test
```

## Упаковка данных рабочего процесса в виде артефактов

Вы можете сохранить артефакты из шагов сборки и тестирования, чтобы просмотреть их после завершения задания. Например, может потребоваться сохранить файлы журналов, основные дампы, результаты теста или снимки экрана. Дополнительные сведения см. в разделе [Хранение и предоставление общего доступа к данным с артефактами рабочего процесса](/ru/enterprise-server@3.22/actions/tutorials/store-and-share-data).

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

Вы можете настроить рабочий процесс для публикации пакета Node.js в реестре пакетов после прохождения тестов CI. Дополнительные сведения о публикации в npm и GitHub Packagesсм. в разделе [Публикация пакетов Node.js](/ru/enterprise-server@3.22/actions/tutorials/publish-packages/publish-nodejs-packages).