Open14
【dbt】yamlfix

yamlフォーマットチェック
dbtを開発してると、yamlをそれなりに書くことになるのですが、これも色んな書き方が発生しがちで、収集つかなくなるので、フォーマットするのがおすすめです。

Tasks
+ Run on Save
拡張で保存時に自動実行
方法:VSCode の 1. VSCode 拡張「Run on Save」をインストール
- Marketplace:
emeraldwalk.runonsave
.vscode/settings.json
に保存時実行を追加
3. "emeraldwalk.runonsave": {
"commands": [
{
"match": "\\.ya?ml$",
"cmd": "yamlfix ${file}"
}
]
}

yamlfix
のインストール
pip install yamlfix
To fix individual files:
yamlfix file.yaml file2.yml

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/

yamlfix --verbose --check ${{ steps.changed-files.outputs.all_changed_files }}

// yamlfix用の設定
"emeraldwalk.runonsave": {
"commands": [
{
"match": "\\.ya?ml$",
"cmd": "yamlfix ${file}"
}
]
}
"extensions": [
// yamlfix用の設定
"emeraldwalk.runonsave",
]

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

YAML, Markdown, and JSON — Format with Prettier
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

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

// 全体ではフォーマッタを指定しない(言語ごとに明示)
"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"
},

ファイルフォーマット担保機能の導入優先度を判断するには、**「どのタイミングでフォーマットが保証されるか」と「どれだけ自動化・安心できるか」**の観点が重要です。以下に優先度順の一覧をまとめます:
🔝 優先度の高い順
優先度 | 方法 | 特徴 |
---|---|---|
🥇 高 | pre-commit フック | ローカルのコミット時に強制チェック。開発者がCIエラー前に気づける。 |
🥈 高 | GitHub Actions (CI) | 最終的な品質保証として必須。マージ前のチェックに有効。 |
🥉 中 | VSCode の保存時フォーマット | 開発者のIDEに依存。習慣に左右されやすい。 |
🟨 低〜中 | 手動整形(lint 手動実行など) | 忘れやすく、運用コストが高い。属人化リスクもあり。 |
💡 補足
- VSCode の保存時フォーマットだけでは、意図せず未整形のコードがコミットされる恐れがあります(特にペアプロやレビュー対応時など)。
- CIだけに頼る場合、コミット→CI失敗→修正→再コミットと手間が増えるため、pre-commitはかなりコスパの良い自動化手段です。
✅ 結論
- チーム開発なら最低でも CI + pre-commit を導入すべき
- 保存時フォーマットや手動整形は補助的手段