ESLint используется как статический анализатор кода, который выявляет ошибки, нарушения стиля и потенциально проблемные конструкции в JavaScript и TypeScript-проектах. При использовании в пайплайнах GitLab CI/CD линтинг перестаёт быть локальной практикой разработчика и становится обязательным этапом проверки качества кода на уровне репозитория.
Основная цель интеграции заключается в том, чтобы любые изменения проходили автоматическую проверку до попадания в основную ветку. Это снижает вероятность накопления технического долга и стандартизирует кодовую базу.
В контексте GitLab CI ESLint обычно выполняется как отдельная job в пайплайне, которая:
Минимальная логика сводится к следующему принципу: любое нарушение правил = падение pipeline.
Перед подключением ESLint в GitLab CI важно, чтобы локальная конфигурация уже существовала:
.eslintrc.js / .eslintrc.json /
eslint.config.jsПример package.json:
{
"scripts": {
"lint": "eslint ."
}
}
Такой подход позволяет унифицировать запуск: CI вызывает те же команды, что и разработчик локально.
.gitlab-ci.ymlТиповой pipeline для ESLint выглядит следующим образом:
stages:
- lint
eslint:
stage: lint
image: node:20
cache:
paths:
- node_modules/
script:
- npm ci
- npm run lint
image
cache
script
В CI важно различать npm install и
npm ci:
npm install может менять lock-файлnpm ci гарантирует строгое соответствие
package-lock.jsonВ контексте CI предпочтителен именно npm ci, поскольку
он:
В зрелых пайплайнах ESLint выделяется в отдельную стадию:
stages:
- install
- lint
- test
install:
stage: install
image: node:20
script:
- npm ci
lint:
stage: lint
image: node:20
script:
- npm ci
- npm run lint
Такой подход позволяет:
В монорепозиториях ESLint часто запускается выборочно:
lint:
script:
- npm ci
- npx eslint "packages/**/src/**/*.{js,ts}"
При использовании систем управления монорепо ESLint интегрируется как задача графа зависимостей:
Помимо node_modules, можно кэшировать внутренние данные
ESLint (особенно в больших проектах).
Пример:
cache:
paths:
- node_modules/
- .eslintcache
Запуск:
eslint . --cache
Преимущества:
В CI ESLint должен работать в режиме строгой валидации:
Пример:
eslint . --max-warnings=0
Это исключает ситуацию, когда код с предупреждениями попадает в основную ветку.
GitLab CI поддерживает артефакты, которые можно использовать для отображения результатов линтинга.
eslint . -f json -o eslint-report.json
eslint . -f junit -o eslint-junit.xml
В .gitlab-ci.yml:
lint:
script:
- npm ci
- npm run lint -- -f json -o eslint-report.json
artifacts:
reports:
codequality: eslint-report.json
GitLab может отображать результаты линтинга в Merge Request через Code Quality отчёты.
Для этого ESLint вывод должен быть преобразован в формат GitLab Code Climate.
Пример использования конвертера:
npx eslint . -f codeclimate > gl-code-quality-report.json
Конфигурация CI:
artifacts:
reports:
codequality: gl-code-quality-report.json
Результат:
В крупных проектах ESLint часто запускается отдельно:
lint-js:
script:
- eslint "src/**/*.js"
lint-ts:
script:
- eslint "src/**/*.ts"
Это позволяет:
Хотя CI является финальной точкой проверки, ESLint часто дублируется на уровне pre-commit:
CI при этом остаётся источником истины:
Иногда требуется различать локальный и CI-режимы:
eslint . --config .eslintrc.ci.json
Особенности CI-конфига:
ESLint job часто запускается параллельно с тестами:
stages:
- lint
- test
lint:
stage: lint
script:
- npm run lint
test:
stage: test
script:
- npm test
Такой pipeline сокращает общее время выполнения за счёт параллелизма.
Причины:
npm installПроблема возникает при:
Решение:
npx eslint или npm scriptПри монорепо возможны ситуации:
.eslintrcРешение:
overridesПри росте проекта ESLint становится узким местом, поэтому применяются:
.eslintcacheПример:
eslint $(git diff --name-only origin/main | grep '\.js$')
В GitLab CI ESLint часто запускается только на MR:
lint:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
Это снижает нагрузку на main-ветку и ускоряет feedback loop для разработчиков.
Встраивание ESLint в GitLab CI/CD превращает его из инструмента локального анализа в механизм управления качеством: