🌊

dbt-osmosisのPre-commitで、スリムなYAML自動更新を実現する

2023/05/29に公開

dbt-osmosisというdbtユーザー向けのPythonライブラリについての記事です。初めての方は先にこちらの記事をご覧になってから戻って来ると理解が深まると思います。
https://www.yasuhisay.info/entry/2023/04/08/151748

さて、少し前のバージョンアップでdbt-osmosisにPre-commitが新たに実装されました。
(Pre-commitとは、以下の記事で紹介されている通り、「コミット直前に自動的にファイルを評価し、整形してくれるツール」です。
https://dev.classmethod.jp/articles/introduce-pre-commit/

dbt-osmosisにおいては、git commitするとdbt-osmosis yaml refactorがコミット対象のモデルに対してのみ走るという挙動をします。

...ここがポイントで、基本的にCI/CDでyaml refactorを実行すると全モデル対象となるため時間がかかります。待てません。fqnオプションで凌ぐしか基本ないかなと思いますが、それでも物足りなさがありました。
しかしPre-commitならばローカルマシン上で変更のあったモデルに対してのみ実行されるため、時短になります。ここがメリットかなと思います。

手順は簡単です。

  1. pre-commitをインストール
  2. 設定ファイルを書く
  3. リポジトリに読み込ませる

1と3は前述の記事をご覧いただければ問題なくいけると思いますので、2についてのみサンプルを紹介します。

.pre-commit-config.yaml
repos:
  - repo: https://github.com/z3z1ma/dbt-osmosis # このままでOK
    rev: v0.11.19 # dbt-osmosisのバージョンを指定する
    hooks:
      - id: dbt-osmosis # 指定がなければこのままでOK
        files: ^dbt/models/ # モデルのパス(左記の例では ./dbt/models 以下のモデルに変更があった場合のみ検知する)
        # dbt-osmosis yaml refactor コマンドに添えるオプションを渡す
        args: ['--target=dev', '--project-dir=./dbt', '--profiles-dir=./dbt'] 
        additional_dependencies: [dbt-bigquery] # dbtアダプタを指定

これを置けばOKです。ただ注意点として、'--force-inheritance'オプションをつけるとFailed扱いとなりコミットできませんでした(私の環境特有かは謎)。

そしてこのPre-commitの他にも

stateを使った差分実行

pip install時のキャッシュ

あたりを組み合わせることで、PR時のCI/CDジョブ待機時間が半分以下に減り、より高速にイテレーションを回す体制が整いました。めでたし。

GitHubで編集を提案

Discussion