😊

GitHub Actionsを使ってdbtのモデルpush時に自動でSQL Fluffを実行する

2024/04/24に公開

GitHub Actionsとは

GitHub Actionsは、開発を行う際のビルドやテスト、デプロイを自動化できるCI/CD(継続的インテグレーション、継続的デプロイ)のためのプラットフォームです。

簡単に言えば開発の際に必要なフローをワークフローで自動的に実行することで、開発のスピードを上げてくれるツールです。

https://docs.github.com/ja/actions/learn-github-actions/understanding-github-actions

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