Compartir a través de


Implementación de una base de datos de Azure SQL

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

Puede implementar automáticamente las actualizaciones de la base de datos en la base de datos de Azure SQL después de cada compilación correcta.

Prerrequisitos

Producto Requisitos
Azure DevOps - Un proyecto de Azure DevOps .
- Permisos:
    - Para crear conexiones de servicio, debe tener el rol de Administrador o Creador para conexiones de servicio.

DACPAC

La manera más sencilla de implementar una base de datos es mediante un paquete de capa de datos o DACPAC. Las DACPAC permiten empaquetar e implementar cambios y datos de esquema. Puede crear un DACPAC mediante el proyecto de SQL Database en Visual Studio.

La tarea de implementación de Azure SQL Database es el mecanismo principal para implementar una base de datos en Azure. Esta tarea, al igual que con otras tareas integradas de Azure, requiere una conexión de servicio de Azure como entrada. La conexión de servicio de Azure almacena las credenciales para conectarse de Azure Pipelines a Azure.

La manera más fácil de empezar a trabajar con esta tarea es iniciar sesión como usuario propietario de la organización Azure DevOps y la suscripción de Azure. En este caso, no tendrá que crear manualmente la conexión de servicio. Por otro lado, para aprender a crear una conexión de servicio de Azure, consulte Creación de una conexión de servicio de Azure.

Para aprender a crear una conexión de servicio de Azure, consulte Creación de una conexión de servicio de Azure.

Para implementar un DACPAC en una base de datos de Azure SQL, use la tarea de implementación de Azure SQL Database. Agregue el siguiente fragmento de código al archivo 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, puede usar scripts SQL en lugar de DACPAC para implementar la base de datos. A continuación se muestra un script SQL sencillo que crea una base de datos vacía:

  USE [main]
  GO
  IF NOT EXISTS (SELECT name FROM main.sys.databases WHERE name = N'DatabaseExample')
  CREATE DATABASE [DatabaseExample]
  GO

Para ejecutar scripts SQL desde su pipeline, deberá agregar y quitar reglas de firewall en Azure. Sin estas reglas, el agente de Azure Pipelines no puede comunicarse con Azure SQL Database.

Establecimiento de reglas de Firewall de Azure

El siguiente script de PowerShell crea reglas de firewall. Guárdelo como SetAzureFirewallRule.ps1 y agréguelo al repositorio:

[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

Eliminación de reglas de Firewall de Azure

El siguiente script de PowerShell quita las reglas de firewall. Guárdelo como RemoveAzureFirewallRule.ps1 y agréguelo al repositorio:

[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

Implementación de una base de datos con scripts SQL

En el ejemplo siguiente se describen los pasos para agregar reglas de firewall, implementar la base de datos mediante scripts SQL y, a continuación, quitar las reglas 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

Implementación condicional de la base de datos

Puede optar por implementar solo compilaciones específicas en la base de datos de Azure, lo que proporciona más control sobre qué cambios se aplican en función de criterios como la rama de origen o el estado de compilación.

Para hacer esto en YAML, puede usar una de estas técnicas:

  • Aísle los pasos de implementación en un trabajo independiente y aplique una condición a ese trabajo.

  • Agregue una condición directamente al paso.

En el ejemplo siguiente se muestra cómo implementar solo compilaciones desde la rama principal mediante condiciones:

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

Más acciones de SQL

Es posible que la tarea de despliegue de Dacpac para SQL Azure no cubra todas las acciones de SQL Server que necesita realizar. En tales casos, puede usar PowerShell o scripts de línea de comandos para ejecutar los comandos necesarios.

En esta sección se tratan los casos de uso comunes para invocar la herramientaSqlPackage.exe. Antes de ejecutar esta herramienta, asegúrese de que usa un agente autohospedado con la herramienta instalada.

Nota:

Si ejecuta SQLPackage desde la carpeta donde está instalado, debe prefijar el trazado con & y encapsularla entre comillas dobles.

Sintaxis básica

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

Puede usar cualquiera de los siguientes scripts SQL en función de la acción que desea realizar:

Crea un archivo de instantáneas de base de datos (.dacpac) a partir de un servidor SQL activo o Microsoft Azure SQL Database.

Sintaxis de comandos:

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

o bien

SqlPackage.exe /action:Extract /tf:"<Target location of dacpac file>"
/SourceConnectionString:"Data Source=ServerName;Initial Catalog=DatabaseName;Integrated Security=SSPI;Persist Security Info=False;"

Ejemplo:

SqlPackage.exe /TargetFile:"C:\temp\test.dacpac" /Action:Extract /SourceServerName:"DemoSqlServer.database.windows.net.placeholder"
 /SourceDatabaseName:"Testdb" /SourceUser:"ajay" /SourcePassword:"SQLPassword"

Ayuda:

sqlpackage.exe /Action:Extract /?