Open14

【dbt】yamlfix

YuichiYuichi

yamlfix のインストール

pip install yamlfix

To fix individual files:

yamlfix file.yaml file2.yml
YuichiYuichi

🛠️ yamlfix の概要

YAML ファイルを整形(フォーマット)して、読みやすく・一貫性のあるスタイルに修正してくれる CLI ツールです。


🧾 使い方(基本)

yamlfix [OPTIONS] FILES...
  • FILES...:整形したいファイルやディレクトリを指定します。
  • ディレクトリを指定すると、その中の YAML ファイルを再帰的に整形します。
  • -(ハイフン)を指定すると、標準入力(stdin)から読み込みます(この場合、他のファイルは指定できません)。

🧰 オプション一覧(日本語訳付き)

オプション 説明
--version バージョン情報を表示して終了します。
-v, --verbose 詳細なログ出力を有効にします。
--check 修正が必要かをチェックするだけで、ファイルは書き換えません(CIなどで便利)。
-c, --config-file カスタム設定ファイルのパスを指定します。
--env-prefix 環境変数から設定を読み込む際のプレフィックスを指定します。
-e, --exclude この glob パターンに一致するファイルは無視されます。
-i, --include このパターンに一致するファイルを整形対象に含めます(デフォルトは *.yaml*.yml)。
--help ヘルプを表示して終了します。

💡 よく使うコマンド例

1. ディレクトリ全体を整形:

yamlfix ./configs/

2. 整形が必要かだけ確認(CI向け):

yamlfix --check ./configs/

3. 詳細ログ付きで整形:

yamlfix -v ./example.yaml

4. 特定のファイルを除外:

yamlfix -e "*/generated/*.yml" ./configs/
YuichiYuichi
        // yamlfix用の設定
        "emeraldwalk.runonsave": {
          "commands": [
              {
                  "match": "\\.ya?ml$",
                  "cmd": "yamlfix ${file}"
              }
          ]
        }
      "extensions": [
        // yamlfix用の設定
        "emeraldwalk.runonsave",
      ]
YuichiYuichi
name: Check Format
run-name: Run by @${{ github.actor }} - ${{ github.workflow }}
on:
  pull_request:  # PRが作成または更新された際に実行
jobs:
  static:
    name: check_format
    runs-on: ubuntu-latest
    steps:
      - name: Check out Repo
        uses: actions/checkout@v4  # リポジトリのコードをチェックアウト
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: 3.12.4  # Python をセットアップ
          cache: pip  # caching pip dependencies
      - name: Install formatters
        run: |
          pip install shandy-sqlfmt[jinjafmt]==0.26.0
          pip install yamlfix==1.17.0
      - name: Get Changed Files
        id: changed-files
        uses: tj-actions/changed-files@v45  # 変更されたファイルの一覧を取得
      - name: Run sqlfmt
        # sqlfmt に渡す変更されたファイルのリストをフィルター処理する必要はありません
        # 変更されたファイルが空でもエラーにはならない
        run: sqlfmt --diff ${{ steps.changed-files.outputs.all_changed_files }}
        # 変更のあったファイルに対して sqlfmt を実行し、フォーマットの差分を表示
      - name: Run yamlfix
        # デフォルトは *.yaml と *.ymlのみ読み込むのでフィルターの必要なし
        # --verbose 詳細なログ出力を有効
        run: |-
          files=$(echo "${{ steps.changed-files.outputs.all_changed_files }}" | tr ' ' '\n' | grep -E '\.ya?ml$' || true)
          if [ -n "$files" ]; then
            echo "$files" | xargs -r yamlfix --verbose --check
          else
            echo "No YAML files to check."
          fi

YuichiYuichi

YAML, Markdown, and JSON — Format with Prettier

https://docs.getdbt.com/docs/cloud/dbt-cloud-ide/lint-format
https://qiita.com/katu_/items/db16c9da044850910b29
https://prettier.io/docs/ci

name: Check Prettier formatting

on:
  pull_request:
  push:

permissions: {}

jobs:
  prettier:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'yarn'  # Yarn の依存関係をキャッシュ

      - name: Install dependencies
        run: yarn install --frozen-lockfile

      - name: Run Prettier check
        run: yarn prettier . --check

YuichiYuichi
name: Check Format
run-name: Run by @${{ github.actor }} - ${{ github.workflow }}

on:
  pull_request: # PRが作成または更新された際に実行

jobs:
  check_format:
    runs-on: ubuntu-latest

    steps:
      - name: Check out Repo
        uses: actions/checkout@v4 # リポジトリのコードをチェックアウト

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: 3.12.4 # Python をセットアップ
          cache: pip # caching pip dependencies

      - name: Install formatters
        run: pip install shandy-sqlfmt[jinjafmt]==0.26.0

      - name: Get Changed Files
        id: changed-files
        uses: tj-actions/changed-files@v45 # 変更されたファイルの一覧を取得

      - name: 🔍 Run sqlfmt check
        # sqlfmt に渡す変更されたファイルのリストをフィルター処理する必要はありません
        # 変更されたファイルが空でもエラーにはならない
        run: sqlfmt --diff ${{ steps.changed-files.outputs.all_changed_files }}
        # 変更のあったファイルに対して sqlfmt を実行し、フォーマットの差分を表示

      - name: 🔍 Run Prettier check
        run: |-
          files=$(echo "${{ steps.changed-files.outputs.all_changed_files }}" | tr ' ' '\n' | grep -E '\.ya?ml$' || true)
          if [ -n "$files" ]; then
            echo "$files" | xargs -r npx prettier --check
          else
            echo "No YAML files to check."
          fi

YuichiYuichi
        // 全体ではフォーマッタを指定しない(言語ごとに明示)
        "editor.defaultFormatter": null,

        // 保存時に自動整形を有効
        "editor.formatOnSave": true,

        // sqlfmt
        "[jinja-sql]": {
          "editor.tabSize": 4,
          "editor.insertSpaces": true,
          "editor.defaultFormatter": "innoverio.vscode-dbt-power-user"
        },

        // Prettier
        // https://docs.getdbt.com/docs/cloud/dbt-cloud-ide/lint-format
        // Markdown、JSON — Prettierでフォーマットします。
        "[json]": {
          "editor.defaultFormatter": "esbenp.prettier-vscode"
        },
        "[markdown]": {
          "editor.defaultFormatter": "esbenp.prettier-vscode"
        },
        "[yaml]": {
          "editor.defaultFormatter": "esbenp.prettier-vscode"
        },

        // Python は Black を使う
        // https://docs.getdbt.com/docs/cloud/dbt-cloud-ide/lint-format
        "[python]": {
          "editor.defaultFormatter": "ms-python.black-formatter"
        },
YuichiYuichi

ファイルフォーマット担保機能の導入優先度を判断するには、**「どのタイミングでフォーマットが保証されるか」「どれだけ自動化・安心できるか」**の観点が重要です。以下に優先度順の一覧をまとめます:


🔝 優先度の高い順

優先度 方法 特徴
🥇 高 pre-commit フック ローカルのコミット時に強制チェック。開発者がCIエラー前に気づける。
🥈 高 GitHub Actions (CI) 最終的な品質保証として必須。マージ前のチェックに有効。
🥉 中 VSCode の保存時フォーマット 開発者のIDEに依存。習慣に左右されやすい。
🟨 低〜中 手動整形(lint 手動実行など) 忘れやすく、運用コストが高い。属人化リスクもあり。

💡 補足

  • VSCode の保存時フォーマットだけでは、意図せず未整形のコードがコミットされる恐れがあります(特にペアプロやレビュー対応時など)。
  • CIだけに頼る場合、コミット→CI失敗→修正→再コミットと手間が増えるため、pre-commitはかなりコスパの良い自動化手段です。

✅ 結論

  • チーム開発なら最低でも CI + pre-commit を導入すべき
  • 保存時フォーマットや手動整形は補助的手段