CI/CD для JavaScript проектов: GitHub Actions от А до Я

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: Зачем нужен CI/CD для JavaScript проектов?

Разработка современных JavaScript-приложений на Node.js требует не только написания качественного кода, но и его надежной доставки конечным пользователям. Ручное тестирование, сборка и деплой — это не только медленно, но и чревато человеческими ошибками. Здесь на помощь приходит CI/CD (Continuous Integration / Continuous Deployment) — методология автоматизации всех этапов жизненного цикла программного обеспечения.

CI/CD для JavaScript проектов позволяет автоматически запускать тесты при каждом пуше в репозиторий, собирать приложение и развертывать его на сервере или в облаке. Одним из самых популярных инструментов для реализации этой методологии является GitHub Actions — встроенная система автоматизации рабочего процесса на платформе GitHub.

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

Основная часть: Создание CI/CD пайплайна с GitHub Actions

1. Что такое GitHub Actions и как он работает?

GitHub Actions — это платформа для автоматизации рабочих процессов (workflows), которая запускается в ответ на события в репозитории (push, pull request, создание issue и т.д.). Workflow представляет собой набор шагов, выполняемых на виртуальных машинах (runner'ах). Каждый шаг может запускать скрипты, устанавливать зависимости или вызывать внешние сервисы.

Основные понятия:

  • Workflow — файл конфигурации YAML, хранящийся в папке .github/workflows/.
  • Event — триггер, запускающий workflow (например, push или pull_request).
  • Job — набор шагов, выполняемых на одном runner'е (зависимости, тесты, сборка).
  • Step — отдельная команда или действие (action).

Для JavaScript проектов мы будем использовать стандартный runner с Ubuntu, так как он поддерживает Node.js из коробки.

2. Базовая настройка: Тестирование и линтинг

Начнем с создания простого workflow для тестирования и линтинга кода. Создайте файл .github/workflows/ci.yml в корне вашего репозитория.

Пример конфигурации для Node.js проекта:

name: CI for Node.js

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18.x, 20.x]

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run linter
        run: npm run lint

      - name: Run tests
        run: npm test

Разберем ключевые моменты:

  • Matrix strategy — позволяет запускать тесты на нескольких версиях Node.js (18.x и 20.x) параллельно.
  • actions/checkout — стандартное действие для клонирования репозитория.
  • actions/setup-node — устанавливает нужную версию Node.js и включает кэширование node_modules для ускорения.
  • npm ci — чистая установка зависимостей из package-lock.json (быстрее и надежнее, чем npm install).

После пуша этого файла в репозиторий, GitHub Actions автоматически запустит тесты. Вы увидите результат в разделе "Actions" вашего репозитория.

3. Сборка и публикация Docker-образа

Если ваше JavaScript приложение разворачивается через Docker, следующим шагом будет автоматическая сборка образа и его публикация в Docker Hub или GitHub Container Registry. Это типичный этап CI/CD для Node.js микросервисов.

Добавим новый job в наш workflow:

  build-and-push:
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Log in to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: yourusername/my-app:latest

Что здесь важно:

  • needs: test — этот job запускается только после успешного прохождения тестов.
  • if: github.ref == 'refs/heads/main' — сборка происходит только для основной ветки.
  • Secrets — логин и пароль от Docker Hub хранятся в настройках репозитория (Settings → Secrets and variables → Actions). Никогда не пишите их в коде!

Для работы с Docker вам понадобится Dockerfile в корне проекта. Пример для Node.js приложения:

FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

4. Автоматический деплой на сервер (Continuous Deployment)

Финальный этап — автоматический деплой вашего JavaScript приложения на сервер. Для этого мы можем использовать SSH-доступ и скрипты. GitHub Actions поддерживает подключение к удаленному серверу через SSH.

Добавим третий job:

  deploy:
    needs: build-and-push
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'

    steps:
      - name: Deploy to server via SSH
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            docker pull yourusername/my-app:latest
            docker stop my-app-container || true
            docker rm my-app-container || true
            docker run -d --name my-app-container -p 3000:3000 yourusername/my-app:latest

Этот workflow выполняет:

  • Подключение к серверу по SSH с использованием приватного ключа (хранится в

Блоги

Рекомендаций по книгам