業界・業務から探す
導入目的・課題から探す
データ・AIについて学ぶ
News
Hakkyについて
ウェビナーコラム
◆トップ【データ基盤】
データハブとは
Ajust
データの保守運用
AI

執筆者:Handbook編集部

GitHub ActionsによるDataformのCI/CD構築手順

本記事では、GitHub ActionsによるDataformのCI/CD構築手順について解説します。 チーム開発においては、コードのバージョン管理、テストの自動化、本番環境への安全な実行が不可欠です。
GitHub Actionsは、GitHubに統合されたCI/CDプラットフォームであり、DataformのCI/CDパイプラインを効率的に構築・運用するのに適したツールです。 GitHub ActionsでCI/CDパイプラインを構築することで、以下のようなメリットが期待できます。

  • 人的ミスの削減: ビルド、テストの自動化により、手動作業によるミスを減らすことができます。
  • 開発速度の向上: 自動化されたワークフローは、開発サイクルを短縮し、迅速なリリースを可能にします。
  • コード品質の向上: 定期的な自動テストの実施は、バグの早期発見と修正を促進し、コードの品質向上に繋がります。
  • 本番環境への安全な実行: テスト済みのコードを適切に実行することで、本番環境への影響を最小限に抑え、安全なリリースを実現します。

GitHub Actionsの概要については、GitHub Actionsの概要 の記事をご覧ください。

環境設定

DataformはBigQueryを利用するため、Google cloudのプロジェクトにサービスアカウントが必要です。
このサービスアカウントはBigQueryに対してクエリを実行するため、BigQueryへのアクセス権限が必要となります。 ここではまずサービスアカウントの認証情報をGitHub SecretsにJSON形式で直接登録する方法を紹介したのち、workload identityを使って認証する方法についても後述します。

1.サービスアカウントの作成

以下のコマンドでサービスアカウントを作成し、必要な権限を付与します。YOUR_PROJECT_ID は実際のプロジェクトIDに置き換えてください。

# サービスアカウントの作成
gcloud iam service-accounts create dataform-ci \
    --description="Dataform CI Service Account" \
    --display-name="Dataform CI"
# 必要な権限の付与
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
    --member="serviceAccount:dataform-ci@YOUR_PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/bigquery.dataEditor"
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
    --member="serviceAccount:dataform-ci@YOUR_PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/bigquery.jobUser"
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
    --member="serviceAccount:dataform-ci@YOUR_PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/bigquery.dataViewer"
# キーファイルの作成
gcloud iam service-accounts keys create key.json \
    --iam-account=dataform-ci@YOUR_PROJECT_ID.iam.gserviceaccount.com

2.GitHub Secretsの設定

リポジトリの "Settings" > "Secrets and variables" > "Actions" に移動
"New repository secret" をクリック
GOOGLE_CREDENTIALS という名前で、key.jsonファイルの内容全体をコピー&ペーストして登録します

3.リポジトリ構成

本記事で解説するリポジトリ内の構成については、Dataformが推奨するディレクトリ構成を採用します。

repository/
├── definitions/    # SQLクエリやテーブル定義
├── includes/       # 共通の関数やマクロ
└── .github/
    └── workflows/  # GitHub Actions設定

Workload Identity を使った認証

上記ではサービスアカウントキーを GitHub Secrets に登録する方法を解説しましたが、Workload Identity を使うことで、鍵ファイルを管理せずに GitHub Actions と Google Cloud を安全に連携することができます。
以下は Dataform の CI を行う際に Workload Identity を利用する例です。

name: CI with Workload Identity

on:
  push:
    paths:
      - definitions/**
      - includes/**
      - .github/workflows/ci-workload-identity.yaml
  workflow_dispatch:

env:
  GCP_PROJECT_ID: <YOUR_PROJECT_ID>
  GCP_PROJECT_NUMBER: <YOUR_PROJECT_NUMBER>

jobs:
  dry-run:
    runs-on: ubuntu-latest
    timeout-minutes: 5

    permissions:
      contents: "read"
      id-token: "write"  # Workload Identity を利用する場合は “id-token: write” が必要

    steps:
      - name: Checkout code into workspace directory
        uses: actions/checkout@v4

      - name: cloud SDK
        uses: google-github-actions/setup-gcloud@v2
        with:
          project_id: ${{ env.GCP_PROJECT_ID }}

      - id: auth
        name: "Authenticate to Google Cloud"
        uses: google-github-actions/auth@v2
        with:
          create_credentials_file: "true"
          workload_identity_provider: "projects/${{ env.GCP_PROJECT_NUMBER }}/locations/global/workloadIdentityPools/github-actions-deploy-pool/providers/github-actions-provider"
          service_account: "github-actions-deployer@${{ env.GCP_PROJECT_ID }}.iam.gserviceaccount.com"
          access_token_lifetime: 1200s
          export_environment_variables: "true"

      - name: Set GOOGLE_APPLICATION_CREDENTIALS
        run: |
          echo "GOOGLE_APPLICATION_CREDENTIALS=${{ steps.auth.outputs.credentials_file_path }}" >> $GITHUB_ENV

      - name: gcloud auth login by workload identity
        run: |-
          gcloud auth login --brief --cred-file="${{ steps.auth.outputs.credentials_file_path }}"

      - name: With Node.js
        uses: actions/setup-node@v4
        with:
          node-version: "20"

      - name: Install package
        run: |
          npm install -g @dataform/cli@3.0.2

      - name: Check dataform version
        run: dataform --version

      - name: Run dataform compile
        run: dataform compile

      - name: Dry run
        run: dataform run --dry-run

      - name: Run dataform format
        run: dataform format
        continue-on-error: true

      - name: Check for formatting changes
        run: |
          if [[ `git status --porcelain` ]]; then
            echo "::warning::Formatting changes detected. Please run 'dataform format' locally and commit the changes."
            git diff
          else
            echo "No formatting changes were needed."
          fi

Workload Identity を使うことで、サービスアカウントの鍵ファイルを利用しないセキュアな認証環境が実現可能です。 なおWorkload Identity を使用する際は、事前にWorkload Identity Pool と Providerの設定が必要です。詳細は、以下の記事を参照してください。

CI (継続的インテグレーション)

さっそく、GitHub Actionsを用いたDataformのCI/CDパイプライン構築の実例と解説を紹介します。

name: CI
on:
  push:
    paths:
      - definitions/**
      - includes/**
      - .github/workflows/ci.yaml
permissions:
  contents: read
jobs:
  dry-run:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - name: Checkout code into workspace directory
        uses: actions/checkout@v4
      - name: Install project dependencies
        uses: docker://dataformco/dataform:latest
        with:
          args: install --track false
      - name: Authenticate to Google Cloud
        uses: google-github-actions/auth@v1
        with:
          credentials_json: ${{ secrets.GOOGLE_CREDENTIALS }}
      - name: Run dataform compile
        uses: docker://dataformco/dataform:latest
        with:
          args: compile --track false
      - name: Dry run
        uses: docker://dataformco/dataform:latest
        with:
          args: run --dry-run --track false
      - name: Run dataform format
        uses: docker://dataformco/dataform:latest
        with:
          args: format --track false
      - name: Check for formatting changes
        run: |
          if [[ `git status --porcelain` ]]; then
            echo "::warning::Formatting changes detected. Please run 'dataform format' locally and commit the changes."
            git diff
          else
            echo "No formatting changes were needed."
          fi

このワークフローでは、definitionsディレクトリへのプッシュをトリガーに、依存関係のインストール、認証情報の取得、コンパイル、dry-runオプションを用いたDataformの実行、フォーマットを行います。 --dry-runオプションにより、実際のBigQueryへの変更は行われません。 これらにエラーハンドリングや結果の通知などを追加することで、問題発生時の対応改善が期待できます。

CD (継続的デリバリー)

このワークフローでは、mainブランチへのプルリクエストをトリガーに、Dataformの公式Dockerイメージを使用した依存関係のインストール、認証情報の取得、アサーションテスト、実行までを行います。

name: CD
on:
  pull_request:
    branches:
    - main
jobs:
  deployment:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4

      - name: Authenticate to Google Cloud
        uses: google-github-actions/auth@v1
        with:
          credentials_json: ${{ secrets.GOOGLE_CREDENTIALS }}
        
    - uses: docker://dataformco/dataform:latest
      with:
        args: test

    - uses: docker://dataformco/dataform:latest
      with:
        args: run

テストについて

  • Dataformは以下のように単体テストを実施することができます。
  • Dataformの標準のアサーション機能を使用
  • テーブルの config ブロックにアサーションを追加、または別ファイルに追加
  • テストはデータの整合性や品質を検証
-- SQLアサーション例
config {
  type: "assertion"
}
SELECT *
FROM
  ${ref("sometable")}
WHERE
  a IS NULL
  OR b IS NULL
  OR c IS NULL

まとめ

GitHub Actionsを使うことで、DataformのCI/CDパイプラインの容易な構築と、開発ワークフローを効率化し、コードの品質向上、そして本番環境への安全な実行を実現できます。 これにより、開発者はビジネスロジックの実装に集中できるようになり、より迅速に価値を提供することが可能になります。
必要に応じて、開発環境、ブランチ戦略などの要素をワークフローに組み込むことで、より堅牢で柔軟なCI/CDパイプラインを構築できるでしょう。

参考

info
備考

Hakky ではエンジニアを募集中です!まずは話してみたいなどでも構いませんので、ぜひお気軽に採用ページからお問い合わせくださいませ。

2025年07月06日に最終更新
読み込み中...