👺

GitHubActionsでプルリクエスト時にSQLのリントチェックを実行するCIを実現する(SQLFluffを利用)

2021/05/17に公開

はじめに

SQLFluffを利用し、プルリクエスト作成時にGitHubActionsを利用することでSQLのリントチェック自動でできるような仕組みを作ることが出来ます。

GitHubActionsの設定をする

以下のアクション用の定義を該当のレポジトリに設定を行う。

.github/workflows/lint_models.yml
name: Lint Models

on: [pull_request]

env: 
  TARGET_BRANCH: ${{ github.base_ref }}

jobs:
  lint-models:
    runs-on: ubuntu-latest
    steps:
      - uses: "actions/checkout@v2"
      - uses: "actions/setup-python@v2"
        with:
            python-version: "3.8"
      - name: Install SQLFluff
        run: "pip install sqlfluff==0.5.3"
      - name: 'Fetch'
        run: git fetch --depth 1 origin ${TARGET_BRANCH}
      - name: 'Lint models'
        run: |
          for file in $(git diff origin/${TARGET_BRANCH} HEAD --diff-filter=AM --name-only -- "*.sql") ; do
            sqlfluff lint ${file} --rules L001,L002,L004,L006,L010,L019 --dialect bigquery
          done

dialectオプションでどのDBを想定したSyntaxにするのか設定するので注意

% sqlfluff dialects
==== sqlfluff - dialects ====
ansi:                 ansi dialect [inherits from 'nothing']
bigquery:            bigquery dialect [inherits from 'ansi']
exasol:                exasol dialect [inherits from 'ansi']
exasol_fs:        exasol_fs dialect [inherits from 'exasol']
mysql:                  mysql dialect [inherits from 'ansi']
postgres:            postgres dialect [inherits from 'ansi']
snowflake:      snowflake dialect [inherits from 'postgres']
teradata:            teradata dialect [inherits from 'ansi']

ルールのカスタマイズ

実行しているリントチェックのルール等のカスタマイズは以下の記事を参考にしてみてください。
SQLFluffを使ってSQLをリント(Lint)する

Discussion