Развертывание базы данных SQL Azure

Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019

Вы можете автоматически развернуть обновления базы данных в базе данных SQL Azure после каждой успешной сборки.

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>'

См. также сведения о проверке подлинности при использовании задачи развертывания База данных SQL Azure.

Скрипты 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 в репозитории.

ARM

[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

Классическое

[CmdletBinding(DefaultParameterSetName = 'None')]
param
(
  [String] [Parameter(Mandatory = $true)] $ServerName,
  [String] [Parameter(Mandatory = $true)] $ResourceGroupName,
  [String] $FirewallRuleName = "AzureWebAppFirewall"
)

$ErrorActionPreference = 'Stop'

function New-AzureSQLServerFirewallRule {
  $agentIP = (New-Object net.webclient).downloadstring("https://api.ipify.org")
  New-AzureSqlDatabaseServerFirewallRule -StartIPAddress $agentIp -EndIPAddress $agentIp -RuleName $FirewallRuleName -ServerName $ServerName
}

function Update-AzureSQLServerFirewallRule{
  $agentIP= (New-Object net.webclient).downloadstring("https://api.ipify.org")
  Set-AzureSqlDatabaseServerFirewallRule -StartIPAddress $agentIp -EndIPAddress $agentIp -RuleName $FirewallRuleName -ServerName $ServerName
}

if ((Get-AzureSqlDatabaseServerFirewallRule -ServerName $ServerName -RuleName $FirewallRuleName -ErrorAction SilentlyContinue) -eq $null)
{
  New-AzureSQLServerFirewallRule
}
else
{
  Update-AzureSQLServerFirewallRule
}

Следующий сценарий PowerShell удаляет правила брандмауэра. Вы можете проверка в этом скрипте как RemoveAzureFirewallRule.ps1 в репозитории.

ARM

[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

Классическое

[CmdletBinding(DefaultParameterSetName = 'None')]
param
(
  [String] [Parameter(Mandatory = $true)] $ServerName,
  [String] [Parameter(Mandatory = $true)] $ResourceGroupName,
  [String] $FirewallRuleName = "AzureWebAppFirewall"
)

$ErrorActionPreference = 'Stop'

if ((Get-AzureSqlDatabaseServerFirewallRule -ServerName $ServerName -RuleName $FirewallRuleName -ErrorAction SilentlyContinue))
{
  Remove-AzureSqlDatabaseServerFirewallRule -RuleName $FirewallRuleName -ServerName $ServerName
}

Добавьте следующий код в файл 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: CmdLine@2
  displayName: Run Sqlcmd
  inputs:
    filename: sqlcmd
    arguments: '-S $(ServerFqdn) -U $(AdminUser) -P $(AdminPassword) -d $(DatabaseName) -i $(SQLFile)'

- 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 Server, которые требуется выполнить. В этих случаях можно просто использовать скрипты PowerShell или командной строки для выполнения необходимых команд. В этом разделе показаны некоторые распространенные варианты использования для вызова средства SqlPackage.exe. В качестве необходимого условия для запуска этого средства необходимо использовать автономный агент и установить средство на агенте.

Примечание.

При выполнении SQLPackage из папки, в которой она установлена, необходимо префиксировать путь и & упаковать его в двойные кавычки.

Базовый синтаксис

<Path of SQLPackage.exe> <Arguments to SQLPackage.exe>

Вы можете использовать любой из следующих скриптов SQL в зависимости от действия, которое требуется выполнить.

Extract

Создает файл моментального снимка базы данных (DACPAC) из динамического SQL Server или База данных SQL Microsoft Azure.

Синтаксис команды:

SqlPackage.exe /TargetFile:"<Target location of dacpac file>" /Action:Extract
/SourceServerName:"<ServerName>.database.windows.net"
/SourceDatabaseName:"<DatabaseName>" /SourceUser:"<Username>" /SourcePassword:"<Password>"

or

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"
 /SourceDatabaseName:"Testdb" /SourceUser:"ajay" /SourcePassword:"SQLPassword"

Help (Справка):

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"
/TargetDatabaseName:"Testdb4" /TargetUser:"ajay" /TargetPassword:"SQLPassword"

Help (Справка):

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"
/SourceDatabaseName:"Testdb" /SourceUser:"ajay" /SourcePassword:"SQLPassword"

Help (Справка):

sqlpackage.exe /Action:Export /?

Import

Импортирует данные схемы и таблицы из пакета BACPAC в новую пользовательную базу данных в экземпляре SQL Server или База данных SQL Microsoft Azure.

Синтаксис команды:

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"
/TargetDatabaseName:"Testdb" /TargetUser:"ajay" /TargetPassword:"SQLPassword"

Help (Справка):

sqlpackage.exe /Action:Import /?

DeployReport

создает 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"
/TargetDatabaseName:"Testdb" /TargetUser:"ajay" /TargetPassword:"SQLPassword" /OutputPath:"C:\temp\deployReport.xml" 

Help (Справка):

sqlpackage.exe /Action:DeployReport /?

DriftReport

создает 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" /TargetDatabaseName:"Testdb"
/TargetUser:"ajay" /TargetPassword:"SQLPassword" /OutputPath:"C:\temp\driftReport.xml"

Help (Справка):

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"
/TargetDatabaseName:"Testdb" /TargetUser:"ajay" /TargetPassword:"SQLPassword" /OutputPath:"C:\temp\test.sql"
/Variables:StagingDatabase="Staging DB Variable value"

Help (Справка):

sqlpackage.exe /Action:Script /?