SQL DatabaseのデプロイメントをCI/CDで自動化する方法
1. はじめに
本記事では、SQL Databaseのデプロイメントを自動化するためのCI/CDパイプラインの構築方法について解説します。データベースの変更を効率的に管理し、自動化を行うためのツールとして、Visual StudioのデータベースプロジェクトやAzure Data Studioを利用します。また、DACPAC/BACPACを活用したデータベースのデプロイメントと、Azure Pipelineを使ったCI/CDの具体的な実装方法についても触れていきます。
本記事のソースコードは、Gitに登録しています。
2. SQLファイル管理ツールの比較: Visual Studioのデータベースプロジェクト vs Azure Data Studio
2.1 Visual Studioのデータベースプロジェクト
Visual Studioのデータベースプロジェクト(SQL Server Data Tools: SSDT)は、SQLデータベースのスキーマやT-SQLスクリプトを管理・バージョン管理するためのツールです。ソースコードのようにスキーマを管理でき、CI/CDと連携することでデプロイメントを自動化できます。また、ストアドプロシージャや関数のデバッグをサポートしている点が特徴です。
メリット
- データベースのバージョン管理が可能
- データベースプロジェクトを使ってデプロイの差分管理ができる
- ストアドプロシージャなどのT-SQLのデバッグやステップ実行が可能
デメリット
- Windowsのみ対応
- クロスプラットフォームでの開発環境には不向き
2.2 Azure Data Studio
Azure Data Studioは、クロスプラットフォームで動作する軽量なデータベース管理ツールです。Visual Studioほどの機能はないものの、SQLクエリの実行や基本的な管理には優れています。
メリット
- Windows、Linux、macOS対応
- 軽量でクエリ実行やデータベース管理が高速
- 拡張機能により機能追加が可能
デメリット
- データベースプロジェクト (sqlproj) の管理ができない
- 高度なデプロイ自動化やバージョン管理には不向き
2.3 両者を比較してできること・できないこと
項目 | Visual Studioデータベースプロジェクト | Azure Data Studio |
---|---|---|
スキーマ管理とバージョン管理 | 可能 | 不可 |
クロスプラットフォーム対応 | 不可 | 可能 |
T-SQLクエリ実行とデバッグ | 可能 | 基本的なクエリ実行のみ |
自動化・CI/CD対応 | 強力なサポート | スクリプトベース |
3. DACPACとBACPACとは?
データベースのデプロイメントを効率化するために、DACPACとBACPACを使用することができます。両者の違いを理解することが、自動化のプロセスを設計する上で重要となります。
- DACPAC (Data-Tier Application Package): スキーマのみを含むパッケージ。データベースの定義(テーブル、ビュー、ストアドプロシージャなど)を保存し、デプロイメントやスキーマ比較に使用します。
- BACPAC (Backup Package): スキーマとデータの両方を含むパッケージ。データベース全体をバックアップする際に使用され、データベースの移行にも役立ちます。
4. Visual StudioでのT-SQLデバッグ
Visual Studioのデータベースプロジェクトを使えば、T-SQLのストアドプロシージャのデバッグが可能です。デバッグ機能を利用することで、複雑なロジックやクエリの不具合をステップ実行で確認でき、迅速なトラブルシューティングが行えます。
ただし、Azure SQL Database上のインスタンスに対しては、Visual Studioでのデバッグ機能はサポートされていないため、ローカルでのデバッグを行う必要があります。
-
Visual Studioでデータベースプロジェクトを作成
-
ストアドプロシージャや関数を追加
-
デバッグ用の接続を設定し、ローカルデータベースでステップ実行でプロシージャを確認
5. DACPACによるSQLデータベースのデプロイ
デプロイメントの基本ステップは、以下のようになります。
-
Visual Studioでデータベースプロジェクトをビルドし、DACPACを生成します。
-
SQL ServerやAzure SQL Databaseに対して、DACPACファイルを使ってスキーマ変更をデプロイします。
[4.3]で記載の公開をすることでデータベースへのデプロイができます。
ここは差分スクリプトを確認したうえで、手動によるデプロイが現実的ですかね。
5.1 Azure Pipelineによるデプロイ自動化
Azure Pipelineを使用して、自動的にDACPACを生成し、SQLデータベースにデプロイする方法について説明します。この際、パイプラインのエージェントとしてWindowsを使用する必要がある点に注意してください。
trigger:
- none
variables:
serviceConnection: '<your AzDO Service connection>'
sqlServerName: '<your SQLDatabase Endpoint>'
sqlDatabaseName: '<your SQLDatabase Database name'
sqlUsername: '<your SQLDatabase Database User name'
sqlPassword: '<your SQLDatabase Database User password'
pool:
vmImage: 'windows-latest'
steps:
- task: VSBuild@1
inputs:
solution: 'src/Database1/*.sln'
msbuildArgs: '/p:Configuration=Release'
platform: 'Any CPU'
- task: CopyFiles@2
inputs:
SourceFolder: '$(System.DefaultWorkingDirectory)/src/Database1/Database1/bin/Release'
Contents: '**/*.dacpac'
TargetFolder: '$(Build.ArtifactStagingDirectory)'
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: '$(Build.ArtifactStagingDirectory)'
artifactName: 'drop'
publishLocation: 'Container'
- task: SqlAzureDacpacDeployment@1
inputs:
azureSubscription: '$(serviceConnection)'
ServerName: '$(sqlServerName)'
DatabaseName: '$(sqlDatabaseName)'
SqlUsername: '$(sqlUsername)'
SqlPassword: '$(sqlPassword)'
DacpacFile: '$(Build.ArtifactStagingDirectory)/*.dacpac'
注意点
- Windows環境でパイプラインを構成する必要がある
- SQL Databaseに変更を加える前に、適切なスキーマのバージョン管理を行うこと
6. データベースデプロイの自動化に対するベストプラクティス
自動化を進めるにあたってのベストプラクティスをいくつか紹介します。
- データベーススキーマのバージョン管理: データベースの変更を追跡可能にするため、GitやAzure Reposでスキーマをバージョン管理します。
- デプロイメントの自動化: 手動の作業を排除し、CI/CDパイプラインを使ってデプロイメントを自動化します。DACPACやSQLCMDを利用して、継続的なデプロイを実現します。
-
スキーマとデータの分離: スキーマとデータを分けて管理し、必要に応じて
Post-Deployment
スクリプトを活用してデータの挿入や更新を行います。
※具体的には下記のように、ビルド時のアクションとして、配置後
を選択することを意図しています。
7. まとめ
本記事では、Visual StudioやAzure Data Studioを使用したデータベース管理から、DACPACを使ったデプロイメントの自動化まで解説しました。CI/CDパイプラインによる効率化を進めることで、SQLデータベースのデプロイメントはより信頼性が高く、反復可能なプロセスへと進化します。
今後、データベースの変更管理や自動化において、どのようにツールを選択するかが重要だと思います。
References
Discussion