Лучшие практики линтинга YAML: выявление ошибок до деплоя
Один неверно расположенный пробел в YAML-файле может обрушить продакшен-деплой. В отличие от JSON, который явно сообщает об ошибках синтаксиса, YAML может тихо распарсить неправильный отступ в неожиданную структуру данных. Линтинг выявляет эти проблемы до того, как они попадут в продакшен.
Зачем линтить YAML?
Гибкость YAML — это одновременно и его сильная, и слабая сторона:
# This is valid YAML but probably wrong
ports:
- 80
- 443
name: webserver # This is a key in the SECOND list item, not the mapping!
Приведённый выше код создаёт список, где второй элемент — это отображение {443: null, name: webserver}. Линтер обнаружил бы эту проблему с отступами. Без линтинга такой баг может занять часы на диагностику.
yamllint: стандартный линтер
yamllint — наиболее широко используемый линтер YAML. Он проверяет как синтаксическую корректность, так и стилевое единообразие.
Установка
pip install yamllint
Базовое использование
# Lint a single file
yamllint config.yaml
# Lint a directory
yamllint .
# Lint with a specific config
yamllint -c .yamllint.yml .
Конфигурация
Создайте .yamllint.yml в корне проекта:
extends: default
rules:
line-length:
max: 120
level: warning
indentation:
spaces: 2
indent-sequences: true
truthy:
allowed-values: ['true', 'false', 'yes', 'no']
comments:
require-starting-space: true
min-spaces-from-content: 2
document-start: disable
empty-lines:
max: 1
Описание ключевых правил
| Правило | Назначение | Рекомендуемая настройка |
|---|---|---|
indentation | Единообразие отступов | 2 пробела, без табуляций |
line-length | Ограничение длины строк | 120 символов (предупреждение) |
truthy | Контроль логических значений | Только true/false |
comments | Форматирование комментариев | Пробел после # |
document-start | Требование --- в начале | Отключить (необязательно) |
trailing-spaces | Запрет пробелов в конце строки | Включить |
new-line-at-end-of-file | Единообразное окончание файлов | Включить |
Типичные ошибки, обнаруживаемые линтингом
1. Символы табуляции
YAML запрещает табуляцию для отступов, но редакторы иногда вставляют её:
# ERROR: tab character
server:
port: 8080 # Tab instead of spaces!
2. Непоследовательные отступы
# ERROR: mixing 2 and 4 space indentation
database:
host: localhost
port: 5432 # Wrong: 4 spaces instead of 2
3. Дублирующиеся ключи
# ERROR: duplicate key (second silently overrides first)
server:
port: 8080
host: localhost
port: 9090 # Duplicate! Which port is used?
4. Пробелы в конце строки
Невидимые пробелы в конце строки могут вызывать неожиданное поведение, особенно в многострочных строках. Линтер сразу их обнаруживает.
Быстрая проверка без установки: вставьте YAML в наш YAML Validator.
Интеграция с CI/CD
GitHub Actions
name: YAML Lint
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install yamllint
run: pip install yamllint
- name: Lint YAML files
run: yamllint .
Pre-commit хук
# .pre-commit-config.yaml
repos:
- repo: https://github.com/adrienverge/yamllint
rev: v1.33.0
hooks:
- id: yamllint
args: [-c, .yamllint.yml]
pip install pre-commit
pre-commit install
Теперь YAML автоматически проверяется перед каждым коммитом.
GitLab CI
yaml-lint:
image: python:3.12-slim
script:
- pip install yamllint
- yamllint .
rules:
- changes:
- "**/*.yaml"
- "**/*.yml"
Интеграция с редакторами
Большинство редакторов поддерживают линтинг YAML в реальном времени:
- VS Code: установите расширение «YAML» от Red Hat (использует yamllint)
- Vim/Neovim: используйте ALE или coc-yaml
- JetBrains IDE: встроенная поддержка YAML с настраиваемыми инспекциями
Включите форматирование при сохранении для YAML-файлов, чтобы автоматически исправлять проблемы с пробелами.
Линтинг для конкретных инструментов
Общий линтинг YAML обнаруживает синтаксические ошибки, но линтеры для конкретных инструментов проверяют семантическую корректность:
Kubernetes
# kubeval - validate against K8s schemas
kubeval deployment.yaml
# kubeconform - faster alternative
kubeconform -strict deployment.yaml
Docker Compose
docker compose config --quiet
GitHub Actions
# actionlint - validates workflow syntax
actionlint .github/workflows/*.yml
Ansible
ansible-lint playbook.yml
Для более глубокого понимания правил синтаксиса YAML смотрите наш учебник по синтаксису YAML.
Итоги лучших практик
- Добавьте yamllint в CI — каждое изменение YAML должно проходить линтинг
- Используйте pre-commit хуки — выявляйте ошибки до попадания в репозиторий
- Стандартизируйте отступы в 2 пробела — конвенция DevOps
- Отключите или ограничьте правило truthy — проблема булевых значений
yes/noвызывает реальные баги - Установите разумную длину строки — 120 символов покрывает большинство случаев
- Используйте валидаторы для конкретных инструментов — общий линтинг плюс валидация для K8s/Docker/Actions
- Настройте редактор — обратная связь в реальном времени быстрее, чем сбои в CI
Часто задаваемые вопросы
Что лучше использовать для конфигурационных файлов: YAML или JSON?
YAML предпочтителен для конфигурационных файлов, редактируемых вручную, благодаря читаемости, поддержке комментариев и лаконичному синтаксису. JSON лучше подходит для машинно-генерируемых данных и обмена через API. Подробное сравнение смотрите в нашем руководстве YAML vs JSON.
Как обрабатывать предупреждения и ошибки yamllint?
Настройте критические правила (отступы, синтаксис) как ошибки, блокирующие CI. Установите стилевые правила (длина строки, комментарии) как предупреждения, которые отображаются, но не блокируют. Это обеспечивает баланс между строгостью и продуктивностью разработчиков.
Связанные ресурсы
- YAML Validator — мгновенная онлайн-валидация синтаксиса YAML
- Учебник по синтаксису YAML — изучение YAML с нуля
- YAML для Docker Compose — паттерны YAML для Docker