
dbt platformのCI ジョブをGitHub Actionsを用いて実行してみた
かわばたです。
dbt platform には、PR をトリガーとして CI ジョブを自動実行する機能があります。
通常は GitHub とのネイティブ統合により、PR を作成するだけで CI ジョブが自動的にトリガーされます。
しかし、ネットワーク制約などでネイティブ統合が利用できないケースもあります。
今回は GitHub Actions を使い、dbt platform の Administrative API(v2)を経由して CI ジョブをトリガーする方法を検証しました。
【公式ドキュメント】
dbt platform CI jobs
dbt platform Administrative API(v2)- Trigger Job Run
対象読者
- dbt platform のネイティブ Git 統合が利用できない環境の方
- GitHub Actions から dbt platform の CI ジョブをトリガーしたい方
- CI ジョブの API トリガーで必要なパラメータを知りたい方
検証環境
- dbt platform Enterprise 版
- Latestバージョン
- Snowflake トライアルアカウント Enterprise 版
- GitHub Actions
前提知識: dbt platform のジョブ種別
dbt platform のジョブには大きく3種類あります。
| 項目 | CI ジョブ | Merge ジョブ | Deploy ジョブ |
|---|---|---|---|
| トリガー | PR 作成・更新時 | PR マージ時 | スケジュール / 手動 / API / 他ジョブ完了時 |
| デフォルトコマンド | dbt build --select state:modified+ |
dbt build --select state:modified+ |
dbt build |
| 対象モデル | 変更モデル中心(state-aware) | 変更モデル中心(デフォルト設定時) | 全体ビルドが基本だがコマンド変更可 |
| Deferral | あり(比較対象環境を指定) | あり(デフォルトで作成元環境と比較) | 利用可(デフォルトは No deferral) |
| スキーマ | dbt_cloud_pr_ プレフィックスを持つ一時スキーマ |
実行環境のターゲットスキーマ | 実行環境のターゲットスキーマ |
| Run slot 消費 | しない | する | する |
| 主用途 | PR のコード検証(CI) | マージ後の自動デプロイ(CD) | 定期的な本番ビルド |
CI ジョブは dbt build --select state:modified+ をデフォルトで実行し、変更されたモデルとその下流のみをビルド・テストします。Run slot を消費しないため、本番の Deploy ジョブをブロックしません。
Merge ジョブは PR がマージされたタイミングで自動的にトリガーされ、継続的デプロイ(CD)を実現します。デフォルトで state:modified+ と deferral が有効であり、変更されたモデルのみを効率的にデプロイします。
アプローチ
ネイティブ統合が利用できないため、今回は GitHub Actions から Administrative API を呼び出して CI ジョブを起動する構成を採用します。
【処理フロー】
1. 開発者が main ブランチへ PR を作成
2. GitHub Actions が PR イベントを検知
3. dbt platform API に CI ジョブのトリガーリクエストを送信
4. dbt platform が CI ジョブを実行(Slim CI + Deferral)
実際に試してみた
事前準備: GitHub Secrets の登録
GitHub Actions から dbt platform API を呼び出すため、以下の Secrets をリポジトリに登録します。
GitHub → リポジトリ → Settings → Secrets and variables → Actions → New repository secret
| Secret 名 | 説明 | 取得場所 |
|---|---|---|
DBT_CLOUD_API_TOKEN |
dbt platform の service token(推奨)。CI/CD 用には個人トークンではなく service token の利用を推奨 | dbt platform → Account Settings → Service Tokens |
DBT_CLOUD_ACCOUNT_ID |
dbt platform のアカウント ID | dbt platform URL の /accounts/ の後の数字 |
DBT_CLOUD_JOB_ID |
CI ジョブの ID | dbt platform → Deploy → Jobs → 該当ジョブの URL の数字 |
DBT_CLOUD_HOST |
dbt platform のホスト URL(任意) | 未設定時は https://cloud.getdbt.com |

事前準備: dbt platform CI ジョブの作成
dbt platform で事前に CI ジョブを作成します。
dbt platform → Deploy → Jobs → Create Job → Continuous Integration Job
| 項目 | 設定値 |
|---|---|
| Job name | CI - Slim Build & Test |
| Environment | CI/Staging 用の環境 |
| Commands | dbt build --select state:modified+ |
| Deferral | Production 環境を指定 |

※Triggered by pull requestsは今回APIで実行するため、チェックを入れていません。
GitHub Actions ワークフロー
.github/workflows/dbt_cloud_ci.yml を作成します。
# =============================================================================
# dbt Cloud CI Job Trigger
#
# 概要:
# mainブランチへのPR作成・更新時にdbt Cloud CI jobをAPIでトリガーする
# ネイティブGit統合が利用できない環境向けのワークフロー
#
# CI jobのAPIトリガーに必要なパラメータ:
# - cause : トリガー理由(ログ・追跡用の任意テキスト)
# - git_sha : チェックアウトするコミットSHA(PRのHEADコミット)
# - github_pull_request_id : PR番号(integer)。state:modified+やdeferralに必要
#
# 注意事項:
# - git_sha と git_branch は同時に指定できない(400エラーになる)
# - github_pull_request_id がないとCI job固有の機能(Slim CI、deferral)が動作しない
#
# 必要なGitHub Secrets:
# - DBT_CLOUD_API_TOKEN : dbt Cloudのservice token(推奨)
# - DBT_CLOUD_ACCOUNT_ID : dbt CloudのアカウントID
# - DBT_CLOUD_JOB_ID : トリガーするCI jobのID
# - DBT_CLOUD_HOST : dbt CloudのホストURL(任意。未設定時はhttps://cloud.getdbt.com)
# =============================================================================
name: dbt Cloud CI Job Trigger
on:
pull_request:
branches:
- main
types: [opened, synchronize, reopened, ready_for_review]
jobs:
trigger-dbt-ci:
runs-on: ubuntu-latest
steps:
- name: Trigger dbt Cloud CI job
env:
DBT_CLOUD_TOKEN: ${{ secrets.DBT_CLOUD_API_TOKEN }}
DBT_ACCOUNT_ID: ${{ secrets.DBT_CLOUD_ACCOUNT_ID }}
DBT_JOB_ID: ${{ secrets.DBT_CLOUD_JOB_ID }}
DBT_CLOUD_HOST: ${{ secrets.DBT_CLOUD_HOST }}
run: |
set -euo pipefail
if [ -z "${DBT_CLOUD_HOST:-}" ]; then
DBT_CLOUD_HOST="https://cloud.getdbt.com"
fi
REQUEST_BODY=$(jq -n \
--arg cause "Triggered from GitHub Actions: repo=${GITHUB_REPOSITORY}, pr=${{ github.event.pull_request.number }}, sha=${{ github.event.pull_request.head.sha }}" \
--arg git_sha "${{ github.event.pull_request.head.sha }}" \
--argjson github_pull_request_id ${{ github.event.pull_request.number }} \
'{cause: $cause, git_sha: $git_sha, github_pull_request_id: $github_pull_request_id}')
echo "Request Body:"
echo "$REQUEST_BODY"
HTTP_CODE=$(curl --silent --output response.json --write-out "%{http_code}" \
--request POST \
--url "${DBT_CLOUD_HOST}/api/v2/accounts/${DBT_ACCOUNT_ID}/jobs/${DBT_JOB_ID}/run/" \
--header "Content-Type: application/json" \
--header "Authorization: Token ${DBT_CLOUD_TOKEN}" \
--data "$REQUEST_BODY" \
)
echo "HTTP Status: $HTTP_CODE"
echo "Response:"
cat response.json
if [ "$HTTP_CODE" -ge 400 ]; then
exit 1
fi
API リクエストのパラメータ解説
CI ジョブを API でトリガーする際に送信するパラメータの詳細です。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
cause |
string | 任意 | トリガー理由。dbt platform のログに表示される |
git_sha |
string | 必須* | チェックアウトするコミット SHA |
git_branch |
string | 必須* | チェックアウトするブランチ名 |
github_pull_request_id |
integer | 必須 | PR 番号。CI ジョブ固有の機能に必要 |
*git_sha と git_branch はいずれか一方のみ指定可能です。両方指定すると 400 エラーになります。
ファイルの配置
ワークフローファイルは必ずリポジトリルートの .github/workflows/ に配置してください。
my-dbt-project/
├── .github/
│ └── workflows/
│ └── dbt_cloud_ci.yml # ここに配置
├── my_dbt_project/
│ ├── models/
│ ├── macros/
│ └── dbt_project.yml
└── ...
動作確認
PR を作成すると、GitHub Actions が起動し dbt platform の CI ジョブがトリガーされます。


dbt platform 側でも CI ジョブが実行され、変更されたモデルのみがビルド・テストされていることを確認できます。

Compare changesも確認することができました。

最後に
今回の検証で、ネイティブ Git 統合が使えない環境でも、GitHub Actions と dbt platform API を組み合わせることで CI ジョブをトリガーできることが確認できました。
ポイントは API リクエストに git_sha と github_pull_request_id を含める ことです。これらがないと CI ジョブ固有の Slim CI や deferral 機能が正しく動作せず、挙動が異なってしまいます。
この記事が何かの参考になれば幸いです!








