Введение: Зачем нужен 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 с использованием приватного ключа (хранится в