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

YAMLリンティングのベストプラクティス:デプロイ前にエラーを検出

YAMLファイルのスペース1つの間違いで、本番デプロイメントがダウンする可能性があります。構文エラーで派手に失敗するJSONとは異なり、YAMLは不正なインデントを予期しないデータ構造として黙って解析することがあります。リンティングはこれらの問題が本番に到達する前に検出します。

なぜYAMLをリントするのか?

YAMLの柔軟性は、その強みであり弱点でもあります:

# これは有効なYAMLですが、おそらく間違い
ports:
  - 80
  - 443
  name: webserver  # これはマッピングではなく、2番目のリストアイテムのキー!

上記は、2番目のアイテムがマッピング {443: null, name: webserver} であるリストを作成します。リンターはこのインデントの問題を検出します。リンティングなしでは、この種のバグの診断に何時間もかかることがあります。

yamllint:標準リンター

yamllint は最も広く使用されているYAMLリンターです。構文の有効性とスタイルの一貫性の両方をチェックします。

インストール

pip install yamllint

基本的な使い方

# 単一ファイルのリント
yamllint config.yaml

# ディレクトリのリント
yamllint .

# 特定の設定でリント
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はインデントにタブを禁止していますが、エディターが挿入することがあります:

# エラー:タブ文字
server:
port: 8080  # スペースではなくタブ!

2. 一貫性のないインデント

# エラー:2スペースと4スペースのインデントが混在
database:
  host: localhost
    port: 5432  # 誤り:2スペースではなく4スペース

3. 重複キー

# エラー:重複キー(2番目が最初を黙ってオーバーライド)
server:
  port: 8080
  host: localhost
  port: 9090  # 重複!どのポートが使用される?

4. 末尾のスペース

見えない末尾のスペースは、特にマルチライン文字列で予期しない動作を引き起こすことがあります。リンターはこれらを即座にフラグします。

何もインストールせずにすばやく検証:YAMLをYAMLバリデーターに貼り付けてください。

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:Red Hatの「YAML」拡張機能をインストール(yamllintを使用)
  • Vim/Neovim:ALEまたはcoc-yamlを使用
  • JetBrains IDE:設定可能なインスペクション付きの組み込みYAMLサポート

YAMLファイルの保存時フォーマットを有効にして、空白の問題を自動修正しましょう。

ツール固有のリンティング

汎用YAMLリンティングは構文エラーを検出しますが、ツール固有のリンターはセマンティックな正確性を検証します:

Kubernetes

# kubeval - K8sスキーマに対する検証
kubeval deployment.yaml

# kubeconform - より高速な代替
kubeconform -strict deployment.yaml

Docker Compose

docker compose config --quiet

GitHub Actions

# actionlint - ワークフロー構文を検証
actionlint .github/workflows/*.yml

Ansible

ansible-lint playbook.yml

YAML構文ルールの詳細については、YAML構文チュートリアルをご覧ください。

ベストプラクティスまとめ

  1. CIにyamllintを追加 — すべてのYAML変更はリンティングを通過すべき
  2. Pre-commitフックを使用 — リポジトリに到達する前にエラーを検出
  3. 2スペースインデントに標準化 — DevOpsの慣例
  4. truthyルールを無効にするか制限するyes/no の真偽値問題は実際のバグを引き起こす
  5. 合理的な行の長さを設定 — 120文字でほとんどのケースをカバー
  6. ツール固有のバリデーターを使用 — 汎用リンティング + K8s/Docker/Actions固有の検証
  7. エディターを設定 — リアルタイムフィードバックはCIの失敗より速い

FAQ

設定ファイルには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