Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 /?