GitHub Actions для Node.js

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

GitHub Actions - это инструменты автоматизации с открытым исходным кодом, встроенные в GitHub. Они позволяют разработчикам выполнять свои проектные действия, разрабатывая рабочие процессы. Эти рабочие процессы могут использоваться для выполнения таких функций, как тестирование кода, создание приложений или развертывание программного обеспечения. С помощью файлов, закодированных в YAML, можно описать несколько шагов, выполняемых всякий раз, когда в вашем репозитории происходят определенные заявленные действия, такие как отправка или запрос изменений в коде. Ниже будут рассмотрены важные элементы, подробные процессы и рекомендации по применению эффективных структур непрерывной интеграции и непрерывного развертывания CI/CD. Давайте начнем с приведенной ниже диаграммы, которая объясняет работу GitHub Actions.

Источник изображения: YouTube

Изображение выше дает целостное представление о функционировании GitHub Actions. Происходят события, которые затем запускают рабочие процессы одного или нескольких заданий. Это задание разделено на несколько этапов, каждый из которых выполняет определенные действия. Весь процесс описан в YAML-файле. Таким образом, становится довольно удобно настраивать любые процессы автоматизации в вашем репозитории GitHub без особых усилий.

Настройка действий на GitHub для Node.js

Чтобы начать работу с GitHub Actions, вам понадобится дополнительный файл workflow, хранящийся в репозитории. Этот файл имеет формат yaml и обычно находится в папке .github/workflows. Базовый формат включает:

name: Node.js CI

on: 
  push:branches: 
 - mainpull_request:branches:- main

jobs:build:runs-on: ubuntu-lateststeps:- name: Check out codeuses: actions/checkout@v2

 - name: Set up Node.jsuses: actions/setup-node@v2with:node-version: '14'  # Specify the Node.js version you want to use

      # Add more steps here...

В этом фрагменте представлен рабочий процесс Node.js CI, который запускается при отправке push-запросов в главную ветвь. Этот компонент содержит одно задание под названием build, которое выполняется в последней доступной версии Ubuntu. Задание состоит из двух шагов; на первом этапе используется действие actions/checkout для проверки кода хранилища, а на втором, который использует действие actions/setup-node, устанавливается node js версии 14. Этот рабочий процесс является основой для предстоящих задач, таких как выполнение тестов или компиляция приложения.

Конфигурации, специфичные для Nodejs

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

 - name: Install dependencies
        run: npm install

 - name: Run tests
        run: npm test

Эти шаги гарантируют, что приложение создано должным образом и что все тесты были пройдены до того, как будут интегрированы какие-либо изменения.

В файле workflow вы определите, какую версию Node.js использовать. Это делается на этапе настройки узла, где вы можете использовать любую программу долгосрочной поддержки LTS или конкретную версию.

 - name: Set up Node.jsuses: actions/setup-node@v2with:node-version: '14'  # Use the desired Node.js version

Это гарантирует наличие необходимой версии для запуска приложения и выполнения задач на следующих этапах. При необходимости вы также можете использовать диапазоны версий или указать несколько версий.

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

 - name: Install dependencies
        run: npm install

На этом этапе обеспечивается доступ ко всем необходимым пакетам для бесперебойной работы вашего приложения.

Переменные среды

Одним из вариантов настройки переменных среды является функция GitHub Secrets, которая позволяет пользователю эффективно скрывать конфиденциальную информацию, такую как ключи API или информация о подключении к базе данных.

Возможно назначение переменной окружения путем добавления записанного шага в процессе, который помещает требуемую переменную в файл $GITHUB_ENV. Например:

 - name: Set up environment variables
        run: echo "MY_VARIABLE=${{ secrets.MY_VARIABLE }}" >> $GITHUB_ENV

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

Автоматизация задач

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

 - name: Run tests
        run: npm test

Если вы хотите выполнить Jest с некоторыми выбранными параметрами, вы можете рассмотреть возможность включения:

 - name: Run Jest tests
        run: npm run test -- --coverage

Это гарантирует, что ваши тесты будут выполняться при каждом внесении изменений или инициировании запроса на обновление, что поможет выявить проблемы с системой на ранних стадиях.

Как только вы решите сделать свое приложение общедоступным, вы можете приступить к автоматизации процессов создания и развертывания. После выполнения тестов вы можете добавить шаги по созданию вашего приложения. Например:

 - name: Build application
        run: npm run build

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

Для развертывания вы можете запустить команду, соответствующую вашему подходу к развертыванию. Например, если вы используете такой сервис, как Heroku или AWS, команда может выглядеть следующим образом:

 - name: Deploy to Productionrun: npm run deploy  # Adjust this command as necessary for your setup

Эта команда запускает npm run deploy, который выполняет сценарий развертывания из package.json для производственного развертывания приложения.

Убедитесь, что используемая вами команда развертывания адаптирована к особенностям вашей среды.

Теперь, чтобы поддерживать качество кода, можно автоматизировать процесс проверки на наличие ссылок, а также на форматирование как часть рабочего процесса. В случае, если используются ESLint и Prettier, выполните шаги, описанные ниже:

 - name: Lint code
        run: npx eslint .

 - name: Format code
        run: npx prettier --check .

Эти процедуры позволят проверить наличие каких-либо проблем с компоновкой и обеспечить единообразие форматирования кода во всем проекте. Не стесняйтесь изменять команды в соответствии с настройками вашего проекта.

Общие действия на GitHub для Node.js

Одним из наиболее важных аспектов непрерывной интеграции (CI) - это автоматизация тестирования и проверки изменений кода. Ниже приведены некоторые из наиболее распространенных ки мероприятий по Node.js проекты:

  • Тестирование и валидация: Для поддержания качества кода очень важна автоматизация процесса тестирования. Вы можете создать рабочий процесс, в котором при каждом запуске кода или выполнении запроса на извлечение будут выполняться тесты. Вот пример того, как это сделать в вашем рабочем процессе:
 - name: Run tests
        run: npm test

На этом этапе выполняется весь набор тестов, чтобы проверить, прошел ли каждый тест успешно. В случае сбоя какого-либо теста рабочий процесс будет считаться сбоем, чтобы предотвратить объединение любого поврежденного кода.

  • Анализ покрытия кода: Чтобы оценить долю вашего кода, который был протестирован, вы можете использовать решения для покрытия кода, такие как Istanbul или Coveralls. После выполнения тестов можно применить команду покрытия и отобразить результаты:
 - name: Run coverage report
        run: npm run coverage

Приведенный выше код выполняет сценарий покрытия, указанный в файле package.json проекта. Этот сценарий создает отчет о покрытии кода, который показывает, в какой степени существующие тестовые примеры использовали код.

Непрерывное развертывание (CD)

Непрерывное развертывание (CD) автоматизирует каждый шаг, который приводит ваше приложение к работе. Вот несколько популярных подходов к развертыванию Node.js Приложения:

  • Развертывание на облачных платформах (с помощью AWS): Если вы выполняете развертывание в облаке AWS, некоторые из сервисов, которые вы можете выбрать, включают Elastic Beanstalk или Lambda. Ниже приведено простое описание того, как выполнить развертывание на Elastic Beanstalk с помощью GitHub Actions.:
 - name: Deploy to AWS Elastic Beanstalkuses: einaregilsson/beanstalk-deploy@v1with:application_name: your-app-nameenvironment_name: your-env-nameversion_label: ${{ github.sha }}region: your-regionbucket_name: your-bucket-namebucket_key: your-bucket-keyaccess_key: ${{ secrets.AWS_ACCESS_KEY }}secret_key: ${{ secrets.AWS_SECRET_KEY }}

Здесь в коде используется действие einaregilsson/beanstalk-deploy для развертывания приложения на AWS Elastic Beanstalk. В нем указаны имя приложения, название среды и метка версии (которая всегда задается как текущее значение SHA для фиксации Git), а также применимый регион AWS, название сегмента S3 и ключ сегмента, который будет использоваться для артефактов развертывания. Ключи доступа и секретности извлекаются из вкладки "Секреты" на GitHub, что облегчает безопасное использование учетных данных для процесса развертывания.

В целях безопасности, пожалуйста, убедитесь, что вы добавили свои учетные данные AWS в раздел "Секреты репозитория".

  • Развертывание в бессерверных средах: Для развертываний без внутренних серверов вы можете рассмотреть такие сервисы, как AWS Lambda или Vercel. Это пример развертывания в AWS Lambda:
 - name: Deploy to AWS Lambdarun: |
          npm install -g serverless
         serverless deploy

Здесь бессерверная платформа устанавливается глобально с помощью команды npm install -g serverless. После этого вызывается команда serverless deploy, которая развертывает приложение в AWS Lambda в соответствии со спецификациями бессерверной платформы, установленной в системе, что позволяет удобно работать с бессерверными функциями и ресурсами.

Убедитесь, что в вашем проекте имеется бессерверный файл конфигурации.yml, в котором указаны ваши лямбда-функции и их свойства.

Расширенные возможности действий на GitHub

Помимо основных функций GitHub Actions, другие расширенные функции могут повысить эффективность ваших рабочих процессов. Такие функции помогают повысить эффективность, гибкость и безопасность ваших процессов CI/CD. Ниже приведены две важные дополнительные функции:

Зависимости кэширования

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

Вот как настроить кэширование в вашем рабочем процессе:

 - name: Cache Node.js modulesuses: actions/cache@v2with:path: ~/.npmkey: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}restore-keys: |
            ${{ runner.os }}-node-

Эта программа установки кэширует каталог node_modules, используя информацию о зависимостях из файла package-lock.json. Если последний не был изменен, при последующем выполнении будут восстановлены кэшированные зависимости, что значительно сократит время, затрачиваемое на установку зависимостей.

Распараллеливание задач

Распараллеливание задач помогает выполнять команды более чем в одном задании одновременно, что может значительно сократить общее время выполнения ваших процессов. Это особенно удобно, когда проект большой, потому что вам может потребоваться выполнить несколько тестов, а также некоторые доработки и сборки одновременно.

Вы можете указать в своем рабочем процессе несколько заданий, которые будут работать одновременно, следующим образом:

jobs:test:runs-on: ubuntu-lateststeps:- name: Run testsrun: npm test

  lint:runs-on: ubuntu-lateststeps:- name: Lint coderun: npx eslint .

Здесь задания test и lint выполняются одновременно, поэтому проблемы можно найти и устранить гораздо быстрее.

Вывод

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