Линтинг и форматирование в CI
Запуск ESLint, Prettier и TypeScript в CI-пайплайне — автоматическая проверка стиля и корректности кода при каждом PR, исключающая «вкусовые» разногласия при code review.
Зачем нужно
Без автоматической проверки в CI разработчики тратят время code review на стилевые замечания («здесь пробел не нужен»). Линтинг в CI переносит эти проверки на машину: пайплайн заблокирует PR с нарушениями до того, как другой разработчик откроет код. Форматирование через Prettier устраняет разногласия полностью — один стиль для всей команды.
Где используется
- ESLint + Prettier в каждом JavaScript/TypeScript проекте
- TypeScript type-check (
tsc --noEmit) в CI перед деплоем - Pre-commit хуки (Husky) для быстрой проверки до пуша
- GitHub Actions: автоматическое форматирование через
--fix+ commit
Основной контент
Настройка ESLint + Prettier
npm install -D eslint prettier eslint-config-prettier \
@typescript-eslint/eslint-plugin @typescript-eslint/parser
// eslint.config.js (flat config, ESLint 9+)
import tseslint from '@typescript-eslint/eslint-plugin';
import tsparser from '@typescript-eslint/parser';
import prettier from 'eslint-config-prettier';
export default [
{
files: ['**/*.ts', '**/*.tsx'],
languageOptions: { parser: tsparser },
plugins: { '@typescript-eslint': tseslint },
rules: {
...tseslint.configs.recommended.rules,
'@typescript-eslint/no-explicit-any': 'error',
'no-console': 'warn',
},
},
prettier, // отключает правила ESLint, конфликтующие с Prettier
];
// .prettierrc
{
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5",
"printWidth": 100
}
package.json скрипты
{
"scripts": {
"lint": "eslint src --ext .ts,.tsx",
"lint:fix": "eslint src --ext .ts,.tsx --fix",
"format": "prettier --write src",
"format:check": "prettier --check src",
"typecheck": "tsc --noEmit"
}
}
CI-пайплайн с проверками
# .github/workflows/quality.yml
name: Code Quality
on:
pull_request:
branches: [main]
jobs:
quality:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- name: Type check
run: npm run typecheck
- name: Lint
run: npm run lint
- name: Check formatting
run: npm run format:check
Pre-commit хуки через Husky + lint-staged
npm install -D husky lint-staged
npx husky init
// package.json
{
"lint-staged": {
"*.{ts,tsx}": ["eslint --fix", "prettier --write"],
"*.{json,md,yml}": ["prettier --write"]
}
}
# .husky/pre-commit
npx lint-staged
Теперь при каждом git commit автоматически форматируются только изменённые файлы.
Commitlint — проверка сообщений коммитов
npm install -D @commitlint/cli @commitlint/config-conventional
// commitlint.config.js
module.exports = { extends: ['@commitlint/config-conventional'] };
# .husky/commit-msg
npx --no -- commitlint --edit $1
# Теперь: "fix: correct typo" ✓, "fixed stuff" ✗
Частые ошибки
- Линтер только локально, не в CI — разработчики пушат код без проверки
eslint --fixв CI с авто-коммитом в основную ветку — может создать проблемы- Конфликт правил ESLint и Prettier —
eslint-config-prettierотключает конфликтующие правила - Линт всего проекта при каждом коммите через Husky (медленно) —
lint-stagedлечит проблему