hene

hene.dev

デフォルトブランチから変更したファイルに対して Lint を実行

デフォルトブランチから変更したファイルに対して Lint を実行

やりたいこと

GitHub でプルリクエストを作った際に、デフォルトブランチから変更した SQL ファイルを取得して GitHub ActionsLint を実行したい。

対象のファイル

  • origin/${TARGET_BRANCH} から追加・変更したファイル
  • 拡張子を指定
  • ディレクトリを指定・除外

どういったコマンドを実行するか

Lint を実行

  • sqlfluff lint: Lint を実行
    • --disable-progress-bar: プログレスバーを表示しない
$ sqlfluff lint --disable-progress-bar ${Lint を実行したいファイルを指定}

Lint を実行したいファイルの取得

origin/${TARGET_BRANCH} から追加・変更した特定のディレクトリ配下のファイル名を取得。

  • git diff: ファイルの変更を表示
    • origin/${TARGET_BRANCH}: 任意のブランチから追加・変更したファイルを取得
    • --diff-filter=d: 削除したファイルを除外
    • --name-only: ファイル名のみ取得
    • -- ':(exclude,top)models/staging/hogehoge/*': models/staging/hogehoge/ 配下のファイルを除外
  • grep -e '^models/.*\.sql' -e '^analyses/.*\.sql': models/analyses/ のディレクトリの sql ファイルに絞り込む
$ git diff origin/${TARGET_BRANCH} \
       --diff-filter=d \
       --name-only \
       -- ':(exclude,top)models/staging/hogehoge/*' | \
       grep -e '^models/.*\.sql' -e '^analyses/.*\.sql'

pathspec で1つのディレクトリ配下のファイルに絞り込むことはできたが、2つのディレクトリ配下を OR 条件で絞り込むことはできなかった。

  • -- ':(top)models/*.sql': models/ 配下のファイルに絞り込む
$ git diff origin/${TARGET_BRANCH} \
       --diff-filter=d \
       --name-only \
       -- ':(exclude,top)models/staging/hogehoge/*' ':(top)models/**.sql'

最終的に実行するコマンド

特定のファイルに対してのみ、Lint を実行。

  • origin/${TARGET_BRANCH} から追加・変更したファイル
  • 拡張子を指定
  • ディレクトリを指定・除外
$ sqlfluff lint \
      --disable-progress-bar \
      $(git diff origin/${TARGET_BRANCH} \
              --diff-filter=d \
              --name-only \
              -- ':(exclude,top)models/staging/hogehoge/*' | \
              grep -e '^models/.*\.sql' -e '^analyses/.*\.sql')

まとめ

上記コマンドを GitHub Actions で実行することができた。 git コマンドで特定のディレクトリを除外する方法を学べた。

参考

関連記事