GitHub Actionsを使ってdbtのモデルpush時に自動でSQL Fluffを実行する
GitHub Actionsとは
GitHub Actionsは、開発を行う際のビルドやテスト、デプロイを自動化できるCI/CD(継続的インテグレーション、継続的デプロイ)のためのプラットフォームです。
簡単に言えば開発の際に必要なフローをワークフローで自動的に実行することで、開発のスピードを上げてくれるツールです。
dbtのモデルpush時にワークフローを実行する
今回はdbtのモデルに変更を行った際、自動的にSQL FluffによるSQLコードの整形を行うような形にフローを組みたいと思います。
1.下準備
まずはGitHub Actionsのワークフローを作成するためのディレクトリを作成します。
.github/workflows
自身のリポジトリ上に上記のディレクトリを作成しましょう。
GitHub Actionsのワークフローはyamlによって定義ができます。
以降はこのディレクトリにワークフローを定義したyamlファイルを作成していきます。
次にリポジトリの設定を行います
リポジトリのデフォルト設定では、GitHub Actionsにはリポジトリへの書き込み権限がありません
従って、リポジトリの設定を以下のように変更しましょう
1.GitHubのリポジトリページにアクセスし、"Settings"タブを開く
2."Actions"の設定を開く
3.左側のメニューから"Actions"を選択し、"General"タブを開く
4."Workflow permissions"セクションまでスクロール
5."Read and write permissions"オプションを選択
6."Save"ボタンをクリックして変更を保存
2.ワークフロー
まずはワークフロー処理の全体です
name: fix changed dbt models on push
on:
push:
branches-ignore:
- 'main'
jobs:
fix_changed_models:
name: Run SQLFluff fixer on changed models
runs-on: ubuntu-latest
steps:
- uses: "actions/checkout@v3"
- uses: "actions/setup-python@v4"
with:
python-version: "3.9"
- name: Install SQLFluff
run: "python -m pip install sqlfluff"
- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@v35
- name: Fix changed models
run: |
for file in ${{ steps.changed-files.outputs.all_changed_files }}; do
if [[ $file == models/**/*.sql ]]; then
echo "Fixing $file"
sqlfluff fix "$file" --dialect bigquery --config ${{ github.workspace }}/.sqlfluff
fi
done
- name: Commit fixed files
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: "Fix SQL style issues with SQLFluff"
branch: ${{ github.head_ref }}
name: fix changed dbt models on push
on:
push:
branches-ignore:
- 'main'
まずは名前を設定します
次にonセクションでは、どのイベントでワークフローを実行するかを指定しています。
この場合、'main' ブランチを除くすべてのブランチへのプッシュイベントでワークフローが実行されます。
jobs:
fix_changed_models:
name: Run SQLFluff fixer on changed models
runs-on: ubuntu-latest
steps:
- uses: "actions/checkout@v3"
- uses: "actions/setup-python@v4"
with:
python-version: "3.9"
- name: Install SQLFluff
run: "python -m pip install sqlfluff"
jobs セクションでは、実行するジョブを定義しています。
ジョブの実行環境として "ubuntu-latest" を指定しています。
steps セクションでは、ジョブ内で実行するステップを定義しています。
最初のステップでは、リポジトリをチェックアウトするために "actions/checkout@v3" を使用しています。
チェックアウトはワークフローがリポジトリのコードにアクセスし、変更を加え、その変更をリポジトリにプッシュするために行います
次のステップでは、Python 3.9をセットアップするために "actions/setup-python@v4" を使用しています。
最後にSQLFluffをインストールしています
- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@v35
- name: Fix changed models
run: |
for file in ${{ steps.changed-files.outputs.all_changed_files }}; do
if [[ $file == models/**/*.sql ]]; then
echo "Fixing $file"
sqlfluff fix "$file" --dialect bigquery --config ${{ github.workspace }}/.sqlfluff
fi
done
次に変更があり、かつ拡張子が.sql のファイルのみSQL Fluffによるコードの整形を実行します。
Get changed filesのステップではtj-actions/changed-files@v35を利用し、変更されたファイルの一覧を取得しています
続いてFix changed models のステップでは、上記ステップで取得したファイルの一覧から.sqlの拡張子を持つファイルのみに対してSQL Fluff Fixコマンドを実行しています
その際に、
--dialect bigquery オプションでBigQueryの方言を指定し、
--config オプションで、リポジトリのルートディレクトリにある .sqlfluff 設定ファイルを指定しています
その際、${{ github.workspace }}と指定することでリポジトリ内のルートディレクトリを指定することができます
- name: Commit fixed files
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: "Fix SQL style issues with SQLFluff"
branch: ${{ github.head_ref }}
最後に変更されたファイルをコミットします
Discussion