Skip to content

CI/CD та гейти якості (GitLab)

ЕтапОписПриклад job’ів
prepareкеш, середовище, залежностіinstall, build:deps
lintперевірка якості кодуeslint, stylelint, typecheck
testюніт та інтеграційні тестиtest:node, test:jsdom
buildзбірка docker image dev/stage/prodbuild:dev, build:prod
deployдеплой у dev/stage/proddeploy:dev, deploy:prod
smokee2e smoke тести основних сценаріївsmoke:dev, smoke:prod
stages:
- prepare
- lint
- test
- build
- deploy
# 🧱 Базовий шаблон для тестів
.test_template: &test_template
image: node:22-bookworm-slim
stage: test
cache:
key: vitest-${CI_COMMIT_REF_SLUG}
paths:
- .vitest/
variables:
TZ: "UTC"
CI: "true"
artifacts:
when: always
expire_in: 7 days
paths:
- reports/
reports:
junit: reports/junit-*.xml
coverage_report:
coverage_format: cobertura
path: reports/coverage/cobertura-coverage.xml
# ✅ Lint & TypeCheck
lint:
stage: lint
image: myorg/node-lint:20
script:
- pnpm eslint . --max-warnings=0
- pnpm tsc --noEmit
artifacts:
reports:
dotenv: reports/lint.env
# 🧪 Tests
test:node:
<<: *test_template
script:
- pnpm vitest run --project node --coverage --reporter=junit --outputFile=reports/junit-node.xml
test:jsdom:
<<: *test_template
script:
- pnpm vitest run --project jsdom --coverage --reporter=junit --outputFile=reports/junit-jsdom.xml
...
МетрикаЗначенняДія при порушенні
Coverage (global)≥ 80%job fail
Coverage (new code)≥ 70%коментар у MR
Lint errors0job fail
Type errors0job fail
Flaky tests< 2%job warning
Test duration≤ 5 хвwarning у MR

Гейти — це не формальність, а контроль стабільності - якщо pipeline зелений, код безпечний для релізу.

GitLab автоматично підтягує:

Тип звітуФайлВідображення
JUnitreports/junit-*.xmlсписок пройдених / упалих тестів
Coverage (Cobertura)reports/coverage/cobertura-coverage.xml% покриття в MR
Lintreports/lint.envрезультати ESLint
Performance (Lighthouse)reports/lighthouse.json(опціонально)
Bundle Sizereports/size.json(опціонально)

Поки MR відкритий:

  • must pass:
    • lint
    • typecheck
    • test:node
    • test:jsdom
  • 🟡 optional / informational:
    • coverage:summary
    • bundle-size
    • lighthouse
ТипЩо міститьЗберігається
JUnitрезультати Vitest7 днів
Coverage (HTML, XML)покриття7 днів
Lint reportseslint, tsc7 днів
Logsконсоль job’ів14 днів
Screenshots / debug(опціонально для e2e)14 днів

Ці файли передаються у reports/, тому легко завантажити для локального аналізу.

Автоматичне блокування при регресі

Section titled “Автоматичне блокування при регресі”
  • Якщо покриття нового коду < 70% --- у MR автоматично з’являється warning-коментар.
  • Якщо pipeline червоний → блокування merge (через Merge Checks у GitLab, якщо доступно).
  • При різкому падінні покриття (наприклад, -5%) - створюється issue “Coverage regression”.
  • retry: 1 для тестових job’ів (перезапуск при флейку).
  • interruptible: true - старі job’и автоматично скасовуються при новому пуші.
  • fail-fast: якщо lint або typecheck падає - pipeline не витрачає час на тести.
  • Slack / Email сповіщення: при падінні test або coverage < 80%.
Тип гілкиПолітика
feature/*тести обов’язкові при MR, coverage ≥ 70%
devповний пайплайн + quality stage
release/*обов’язкове проходження всіх job’ів
mainавтодеплой після зеленого пайплайну
  • Docker multi-stage для мінімізації образів.
  • pnpm store + cache - прискорення установки залежностей.
  • parallel jobs + needs: → 30-40% швидше.
  • no-install jobs (для lint/typecheck) - використовують кеш із prepare.