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 指令碼
或者,您可以使用 SQL 腳本,而不是 DACPAC 來部署資料庫。 以下是建立空白資料庫的簡單 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 的資料夾執行 SQLPackage ,您必須在路徑 &
前面加上 ,並以雙引號括住它。
基本語法
<Path of SQLPackage.exe> <Arguments to SQLPackage.exe>
您可以根據您要執行的動作,使用下列任何一個 SQL 文稿:
從即時 SQL 伺服器或 Microsoft Azure SQL 資料庫 建立資料庫快照集 (.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 /?