Развертывание базы данных SQL Azure
Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019
Вы можете автоматически развернуть обновления базы данных в Azure SQL Database после каждой успешной сборки.
DACPAC
Самый простой способ развертывания базы данных — создать пакет уровня данных или DACPAC. DACPACs можно использовать для упаковки и развертывания изменений схемы и данных. Вы можете создать DACPAC с помощью проекта базы данных SQL в Visual Studio.
Чтобы развернуть DACPAC в базе данных SQL Azure, добавьте следующий фрагмент кода в файл azure-pipelines.yml.
- 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>'
См. также информацию для проверки подлинности при использовании задачи развертывания базы данных Azure SQL.
Скрипты 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 PowerShell для создания и удаления правил брандмауэра в Azure. Без правил брандмауэра агент Azure Pipelines не может взаимодействовать с База данных 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
Следующий сценарий 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
Добавьте следующий код в файл azure-pipelines.yml для запуска скрипта 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: 'Azure PowerShell script'
inputs:
azureSubscription: '$(AzureSubscription)'
ScriptType: filePath
ScriptPath: '$(Build.SourcesDirectory)\scripts\SetAzureFirewallRule.ps1'
ScriptArguments: '-ServerName $(ServerName) -ResourceGroupName $(ResourceGroupName)'
azurePowerShellVersion: LatestVersion
- task: PowerShell@2
inputs:
targetType: 'inline'
script: |
if (-not (Get-Module -ListAvailable -Name SqlServer)) {
Install-Module -Name SqlServer -Force -AllowClobber
}
displayName: 'Install SqlServer module if not present'
- task: PowerShell@2
inputs:
targetType: 'inline'
script: |
Invoke-Sqlcmd -InputFile $(SQLFile) -ServerInstance $(ServerFqdn) -Database $(DatabaseName) -Username $(AdminUser) -Password $(AdminPassword)
displayName: 'Run SQL script'
- task: AzurePowerShell@5
displayName: 'Azure PowerShell script'
inputs:
azureSubscription: '$(AzureSubscription)'
ScriptType: filePath
ScriptPath: '$(Build.SourcesDirectory)\scripts\RemoveAzureFirewallRule.ps1'
ScriptArguments: '-ServerName $(ServerName) -ResourceGroupName $(ResourceGroupName)'
azurePowerShellVersion: LatestVersion
Подключение службы Azure
Задача развертывания База данных SQL Azure — это основной механизм развертывания базы данных в Azure. Эта задача, как и в других встроенных задачах Azure, требует подключения службы Azure в качестве входных данных. Подключение службы Azure сохраняет учетные данные для подключения из Azure Pipelines к Azure.
Самый простой способ начать работу с этой задачей — войти в систему как пользователь, который владеет как организацией Azure DevOps, так и подпиской Azure. В этом случае вам не нужно будет создавать подключение к службе вручную. В противном случае, чтобы узнать, как создать подключение службы Azure, см. статью Создание подключения службы Azure.
Сведения о создании подключения службы Azure см. в статье "Создание подключения службы Azure".
Развертывание с условиями
Вы можете развернуть только определенные сборки в базе данных 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
Развертывание Dacpac для SQL Azure может не поддерживать все операции сервера SQL, которые вы хотите выполнить. В этих случаях можно просто использовать скрипты PowerShell или командной строки для выполнения необходимых команд. В этом разделе показаны некоторые распространенные варианты использования средства SqlPackage.exe. В качестве необходимого условия для запуска этого средства необходимо использовать автономный агент и установить средство на агенте.
Примечание.
При выполнении SQLPackage из папки, в которой она установлена, необходимо префиксировать путь с &
и заключить его в двойные кавычки.
Базовый синтаксис
<Path of SQLPackage.exe> <Arguments to SQLPackage.exe>
Вы можете использовать любой из следующих скриптов SQL в зависимости от действия, которое требуется выполнить.
Экстракт
Создает файл дампа базы данных (.dacpac) с работающего сервера SQL или базы данных Microsoft Azure SQL.
Синтаксис команды:
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 /?
Публикация
выполняет добавочное обновление схемы базы данных в соответствии со схемой исходного DACPAC-файла. Если база данных не существует на сервере, операция публикации создаст ее. В противном случае будет обновлена существующая база данных.
Синтаксис команды:
SqlPackage.exe /SourceFile:"<Dacpac file location>" /Action:Publish /TargetServerName:"<ServerName>.database.windows.net"
/TargetDatabaseName:"<DatabaseName>" /TargetUser:"<Username>" /TargetPassword:"<Password> "
Пример:
SqlPackage.exe /SourceFile:"E:\dacpac\ajyadb.dacpac" /Action:Publish /TargetServerName:"DemoSqlServer.database.windows.net.placeholder"
/TargetDatabaseName:"Testdb4" /TargetUser:"ajay" /TargetPassword:"SQLPassword"
Справка
sqlpackage.exe /Action:Publish /?
Экспорт (Export)
Экспортирует динамическую базу данных, включая схему базы данных и пользовательские данные, из SQL Server или База данных SQL Microsoft Azure в пакет BACPAC (BACPAC-файл).
Синтаксис команды:
SqlPackage.exe /TargetFile:"<Target location for bacpac file>" /Action:Export /SourceServerName:"<ServerName>.database.windows.net"
/SourceDatabaseName:"<DatabaseName>" /SourceUser:"<Username>" /SourcePassword:"<Password>"
Пример:
SqlPackage.exe /TargetFile:"C:\temp\test.bacpac" /Action:Export /SourceServerName:"DemoSqlServer.database.windows.net.placeholder"
/SourceDatabaseName:"Testdb" /SourceUser:"ajay" /SourcePassword:"SQLPassword"
Справка
sqlpackage.exe /Action:Export /?
Импорт
Импортирует данные схемы и таблицы из пакета BACPAC в новую пользовательскую базу данных в экземпляре SQL Server или Microsoft Azure SQL Database.
Синтаксис команды:
SqlPackage.exe /SourceFile:"<Bacpac file location>" /Action:Import /TargetServerName:"<ServerName>.database.windows.net"
/TargetDatabaseName:"<DatabaseName>" /TargetUser:"<Username>" /TargetPassword:"<Password>"
Пример:
SqlPackage.exe /SourceFile:"C:\temp\test.bacpac" /Action:Import /TargetServerName:"DemoSqlServer.database.windows.net.placeholder"
/TargetDatabaseName:"Testdb" /TargetUser:"ajay" /TargetPassword:"SQLPassword"
Справка
sqlpackage.exe /Action:Import /?
Отчёт о развёртывании
создает XML-отчет по изменениям, которые должны быть внесены в результате публикации.
Синтаксис команды:
SqlPackage.exe /SourceFile:"<Dacpac file location>" /Action:DeployReport /TargetServerName:"<ServerName>.database.windows.net"
/TargetDatabaseName:"<DatabaseName>" /TargetUser:"<Username>" /TargetPassword:"<Password>" /OutputPath:"<Output XML file path for deploy report>"
Пример:
SqlPackage.exe /SourceFile:"E: \dacpac\ajyadb.dacpac" /Action:DeployReport /TargetServerName:"DemoSqlServer.database.windows.net.placeholder"
/TargetDatabaseName:"Testdb" /TargetUser:"ajay" /TargetPassword:"SQLPassword" /OutputPath:"C:\temp\deployReport.xml"
Справка
sqlpackage.exe /Action:DeployReport /?
Отчет о дрейфе
создает XML-отчет по изменениям, которые были внесены в зарегистрированную базу данных со времени ее последней регистрации.
Синтаксис команды:
SqlPackage.exe /Action:DriftReport /TargetServerName:"<ServerName>.database.windows.net" /TargetDatabaseName:"<DatabaseName>"
/TargetUser:"<Username>" /TargetPassword:"<Password>" /OutputPath:"<Output XML file path for drift report>"
Пример:
SqlPackage.exe /Action:DriftReport /TargetServerName:"DemoSqlServer.database.windows.net.placeholder" /TargetDatabaseName:"Testdb"
/TargetUser:"ajay" /TargetPassword:"SQLPassword" /OutputPath:"C:\temp\driftReport.xml"
Справка
sqlpackage.exe /Action:DriftReport /?
Скрипт
создает скрипт добавочного обновления на языке Transact-SQL, который обновляет схему целевой базы данных до соответствия схеме базы данных-источника.
Синтаксис команды:
SqlPackage.exe /SourceFile:"<Dacpac file location>" /Action:Script /TargetServerName:"<ServerName>.database.windows.net"
/TargetDatabaseName:"<DatabaseName>" /TargetUser:"<Username>" /TargetPassword:"<Password>" /OutputPath:"<Output SQL script file path>"
Пример:
SqlPackage.exe /Action:Script /SourceFile:"E:\dacpac\ajyadb.dacpac" /TargetServerName:"DemoSqlServer.database.windows.net.placeholder"
/TargetDatabaseName:"Testdb" /TargetUser:"ajay" /TargetPassword:"SQLPassword" /OutputPath:"C:\temp\test.sql"
/Variables:StagingDatabase="Staging DB Variable value"
Справка
sqlpackage.exe /Action:Script /?