alltools.one
YAML
2025-06-28
7 min
alltools.one Team
YAMLLintingCI/CDDevOpsConfiguration

Лучшие практики линтинга 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.

Итоги лучших практик

  1. Добавьте yamllint в CI — каждое изменение YAML должно проходить линтинг
  2. Используйте pre-commit хуки — выявляйте ошибки до попадания в репозиторий
  3. Стандартизируйте отступы в 2 пробела — конвенция DevOps
  4. Отключите или ограничьте правило truthy — проблема булевых значений yes/no вызывает реальные баги
  5. Установите разумную длину строки — 120 символов покрывает большинство случаев
  6. Используйте валидаторы для конкретных инструментов — общий линтинг плюс валидация для K8s/Docker/Actions
  7. Настройте редактор — обратная связь в реальном времени быстрее, чем сбои в CI

Часто задаваемые вопросы

Что лучше использовать для конфигурационных файлов: YAML или JSON?

YAML предпочтителен для конфигурационных файлов, редактируемых вручную, благодаря читаемости, поддержке комментариев и лаконичному синтаксису. JSON лучше подходит для машинно-генерируемых данных и обмена через API. Подробное сравнение смотрите в нашем руководстве YAML vs JSON.

Как обрабатывать предупреждения и ошибки yamllint?

Настройте критические правила (отступы, синтаксис) как ошибки, блокирующие CI. Установите стилевые правила (длина строки, комментарии) как предупреждения, которые отображаются, но не блокируют. Это обеспечивает баланс между строгостью и продуктивностью разработчиков.

Связанные ресурсы

Published on 2025-06-28
YAML Linting Best Practices: Catch Errors Before Deploy | alltools.one