SQL プロジェクトの自動化

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

この記事では、さまざまなソフトウェア配信プラットフォームにわたる SQL プロジェクトの自動化オプションの概要について説明します。 自動化を使用して、SQL データベース プロジェクトを CI/CD パイプラインに統合し、データベースの変更を一貫して繰り返しデプロイします。

自動化する内容

SQL プロジェクトの自動化には、通常、CI/CD パイプラインに次の 2 つの重要なタスクが含まれます。

  • SQL プロジェクトをビルドする: プロジェクトを検証し、コンパイルする SQL データベース プロジェクトでdotnet buildを実行して、配置成果物 (.dacpac) を生成します。 必要に応じて、 コード分析 ルールを実行して、プロジェクトのビルド中にコードの品質を確認します。

  • .dacpacをデプロイする: SqlPackage またはプラットフォーム固有のタスクを使用して、ターゲット データベースに.dacpacを発行します。 デプロイは、Fabric の Azure SQL Database、Azure SQL Managed Instance、SQL Server、または SQL データベースをターゲットにすることができます。

SQL プロジェクトのビルドから dacpac 成果物へのフローとデータベースへのデプロイを示す図。

これらの手順を CI/CD パイプラインに統合すると、すべてのコミットでデータベースの変更が検証され、環境間で一貫してデプロイされます。

一般的な概念

アーティファクト フロー: 一般的なパイプラインでは、ビルドステージとデプロイ ステージが分離されます。 ビルド ステージでは、SQL プロジェクトがコンパイルされ、 .dacpac ファイルが生成され、パイプライン成果物として発行されます。 後続のデプロイ ジョブ (手動承認後の可能性あり) では、成果物がダウンロードされ、ターゲット データベースにデプロイされます。 この分離により、1 回ビルドし、同じ成果物を複数の環境にデプロイできるため、一貫性が確保されます。

発行またはスクリプト: 機密性の高い環境にデプロイする前に、展開計画を確認できます。 SqlPackage では、変更を適用せずにデプロイ中に実行される T-SQL スクリプトを生成する Script アクションがサポートされています。 指定された T-SQL スクリプトを使用すると、データベース管理者または校閲者は、承認前に .dacpac を適用するために必要な正確な変更を確認できます。 同様に、 DeployReport アクションでは、計画された変更の XML レポートが生成されます。

環境の承認とゲート: 運用環境のデプロイでは、通常、意図しない変更を防ぐために承認ワークフローが必要です。 GitHub Actions と Azure DevOps の両方で、環境ベースの承認がサポートされています。 GitHub では、必要なレビュー担当者と待機タイマーを使用して 環境 を構成できます。 Azure DevOps では、 環境 は承認ゲート、営業時間の制限、およびその他のデプロイ制御をサポートします。 これらのコントロールは、運用環境に移行する前にデータベースの変更が確認および承認されるようにするのに役立ちます。

[前提条件]

SqlPackage はクロスプラットフォームであり、Windows、Linux、macOS で実行されます。 環境間で一貫した動作を確保するために、.NET グローバル ツールとしてインストールします。

  • ビルド エージェントにインストールされている .NET SDK

  • ビルド エージェントにインストールされている SqlPackage。 .NET グローバル ツールとして SqlPackage をインストールできます。

    dotnet tool install --global microsoft.sqlpackage
    

ソフトウェア配信プラットフォーム

チームのツール、コンプライアンス、接続の要件に一致する環境を選択します。

マネージド仮想環境

GitHub Actions でホストされるランナーと Azure Pipelines エージェント用の Microsoft が管理する仮想環境には、プレインストールされているツールが含まれています。

環境 .NET SDK SqlPackage
ウィンドウズ Preinstalled Preinstalled
リナックス Preinstalled プレインストールされていません
macOS Preinstalled プレインストールされていません

Linux および macOS 環境では、ワークフローの一部として SqlPackage をインストールします。 パイプラインでの SqlPackage のインストールとバージョン管理の詳細については、 開発パイプラインでの SqlPackage に関する説明を参照してください。

セルフホステッド環境

次のような環境をより詳細に制御する必要がある場合は、セルフホステッド ランナーまたはエージェントからデプロイします。

  • ネットワーク分離の要件 (パブリック インターネットに公開されていないデータベースへのアクセス)
  • カスタム ツールまたは特定の SqlPackage バージョン
  • コンプライアンスまたはセキュリティ ポリシー

イベント ドリブンのサーバーレス実行のために、セルフホステッド ランナーを Azure Container Apps ジョブ としてデプロイできます。 この方法を使用して、Dockerfile で環境を定義し、必要に応じて SqlPackage やその他のツールをインストールします。

GitHub Actions

Azure SQL Deploy アクション (azure/sql-action) は、任意の GitHub Actions ランナーから Azure SQL および SQL Server に SQL プロジェクトと.dacpac ファイルをデプロイするための統合されたエクスペリエンスを提供します。

主な機能:

  • .dacpac.sqlproj、または.sqlスクリプトをデプロイします。
  • SQL 認証、Microsoft Entra ID 認証、およびサービス プリンシパル認証をサポートします。
  • azure/loginと組み合わせると、Azure SQL Database の一時的なファイアウォール規則が自動的に追加および削除されます。
  • Windows ランナーと Linux ランナーの両方で動作します。

例: GitHub Actions を使用して SQL プロジェクトをデプロイする

# .github/workflows/sql-deploy.yml
on: [push]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4

    - uses: azure/sql-action@v2
      with:
        connection-string: ${{ secrets.AZURE_SQL_CONNECTION_STRING }}
        path: './Database.sqlproj'
        action: 'publish'

一時的なファイアウォール規則を必要とする Azure SQL Database デプロイの場合は、sql-actionする前にazure/loginの手順を追加します。

    - uses: azure/login@v2
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}

    - uses: azure/sql-action@v2
      with:
        connection-string: ${{ secrets.AZURE_SQL_CONNECTION_STRING }}
        path: './Database.dacpac'
        action: 'publish'

任意のランナーで直接 SqlPackage を使用することもできます。 詳細については、「 開発パイプラインの SqlPackage」を参照してください。

Azure Pipelines

Azure DevOps には、.dacpac ファイルと SQL スクリプトを Azure SQL Database にデプロイするための SqlAzureDacpacDeployment タスクが用意されています。

主な機能:

  • .dacpacファイルをデプロイするか、SQL スクリプトを実行します。
  • SQL 認証、Microsoft Entra ID 認証、およびサービス プリンシパル認証をサポートします。
  • Azure SQL Database のファイアウォール規則を自動的に管理します。
  • Windows エージェントが必要です (Linux エージェントで直接 SqlPackage を使用します)。

例: Azure DevOps を使用して .dacpac をデプロイする

# azure-pipelines.yml
trigger:
  - main

pool:
  vmImage: 'windows-latest'

steps:
- task: SqlAzureDacpacDeployment@1
  inputs:
    azureSubscription: 'your-service-connection'
    AuthenticationType: 'server'
    ServerName: 'your-server.database.windows.net'
    DatabaseName: 'your-database'
    SqlUsername: '$(SqlUser)'
    SqlPassword: '$(SqlPassword)'
    deployType: 'DacpacTask'
    DeploymentAction: 'Publish'
    DacpacFile: '$(Build.ArtifactStagingDirectory)/Database.dacpac'

Linux エージェントまたはデプロイ プロセスをより詳細に制御する場合は、SqlPackage を直接使用します。

steps:
- task: UseDotNet@2
  inputs:
    packageType: 'sdk'
    version: '8.x'

- script: dotnet tool install --global microsoft.sqlpackage
  displayName: 'Install SqlPackage'

- script: |
    sqlpackage /Action:Publish \
      /SourceFile:$(Build.ArtifactStagingDirectory)/Database.dacpac \
      /TargetConnectionString:"$(ConnectionString)"
  displayName: 'Deploy database'

その他の CI/CD プラットフォーム

GitLab CI/CD、Jenkins、CircleCI などのプラットフォームでは、SqlPackage を直接使用して SQL プロジェクトをビルドおよびデプロイします。

プロジェクトをビルドする

dotnet build ./Database.sqlproj -c Release

.dacpac をデプロイする

sqlpackage /Action:Publish \
  /SourceFile:./bin/Release/Database.dacpac \
  /TargetConnectionString:"Server=your-server;Database=your-db;User Id=user;Password=password;"