Azure DevOps Services |Azure DevOps Server 2022 および Azure DevOps Server 2019
ビルドが成功するたびに、データベースの更新を Azure SQL データベースに自動的にデプロイできます。
前提条件
製品 | 要件 |
---|---|
Azure DevOps | - Azure DevOps プロジェクト。 - アクセス許可: - サービス接続を作成するには、サービス接続の管理者または作成者ロールが必要です。 |
DACPAC
データベースを配置する最も簡単な方法は、 データ層パッケージまたは DACPAC を使用することです。 DACPAC を使用すると、スキーマの変更とデータをパッケージ化して展開できます。 Visual Studio の SQL Database プロジェクト を使用して DACPAC を作成できます。
Azure SQL Database デプロイ タスクは、データベースを Azure にデプロイするための主要なメカニズムです。 このタスクには、他の組み込みの Azure タスクと同様に、入力として Azure サービス接続が必要です。 Azure サービス接続には、Azure Pipelines から Azure に接続するための資格情報が格納されます。
このタスクを開始する最も簡単な方法は、Azure DevOps 組織と Azure サブスクリプションの両方を所有するユーザーとしてサインインすることです。 この場合、サービス接続を手動で作成する必要はありません。 それ以外の場合で Azure サービス接続を作成するには、Azure サービス接続の作成に関する記事を参照してください。
Azure サービス接続を作成するには、「Azure サービス接続の作成」に関する記事を参照してください。
DACPAC を Azure SQL データベースにデプロイするには、 Azure SQL Database デプロイ タスクを使用します。 YAML ファイルに次のスニペットを追加します。
- task: SqlAzureDacpacDeployment@1
displayName: Execute Azure SQL : DacpacTask
inputs:
azureSubscription: '<Azure service connection>'
ServerName: '<Database server name>'
DatabaseName: '<Database name>'
SqlUsername: '<SQL user name>'
SqlPassword: '<SQL user password>'
DacpacFile: '<Location of Dacpac file in $(Build.SourcesDirectory) after compilation>'
SQL スクリプト
または、DACPAC の代わりに SQL スクリプトを使用してデータベースをデプロイすることもできます。 空のデータベースを作成する単純な SQL スクリプトを次に示します。
USE [main]
GO
IF NOT EXISTS (SELECT name FROM main.sys.databases WHERE name = N'DatabaseExample')
CREATE DATABASE [DatabaseExample]
GO
パイプラインから SQL スクリプトを実行するには、Azure でファイアウォール規則を追加および削除する必要があります。 これらの規則がないと、Azure Pipelines エージェントは Azure SQL Database と通信できません。
Azure ファイアウォール規則を設定する
次の PowerShell スクリプトでは、ファイアウォール規則を作成します。
SetAzureFirewallRule.ps1
として保存し、リポジトリに追加します。
[CmdletBinding(DefaultParameterSetName = 'None')]
param
(
[String] [Parameter(Mandatory = $true)] $ServerName,
[String] [Parameter(Mandatory = $true)] $ResourceGroupName,
[String] $FirewallRuleName = "AzureWebAppFirewall"
)
$agentIP = (New-Object net.webclient).downloadstring("https://api.ipify.org")
New-AzSqlServerFirewallRule -ResourceGroupName $ResourceGroupName -ServerName $ServerName -FirewallRuleName $FirewallRuleName -StartIPAddress $agentIP -EndIPAddress $agentIP
Azure ファイアウォール規則を削除する
次の PowerShell スクリプトでは、ファイアウォール規則を削除します。
RemoveAzureFirewallRule.ps1
として保存し、リポジトリに追加します。
[CmdletBinding(DefaultParameterSetName = 'None')]
param
(
[String] [Parameter(Mandatory = $true)] $ServerName,
[String] [Parameter(Mandatory = $true)] $ResourceGroupName,
[String] $FirewallRuleName = "AzureWebAppFirewall"
)
Remove-AzSqlServerFirewallRule -ServerName $ServerName -FirewallRuleName $FirewallRuleName -ResourceGroupName $ResourceGroupName
SQL スクリプトを使用してデータベースをデプロイする
次の例では、ファイアウォール規則を追加し、SQL スクリプトを使用してデータベースをデプロイし、ファイアウォール規則を削除する手順の概要を示します。
variables:
AzureSubscription: '<SERVICE_CONNECTION_NAME>'
ResourceGroupName: '<RESOURCE_GROUP_NAME>'
ServerName: '<DATABASE_SERVER_NAME>'
ServerFqdn: '<DATABASE_FQDN>'
DatabaseName: '<DATABASE_NAME>'
AdminUser: '<DATABASE_USERNAME>'
AdminPassword: '<DATABASE_PASSWORD>'
SQLFile: '<LOCATION_OF_SQL_FILE_IN_$(Build.SourcesDirectory)>'
steps:
- task: AzurePowerShell@5
displayName: 'Set Azure firewall rules'
inputs:
azureSubscription: '$(AzureSubscription)'
ScriptType: filePath
ScriptPath: '$(Build.SourcesDirectory)\scripts\SetAzureFirewallRule.ps1'
ScriptArguments: '-ServerName $(ServerName) -ResourceGroupName $(ResourceGroupName)'
azurePowerShellVersion: LatestVersion
- task: PowerShell@2
displayName: 'Install SqlServer module if not present'
inputs:
targetType: 'inline'
script: |
if (-not (Get-Module -ListAvailable -Name SqlServer)) {
Install-Module -Name SqlServer -Force -AllowClobber
}
- task: PowerShell@2
displayName: 'Deploy database'
inputs:
targetType: 'inline'
script: |
Invoke-Sqlcmd -InputFile $(SQLFile) -ServerInstance $(ServerFqdn) -Database $(DatabaseName) -Username $(AdminUser) -Password $(AdminPassword)
- task: AzurePowerShell@5
displayName: 'Remove Azure firewall rules'
inputs:
azureSubscription: '$(AzureSubscription)'
ScriptType: filePath
ScriptPath: '$(Build.SourcesDirectory)\scripts\RemoveAzureFirewallRule.ps1'
ScriptArguments: '-ServerName $(ServerName) -ResourceGroupName $(ResourceGroupName)'
azurePowerShellVersion: LatestVersion
データベースを条件付きでデプロイする
特定のビルドのみを Azure データベースにデプロイすることを選択できます。ソース ブランチやビルドの状態などの条件に基づいて、適用される変更をより細かく制御できます。
YAML でこれを実施するには、次の方法のいずれかを使用します。
デプロイ手順を別のジョブに分離し、そのジョブに条件を適用します。
ステップに条件を直接追加します。
次の例は、 条件を使用してメイン ブランチからのビルドのみをデプロイする方法を示しています。
- task: SqlAzureDacpacDeployment@1
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
inputs:
azureSubscription: '<Azure service connection>'
ServerName: '<Database server name>'
DatabaseName: '<Database name>'
SqlUsername: '<SQL user name>'
SqlPassword: '<SQL user password>'
DacpacFile: '<Location of Dacpac file in $(Build.SourcesDirectory) after compilation>'
その他の SQL アクション
SQL Azure Dacpac デプロイ タスクでは、実行する必要があるすべての SQL サーバー アクションが対象とされない場合があります。 このような場合は、PowerShell またはコマンド ライン スクリプトを使用して、必要なコマンドを実行できます。
このセクションでは、 SqlPackage.exe ツールを呼び出すための一般的なユース ケースについて説明します。 このツールを実行する前に、ツールがインストールされているセルフホステッド エージェントを使用していることを確認してください。
注
SQLPackage がインストールされているフォルダーから実行する場合は、パスの前に &
を付け、二重引用符で囲む必要があります。
基本構文
<Path of SQLPackage.exe> <Arguments to SQLPackage.exe>
実行するアクションに基づいて、次のいずれかの SQL スクリプトを使用できます。
ライブ SQL Server または Microsoft Azure SQL Database からデータベース スナップショット (.dacpac) ファイルを作成します。
コマンド構文:
SqlPackage.exe /TargetFile:"<Target ___location of dacpac file>" /Action:Extract
/SourceServerName:"<ServerName>.database.windows.net"
/SourceDatabaseName:"<DatabaseName>" /SourceUser:"<Username>" /SourcePassword:"<Password>"
または
SqlPackage.exe /action:Extract /tf:"<Target ___location of dacpac file>"
/SourceConnectionString:"Data Source=ServerName;Initial Catalog=DatabaseName;Integrated Security=SSPI;Persist Security Info=False;"
例:
SqlPackage.exe /TargetFile:"C:\temp\test.dacpac" /Action:Extract /SourceServerName:"DemoSqlServer.database.windows.net.placeholder"
/SourceDatabaseName:"Testdb" /SourceUser:"ajay" /SourcePassword:"SQLPassword"
ヘルプ:
sqlpackage.exe /Action:Extract /?