Как вы организуете CI/CD для Vue-приложения?
Организация CI/CD для Vue-приложения обеспечивает автоматическую проверку кода, сборку, тестирование и деплой без ручного вмешательства. Это критически важно при командной разработке, высокой частоте релизов и требовании к стабильности продакшн-среды. Полноценный CI/CD-процесс включает этапы линтинга, юнит- и интеграционных тестов, сборки проекта, прогонки e2e-тестов, деплоя в staging/production, и может быть реализован с помощью GitHub Actions, GitLab CI, CircleCI, Jenkins, Travis CI и других.
1. Типичный пайплайн
Этапы CI:
-
Установка зависимостей (npm ci)
-
Проверка кода (eslint, prettier)
-
Проверка типов (tsc, если используется TypeScript)
-
Unit-тесты (vitest, jest, @vue/test-utils)
-
E2E-тесты (Cypress, Playwright)
-
Сборка (vite build / vue-cli-service build)
-
Генерация артефактов
Этапы CD:
-
Проверка окружения
-
Деплой на staging (preview-окружение)
-
Деплой на production (ручной или авто)
2. GitHub Actions (пример)
Файл .github/workflows/deploy.yml:
name: CI/CD
on:
push:
branches: \[main\]
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
\- name: Checkout repo
uses: actions/checkout@v3
\- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 20
cache: 'npm'
\- name: Install dependencies
run: npm ci
\- name: Lint
run: npm run lint
\- name: Type check
run: npm run type-check
\- name: Run unit tests
run: npm run test:unit
\- name: Build project
run: npm run build
\- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: dist
path: dist
deploy:
runs-on: ubuntu-latest
needs: build
if: github.ref == 'refs/heads/main'
steps:
\- name: Download artifact
uses: actions/download-artifact@v3
with:
name: dist
\- name: Deploy to server (via rsync)
run: |
rsync -avz ./dist/ user@your-server:/var/www/app
env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_KEY }}
3. GitLab CI (пример .gitlab-ci.yml)
stages:
\- lint
\- test
\- build
\- deploy
variables:
NODE_ENV: production
cache:
paths:
\- node_modules/
lint:
stage: lint
script:
\- npm ci
\- npm run lint
test:
stage: test
script:
\- npm run test:unit
build:
stage: build
script:
\- npm run build
artifacts:
paths:
\- dist/
deploy:
stage: deploy
script:
\- rsync -avz dist/ user@server:/var/www/app
only:
\- main
4. Сборка и деплой через Docker
Если деплой происходит в Docker-окружение, Vue-приложение можно собирать в image:
Dockerfile
FROM node:20-alpine AS builder
WORKDIR /app
COPY . .
RUN npm ci && npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
В CI
\- name: Build Docker image
run: docker build -t my-vue-app .
\- name: Push to Docker registry
run: docker push my-vue-app
\- name: Deploy via SSH
run: ssh user@host "docker pull my-vue-app && docker stop vue && docker rm vue && docker run -d --name vue my-vue-app"
5. Хранение артефактов
-
dist/ загружается в артефакты (в GitHub Actions — upload-artifact, в GitLab — artifacts:)
-
Можно использовать как preview-сборку для QA
-
В staging окружении удобно показывать каждую PR-сборку по ссылке вида: staging.example.com/pr-42
6. Preview окружения (на Pull Request)
Используется Vercel, Netlify или Surge:
Netlify
-
Автоматический деплой при каждом PR
-
Использует netlify.toml:
\[build\]
command = "npm run build"
publish = "dist"
\[context.production.environment\]
NODE_ENV = "production"
7. Интеграция e2e-тестов
Cypress
npx cypress run --browser chrome
В GitHub Actions:
\- name: Run E2E tests
run: npm run test:e2e
Перед запуском часто нужен vite preview или serve:
\- name: Start local server
run: npm run preview &
\- name: Run Cypress
run: npx cypress run
8. Проверка перед пушем
На этапе коммита или push можно запускать husky + lint-staged:
husky:
npx husky install
npx husky add .husky/pre-commit "npx lint-staged"
lint-staged (в package.json):
"lint-staged": {
"\*.{js,ts,vue}": \[
"eslint --fix",
"prettier --write"
\]
}
9. Использование .env и переменных среды
В Vue (Vite) переменные среды передаются через VITE_:
VITE_API_URL=https://api.example.com
В CI:
env:
VITE_API_URL: ${{ secrets.API_URL }}
10. Многоконтурный деплой (staging / prod)
Разделяются по веткам:
on:
push:
branches:
\- staging
\- main
Логика деплоя зависит от ветки:
\- name: Deploy to staging
if: github.ref == 'refs/heads/staging'
run: deploy-to-staging.sh
\- name: Deploy to production
if: github.ref == 'refs/heads/main'
run: deploy-to-prod.sh
11. Безопасность и Secrets
-
Использование GitHub Secrets (Settings → Secrets)
-
Хранение API ключей, SSH-ключей, token'ов
-
Не пушить .env в репозиторий
env:
SSH_KEY: ${{ secrets.SSH_KEY }}
VITE_API_URL: ${{ secrets.API_URL }}
12. Мониторинг и логирование
-
Slack-нотификации (slack/webhook)
-
GitHub Checks (status badges)
-
Отправка ошибок в Sentry, LogRocket, Datadog
-
Метрики времени билда и деплоя
13. Частичный деплой (переменные, фичи, сегменты)
-
Управление фичами через флаги (useFeatureFlag())
-
Включение только нужных подмодулей
-
Возможность откатить код, не деплоив весь фронт