Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Azure DevOps Services | Servidor Azure DevOps | Azure DevOps Server 2022 | Azure DevOps Server 2020
Você pode implantar automaticamente suas atualizações de banco de dados em um banco de dados SQL do Azure após cada build bem-sucedido.
Pré-requisitos
| Produto | Requisitos |
|---|---|
| Azure DevOps | - Um projeto do Azure DevOps. - Permissões: – Para criar conexões de serviço, você deve ter a função Administrador ou a função Criador para conexões de serviço. |
DACPAC
A maneira mais simples de implantar um banco de dados é usando um pacote de camada de dados ou DACPAC. OS DACPACs permitem empacotar e implantar dados e alterações de esquema. Você pode criar um DACPAC usando o Projeto do Banco de Dados SQL no Visual Studio.
A tarefa de implantação do Banco de Dados SQL do Azure é o principal mecanismo para implantar um banco de dados no Azure. Essa tarefa, assim como acontece com outras tarefas internas do Azure, requer uma conexão de serviço do Azure como entrada. A conexão de serviço do Azure armazena as credenciais para se conectar do Azure Pipelines ao Azure.
A maneira mais fácil de começar com essa tarefa é estar conectado como um usuário que detém a organização do Azure DevOps e a assinatura do Azure. Nesse caso, você não precisará criar manualmente a conexão de serviço. Caso contrário, para saber como criar uma conexão de serviço do Azure, confira Criar uma conexão de serviço do Azure.
Para saber como criar uma conexão de serviço do Azure, confira Criar uma conexão de serviço do Azure.
Para implantar um DACPAC em um banco de dados SQL do Azure, use a tarefa de implantação do Banco de Dados SQL do Azure. Adicione o seguinte snippet ao arquivo 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>'
Scripts de SQL
Como alternativa, você pode usar scripts SQL em vez de DACPAC para implantar seu banco de dados. Veja abaixo um script SQL simples que cria um banco de dados vazio:
USE [main]
GO
IF NOT EXISTS (SELECT name FROM main.sys.databases WHERE name = N'DatabaseExample')
CREATE DATABASE [DatabaseExample]
GO
Para executar scripts SQL do pipeline, você precisará adicionar e remover regras de firewall no Azure. Sem essas regras, o agente do Azure Pipelines não pode se comunicar com o Banco de Dados SQL do Azure.
Definir regras de firewall do Azure
O script do PowerShell a seguir cria regras de firewall. Salve-o como SetAzureFirewallRule.ps1 e adicione-o ao repositório:
[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
Remover regras de firewall do Azure
O script do PowerShell a seguir remove as regras de firewall. Salve-o como RemoveAzureFirewallRule.ps1 e adicione-o ao repositório:
[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
Implantar banco de dados com scripts SQL
O exemplo a seguir descreve as etapas para adicionar regras de firewall, implantar seu banco de dados usando scripts SQL e, em seguida, remover as regras de firewall:
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
Implantar o banco de dados condicionalmente
Você pode optar por implantar somente builds específicos em seu banco de dados do Azure, oferecendo mais controle sobre quais alterações são aplicadas com base em critérios como o branch de origem ou o status de build.
Para fazer isso no YAML, você pode usar uma destas técnicas:
Isole as etapas de implantação em um trabalho separado e aplique uma condição a esse trabalho.
Adicione uma condição diretamente à etapa.
O exemplo a seguir mostra como implantar somente builds do ramo principal usando condições:
- 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>'
Mais ações do SQL
A tarefa implantação do SQL Azure Dacpac pode não abranger todas as ações do SQL Server que você precisa executar. Nesses casos, você pode usar o PowerShell ou scripts de linha de comando para executar os comandos necessários.
Esta seção aborda casos de uso comuns para invocar a ferramentaSqlPackage.exe. Antes de executar essa ferramenta, verifique se você está usando um agente auto-hospedado com a ferramenta instalada.
Observação
Se você executar o SQLPackage na pasta em que ele está instalado, deverá prefixar o caminho com & e encapsulá-lo entre aspas duplas.
Sintaxe básica
<Path of SQLPackage.exe> <Arguments to SQLPackage.exe>
Você pode usar qualquer um dos seguintes scripts SQL com base na ação que deseja executar:
Cria um arquivo (.dacpac) de instantâneo de um banco de dados do SQL Server dinâmico ou do Banco de Dados SQL do Microsoft Azure.
Sintaxe de comando:
SqlPackage.exe /TargetFile:"<Target location of dacpac file>" /Action:Extract
/SourceServerName:"<ServerName>.database.windows.net"
/SourceDatabaseName:"<DatabaseName>" /SourceUser:"<Username>" /SourcePassword:"<Password>"
ou
SqlPackage.exe /action:Extract /tf:"<Target location of dacpac file>"
/SourceConnectionString:"Data Source=ServerName;Initial Catalog=DatabaseName;Integrated Security=SSPI;Persist Security Info=False;"
Exemplo:
SqlPackage.exe /TargetFile:"C:\temp\test.dacpac" /Action:Extract /SourceServerName:"DemoSqlServer.database.windows.net.placeholder"
/SourceDatabaseName:"Testdb" /SourceUser:"ajay" /SourcePassword:"SQLPassword"
Ajuda:
sqlpackage.exe /Action:Extract /?