dbt Projects on Snowflake 上での CI/CD 統合¶
dbtプロジェクトオブジェクトは、Snowflake CLI コマンドを使用してデプロイと実行を CI/CD ワークフローに統合するサポートをします。
このトピックでは、 GitHub アクションを使用して、プルリクエストを開いたり、メインにマージしたりするたびに dbt Projects on Snowflake を自動的にテストしデプロイする方法について説明します。
継続的統合( CI )は、各プルリクエストでdevスキーマに対してdbtプロジェクトを実行します。つまり、誰かがコードリポジトリのプルリクエストを開いたり更新したりするたびに、新しいコードでテストとビルドが自動的に実行されます。これにより、マージする前に問題を早期に発見できます。
継続的なデプロイ( CD )は、コミットがマージされた後、Snowflakeのdbtプロジェクトオブジェクトを最新の状態に保ちます。言い換えると、コードがブランチにマージされるたびに、更新されたコードを本番環境に自動的にデプロイします。これにより、本番環境を最新かつ確実、再現性のある状態に保つことができます。
CI/CD は、手動によるエラーが発生しやすいデプロイを回避し、変更をマージする前に検証されるようにし、一貫性のある再現可能なデプロイとバージョン管理を可能にします。
dbtプロジェクト用 CI/CD を使用する理由¶
dbtプロジェクトは、コード内のすべてのデータ変換を定義するため、頻繁な更新によりエラーが発生しやすくなります。 CI は、マージする前に別の開発環境ですべての変更をテストすることで、これらの問題を早期に発見します。
変更がマージされた後、 CD は、Snowflake本番環境の公式dbtプロジェクトオブジェクトを自動的に更新します。これにより、手作業によるステップが不要になり、リスクが軽減され、すべてをバージョン管理し、信頼性の高い共同ワークフローがサポートされます。
dbtプロジェクトでの CI/CD を使用するための高レベルの前提条件¶
Gitリポジトリに保存されているdbtプロジェクト(たとえば GitHub )。
Snowflakeでのdbtプロジェクトのアクセス制御 で説明されている権限を持つSnowflakeアカウントとユーザー。
以下のオブジェクトを作成および編集する権限、またはユーザーに代わって各オブジェクトを作成できる管理者にアクセスする権限。
Snowflakeアカウント、データベースとスキーマの値、 CI および CD ジョブを定義するワークフローファイル(例:
.github/workflows/…)を保持するための GitHub リポジトリ環境変数とシークレット。GitHub と通信するためのSnowflakeサービスアカウント
Snowflakeの開発環境( CI の場合)と本番環境( CD の場合)の分離(例: 環境ごとに個別のデータベースまたはスキーマ)。
CI/CD 実行者(例: GitHub アクション)を許可して、 OIDC または PAT などSnowflakeに接続します。詳細については、 CI/CD ワークフローでアクションを安全に構成します。 をご参照ください。
コードリポジトリで、開発および本番ターゲットを指すように構成された
profiles.ymlファイル(例: データベース/スキーマ、ウェアハウス)。GitプロバイダーからSnowflakeへのインバウンドアクセスを許可するネットワークポリシー。
CI/CD ワークフローの概要¶
以下のステップは、 CI/CD を使った典型的なワークフローの概要です。詳細なチュートリアルについては、 チュートリアル:dbt Projects on Snowflake で CI/CD 統合の設定 をご参照ください。
開発者は、ブランチ内のdbtコード(モデル、テストなど)を記述または変更します。
開発者はプルリクエストを開きます。
CI が作動します: dbtプロジェクトオブジェクトのテスターインスタンスが、Snowflake開発環境にデプロイされ、Snowflake開発環境は
dbt runおよびdbt testコマンドを実行します。操作が失敗すると、プルリクエストは失敗します。開発者は修正し、更新してから、再実行する必要があります。
すべての操作が合格すると、プルリクエストはマージの対象となります。
プルリクエストはメインにマージされます。
CD が作動します: Snowflakeの本番dbtプロジェクトオブジェクトが最新のコードを反映するように更新されます。
オプションで、自動スケジューリング(例: Snowflakeタスクを介して)をデプロイできるため、データパイプラインは手動の介入なしにスケジュールに従って実行されます。