
dbt Projects on SnowflakeのスキーマオブジェクトへのデプロイをGitHub Actions経由でやってみた
さがらです。
dbt Projects on SnowflakeのスキーマオブジェクトへのデプロイをGitHub Actions経由でやってみたので、その内容について本記事でまとめてみます。
※2025/9/25時点、dbt Projects on Snowflakeはプレビュー機能のためご注意ください。特にdbt deps
周りの挙動は今後改善される可能性も高いと予想していますので、都度最新情報を確認するようにしてください。
行うこと
以下の記事に記載のある処理フローを参考に、GitHub Actionsのフローを作ってみます。(この記事については、スキーマオブジェクトへのデプロイの前にdbt deps
を実行してdbt_packagesを生成しておく必要があること等含め、大変参考にしております。ありがとうございます!)
1.mainにマージされてdbtの階層のファイルが更新されているのをトリガーにワークフローが起動する
2.gitチェックアウト
3.dbtのインストール
4.dbt depsの実行
5.Snowflake CLIのインストール
6.snow dbt deployコマンドの実行
前提条件
WorkspaceでGitHubと連携し、適当なmodelファイルも作成し、dbtコマンドが実行できる状態まで設定しておきます。
今回は、以下の記事の内容を一通り行った状態からスタートします。
Snowflake CLIをGitHub Actionsで実行するためのファイルをリポジトリに作成
Snowflake CLIをGitHub Actionsで実行するためのtomlファイルをリポジトリに作成しておきます。(このSnowflake CLIをGitHub Actionsで動かす方法については、以下の記事がとても参考になります。)
Workspaceで関連するdbt Projectを開き、ルート階層にconfig/config.toml
ファイルを作成します。
このconfig.toml
の内容ですが、下記のように記述します。接続に必要な各パラメータは環境変数で渡すことができるため、GitHub Actionsのenvから後で渡すことにします。
default_connection_name = "workflow"
[connections.workflow]
GitHubのリポジトリでSnowflake CLIの認証に必要な情報をsecretとして追加
GitHub ActionsからSnowflake CLIを使ってキーペア認証をするため、必要な情報をsecretとして追加します。
下図のように、リポジトリのSettings
⇛Secrets and variables
⇛Actions
から3つのsecretを定義しておきます。
SNOWFLAKE_ACCOUNT
:組織名_アカウント名
の形式でSnowflakeのアカウントを記載SNOWFLAKE_USER
:認証に用いるSnowflakeのユーザー名を記載SNOWFLAKE_PRIVATEKEY
:-----BEGIN PRIVATE KEY-----
から-----END PRIVATE KEY-----
まで含めた、秘密鍵の内容を記載
GitHub Actionsのワークフローファイルを作成
Workspaceで関連するdbt Projectを開き、ルート階層に.github/workflows/deploy_dbt_project.yml
ファイルを作成します。(ファイル名は何でも良いです。)
このdeploy_dbt_project.yml
の中身ですが、以下のように記述します。ポイントは以下2点です。
dbt-snowflake
をインストールしてdbt deps
を行っていること- これを行わないと、外部のパッケージをインストールせずにdbt projectオブジェクトを作成することになってしまいます。
- 参考までに、dbt Projects on Snowflakeで使用する
profiles.yml
ではアカウント情報など記載がありませんが、dbt deps
ではSnowflakeへの接続が行われないため問題なしです。
snow dbt deploy
コマンドでは--force
オプションを付けることで、既存のdbt projectオブジェクトがあっても上書き可能に
name: Deploy dbt Project to Snowflake
on:
push:
branches:
- main
workflow_dispatch:
jobs:
deploy-to-snowflake:
runs-on: ubuntu-latest
env:
SNOWFLAKE_CONNECTIONS_WORKFLOW_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
SNOWFLAKE_CONNECTIONS_WORKFLOW_USER: ${{ secrets.SNOWFLAKE_USER }}
SNOWFLAKE_CONNECTIONS_WORKFLOW_PRIVATE_KEY_RAW: ${{ secrets.SNOWFLAKE_PRIVATEKEY }}
SNOWFLAKE_CONNECTIONS_WORKFLOW_WAREHOUSE: "sagara_dbt_wh"
SNOWFLAKE_CONNECTIONS_WORKFLOW_ROLE: "sagara_admin_role"
SNOWFLAKE_CONNECTIONS_WORKFLOW_AUTHENTICATOR: "SNOWFLAKE_JWT"
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dbt-snowflake # dbt Projects on Snowflakeはまだ1.9のため、合わせている
run: pip install "dbt-snowflake~=1.9.0"
- name: Install Snowflake CLI
uses: Snowflake-Labs/snowflake-cli-action@v1.5
with:
cli-version: "latest"
default-config-file-path: 'config/config.toml'
- name: Run dbt deps
run: dbt deps --project-dir .
- name: Deploy to Snowflake
run: |
snow dbt deploy SAGARA_DBT_DEMO_DB.PRODUCTION.DBT_DEPLOYMENT_PROD \
--force \
--source . \
--profiles-dir . \
--connection workflow \
--database SAGARA_DBT_DEMO_DB \
--schema PRODUCTION
実際に動かしてみた
下図のようにdbt_utils
をpackages.yml
に追加して、dbt_utils
を用いたテストも追加して、挙動を確認してみます。
※余談ですが、Workspaceからdbt deps
を実行する際は、External Network Accessの指定が必要です。(詳細はこちらの記事もご覧ください。)
コミット・マージしたときの挙動
設定したGitHub Actionsのワークフローが実行されます。
すべての実行結果は記載しませんが、snow dbt deploy
のログは下図のようになっています。Temporary Stageが作られてdbt関係のファイルを丸ごとコピーし、コピー先のステージ上のファイルを元にdbt Projectのオブジェクトを作成していることがわかります。
この後でスキーマにデプロイされたdbt Projectのオブジェクトを確認すると、下図のように表示されます。from
のあとを見るとTemporary Stageから作られていることがわかりますね。
実際にデプロイしたdbt projectを動かしてみる
execute dbt
コマンドで、実際にデプロイしたdbt projectを動かしてみます。
execute dbt project sagara_dbt_demo_db.production.dbt_deployment_prod args='build --target prod';
ログを見ると、ちゃんとdbt_utils
のテストが実行されていました。これにより、GitHub Actionsを介してdbt deps
を用いた外部パッケージのインストール含めて、無事にスキーマオブジェクトへのデプロイができていることがわかりました!
最後に
dbt Projects on SnowflakeのスキーマオブジェクトへのデプロイをGitHub Actions経由でやってみました。
開発するたびに手動でスキーマオブジェクトへデプロイする運用は辛いと思いますので、本記事のようにGitHub Actionsを使ってデプロイを自動化していきましょう!