Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
每次成功生成后,都可以自动将数据库更新部署到 Azure SQL数据库。
先决条件
产品 | 要求 |
---|---|
Azure DevOps | - Azure DevOps 项目。 - 权限: - 若要创建服务连接,您必须具有 服务连接的 管理员 或 创建者 角色。 |
DACPAC
部署数据库的最简单方法是使用 数据层包或 DACPAC。 DACPAC 允许打包和部署架构更改和数据。 可以在 Visual Studio 中使用 SQL 数据库项目 创建 DACPAC。
Azure SQL 数据库部署任务是将数据库部署到 Azure 的主要机制。 与其他内置 Azure 任务一样,此任务需要 Azure 服务连接作为输入。 Azure 服务连接将存储用于从 Azure Pipelines 连接到 Azure 的凭据。
若要开始使用此任务,最简单的方法是以同时拥有 Azure DevOps 组织和 Azure 订阅的用户的身份登录。 在这种情况下,不必手动创建服务连接。 否则,若要了解如何创建 Azure 服务连接,请参阅创建 Azure 服务连接。
若要了解如何创建 Azure 服务连接,请参阅创建 Azure 服务连接。
若要将 DACPAC 部署到 Azure SQL 数据库,请使用 Azure SQL 数据库部署任务。 将以下代码片段添加到 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 数据库通信。
设置 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 Server 或 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 /?