Freigeben über


Azure SQL-Datenbank-Bereitstellung

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020

Sie können Ihre Datenbankupdates nach jedem erfolgreichen Build automatisch in Azure SQL-Datenbank bereitstellen.

Voraussetzungen

Produkt Anforderungen
Azure DevOps – Ein Azure DevOps-Projekt.
- Berechtigungen:
    – Um Dienstverbindungen zu erstellen, müssen Sie über die Rolle Administrator oder die Rolle Creator für Dienstverbindungenverfügen.

DACPAC

Die einfachste Möglichkeit zum Bereitstellen einer Datenbank ist die Verwendung eines Datenebenenpakets oder von DACPAC. Mit DACPACs können Sie Schemaänderungen und -daten packen und bereitstellen. Sie können eine DACPAC mit dem SQL-Datenbankprojekt in Visual Studio erstellen.

Die Azure SQL-Datenbankbereitstellungsaufgabe ist der primäre Mechanismus zum Bereitstellen einer Datenbank in Azure. Für diese Aufgabe ist wie bei anderen integrierten Azure-Aufgaben eine Azure-Dienstverbindung als Eingabe erforderlich. Die Azure-Dienstverbindung speichert die Anmeldeinformationen für die Verbindung von Azure Pipelines mit Azure.

Am einfachsten beginnen Sie mit dieser Aufgabe, wenn Sie unter einem Benutzerkonto angemeldet sind, das sowohl die Azure DevOps-Organisation als auch das Azure-Abonnement besitzt. In diesem Fall müssen Sie die Dienstverbindung nicht manuell erstellen. Andernfalls finden Sie Informationen zum Erstellen einer Azure-Dienstverbindung unter Erstellen einer Azure-Dienstverbindung.

Weitere Informationen zum Erstellen einer Azure-Dienstverbindung finden Sie unter Erstellen einer Azure-Dienstverbindung.

Verwenden Sie die Azure SQL-Datenbankbereitstellungsaufgabe, um einen DACPAC in einer Azure SQL-Datenbank bereitzustellen. Fügen Sie der YAML-Datei den folgenden Codeausschnitt hinzu:

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

Alternativ können Sie SQL-Skripts anstelle von DACPAC verwenden, um Ihre Datenbank bereitzustellen. Nachfolgend finden Sie ein einfaches SQL-Skript, das eine leere Datenbank erstellt:

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

Um SQL-Skripts aus Ihrer Pipeline auszuführen, müssen Sie Firewallregeln in Azure hinzufügen und entfernen. Ohne diese Regeln kann der Azure Pipelines-Agent nicht mit Azure SQL-Datenbank kommunizieren.

Festlegen von Azure-Firewallregeln

Das folgende PowerShell-Skript erstellt Firewallregeln. Speichern Sie es unter SetAzureFirewallRule.ps1 , und fügen Sie es Zu Ihrem Repository hinzu:

[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

Entfernen von Azure-Firewallregeln

Das folgende PowerShell-Skript entfernt Firewallregeln. Speichern Sie es unter RemoveAzureFirewallRule.ps1 , und fügen Sie es Zu Ihrem Repository hinzu:

[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

Bereitstellen der Datenbank mit SQL-Skripts

Im folgenden Beispiel werden die Schritte zum Hinzufügen von Firewallregeln beschrieben, die Datenbank mithilfe von SQL-Skripts bereitgestellt und dann die Firewallregeln entfernt:

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

Bedingtes Bereitstellen der Datenbank

Sie können auswählen, dass nur bestimmte Builds in Ihrer Azure-Datenbank bereitgestellt werden, sodass Sie mehr Kontrolle darüber haben, welche Änderungen basierend auf Kriterien wie dem Quellzweig oder dem Buildstatus angewendet werden.

Um dies in YAML zu bewerkstelligen, können Sie eine der folgenden Methoden verwenden:

  • Isolieren Sie die Bereitstellungsschritte in einen separaten Auftrag, und wenden Sie eine Bedingung auf diesen Auftrag an.

  • Fügen Sie dem Schritt eine Bedingung direkt hinzu.

Das folgende Beispiel zeigt, wie Sie nur Builds aus der Hauptzweigung mithilfe von Bedingungen bereitstellen:

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

Weitere SQL-Aktionen

Die SQL Azure Dacpac-Bereitstellungsaufgabe deckt möglicherweise nicht alle SQL Server-Aktionen ab, die Sie ausführen müssen. In solchen Fällen können Sie PowerShell- oder Befehlszeilenskripts verwenden, um die erforderlichen Befehle auszuführen.

In diesem Abschnitt werden häufig verwendete Anwendungsfälle zum Aufrufen des SqlPackage.exe Tools behandelt. Stellen Sie vor dem Ausführen dieses Tools sicher, dass Sie einen selbst gehosteten Agent verwenden, auf dem das Tool installiert ist.

Hinweis

Wenn Sie SQLPackage aus dem Ordner ausführen, in dem es installiert ist, müssen Sie dem Pfad & als Präfix voranstellen und in doppelte Anführungszeichen einschließen.

Grundlegende Syntax

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

Sie können eines der folgenden SQL-Skripts basierend auf der auszuführenden Aktion verwenden:

Erstellt eine Momentaufnahme einer Datenbank (DACPAC-Datei) von einem aktiven SQL Server oder einer Microsoft Azure SQL-Datenbank.

Befehlssyntax:

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

oder

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

Beispiel:

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

Hilfe:

sqlpackage.exe /Action:Extract /?