Déploiement de base de données Azure SQL

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

Vous pouvez déployer automatiquement vos mises à jour de base de données sur la base de données Azure SQL après chaque build réussie.

DACPAC

Le moyen le plus simple de déployer une base de données consiste à créer un package de la hiérarchisation des données ou DACPAC. Les DACPC peuvent être utilisés pour empaqueter et déployer des modifications de schéma et des données. Vous pouvez créer un DACPAC à l’aide du projet de base de données SQL dans Visual Studio.

Pour déployer un DACPAC dans une base de données Azure SQL, ajoutez l’extrait de code suivant à votre fichier 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>'

Consultez également les informations d’authentification lors de l’utilisation de la tâche de déploiement de base de données Azure SQL.

Scripts SQL

Au lieu d’utiliser un DACPAC, vous pouvez également utiliser des scripts SQL pour déployer votre base de données. Voici un exemple simple de script SQL qui crée une base de données vide.

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

Pour exécuter des scripts SQL dans le cadre d’un pipeline, vous avez besoin d’Azure PowerShell scripts pour créer et supprimer des règles de pare-feu dans Azure. Sans les règles de pare-feu, l’agent Azure Pipelines ne peut pas communiquer avec Azure SQL Database.

Le script PowerShell suivant crée des règles de pare-feu. Vous pouvez archiver dans ce script comme SetAzureFirewallRule.ps1 dans votre référentiel.

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

Classique

[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
}

Le script PowerShell suivant supprime des règles de pare-feu. Vous pouvez archiver dans ce script comme RemoveAzureFirewallRule.ps1 dans votre référentiel.

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

Classique

[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
}

Ajoutez ce qui suit à votre fichier azure-pipelines.yml pour exécuter un script 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

Connexion de service Azure

La tâche de déploiement d’Azure SQL Database est le mécanisme principal pour déployer une base de données sur Azure. Cette tâche, comme avec d’autres tâches Azure intégrées, nécessite une connexion de service Azure en tant qu’entrée. Une connexion de service Azure stocke les informations d’identification pour se connecter à Azure à partir d’Azure Pipelines.

Le moyen le plus simple de commencer à utiliser cette tâche consiste à être connecté en tant qu’utilisateur propriétaire de l’organisation Azure DevOps et de l’abonnement Azure. Dans ce cas, vous n’avez pas besoin de créer manuellement la connexion de service. Sinon, pour savoir comment créer une connexion de service Azure, consultez Créer une connexion de service Azure.

Pour savoir comment créer une connexion de service Azure, consultez Créer une connexion de service Azure.

Déploiement conditionnel

Vous pouvez choisir de déployer uniquement certaines builds sur votre base de données Azure.

Pour faire cela dans YAML, vous pouvez utiliser l’une des techniques suivantes :

  • Isoler les étapes de déploiement dans un travail distinct et ajouter une condition à celui-ci.
  • Ajouter une condition à l’étape.

L’exemple suivant montre comment utiliser des conditions d’étape pour déployer uniquement des builds provenant de la branche principale.

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

Pour en savoir plus sur les conditions, consultez Spécifier des conditions.

Autres actions SQL

Déploiement SQL Azure Dacpac peut ne pas prendre en charge toutes les actions SQL Server que vous souhaitez effectuer. Dans ce cas, vous pouvez simplement utiliser PowerShell ou des scripts de ligne de commande pour exécuter les commandes dont vous avez besoin. Cette section présente certains des cas d’usage courants pour appeler l’outilSqlPackage.exe. Comme prérequis à l’exécution de cet outil, vous devez utiliser un agent auto-hébergé et installer l’outil sur votre agent.

Notes

Si vous exécutez SQLPackage à partir du dossier où il est installé, vous devez préfixer le chemin d’accès avec & et le mettre entre guillemets doubles.

Syntaxe de base

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

Vous pouvez utiliser l’un des scripts SQL suivants en fonction de l’action que vous souhaitez effectuer

Extraction

Crée un fichier de capture instantanée de base de données (.dacpac) à partir d’une base de données SQL Server ou Microsoft Azure SQL Database active.

Syntaxe de la commande :

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;"

Exemple :

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

Aide :

sqlpackage.exe /Action:Extract /?

Publier

met à jour de manière incrémentielle un schéma de base de données pour qu’il corresponde au schéma d’un fichier .dacpac source. Si la base de données n'existe pas sur le serveur, elle est créée par l'opération de publication. Dans le cas contraire, une base de données existante est mise à jour.

Syntaxe de la commande :

SqlPackage.exe /SourceFile:"<Dacpac file location>" /Action:Publish /TargetServerName:"<ServerName>.database.windows.net"
/TargetDatabaseName:"<DatabaseName>" /TargetUser:"<Username>" /TargetPassword:"<Password> "

Exemple :

SqlPackage.exe /SourceFile:"E:\dacpac\ajyadb.dacpac" /Action:Publish /TargetServerName:"DemoSqlServer.database.windows.net.placeholder"
/TargetDatabaseName:"Testdb4" /TargetUser:"ajay" /TargetPassword:"SQLPassword"

Aide :

sqlpackage.exe /Action:Publish /?

Exporter

exporte une base de données active, y compris son schéma et les données utilisateur, dans un package BACPAC (fichier .bacpac) à partir de SQL Server ou de Microsoft Azure SQL Database.

Syntaxe de la commande :

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

Exemple :

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

Aide :

sqlpackage.exe /Action:Export /?

Importer

importe le schéma et les données de table à partir d'un package BACPAC dans une nouvelle base de données utilisateur dans une instance de SQL Server ou de Microsoft Azure SQL Database.

Syntaxe de la commande :

SqlPackage.exe /SourceFile:"<Bacpac file location>" /Action:Import /TargetServerName:"<ServerName>.database.windows.net"
/TargetDatabaseName:"<DatabaseName>" /TargetUser:"<Username>" /TargetPassword:"<Password>"

Exemple :

SqlPackage.exe /SourceFile:"C:\temp\test.bacpac" /Action:Import /TargetServerName:"DemoSqlServer.database.windows.net.placeholder"
/TargetDatabaseName:"Testdb" /TargetUser:"ajay" /TargetPassword:"SQLPassword"

Aide :

sqlpackage.exe /Action:Import /?

DeployReport

crée un rapport XML sur les modifications devant être apportées par une action de publication.

Syntaxe de la commande :

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

Exemple :

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" 

Aide :

sqlpackage.exe /Action:DeployReport /?

DriftReport

crée un rapport XML sur les modifications apportées à une base de données inscrite depuis sa dernière inscription.

Syntaxe de la commande :

SqlPackage.exe /Action:DriftReport /TargetServerName:"<ServerName>.database.windows.net" /TargetDatabaseName:"<DatabaseName>"
/TargetUser:"<Username>" /TargetPassword:"<Password>" /OutputPath:"<Output XML file path for drift report>"

Exemple :

SqlPackage.exe /Action:DriftReport /TargetServerName:"DemoSqlServer.database.windows.net.placeholder" /TargetDatabaseName:"Testdb"
/TargetUser:"ajay" /TargetPassword:"SQLPassword" /OutputPath:"C:\temp\driftReport.xml"

Aide :

sqlpackage.exe /Action:DriftReport /?

Script

crée un script de mise à jour incrémentielle Transact-SQL qui met à jour le schéma d'une cible afin qu'il corresponde au schéma d'une source.

Syntaxe de la commande :

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

Exemple :

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"

Aide :

sqlpackage.exe /Action:Script /?