Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020
Du kan automatiskt distribuera dina databasuppdateringar till Azure SQL-databasen efter varje lyckad version.
Förutsättningar
| Produkt | Kravspecifikationer |
|---|---|
| Azure DevOps | – Ett Azure DevOps-projekt. - behörigheter: – Om du vill skapa tjänstanslutningar måste du ha rollen Administratör eller Creator för tjänstanslutningar. |
DACPAC
Det enklaste sättet att distribuera en databas är att använda ett datanivåpaket eller DACPAC. Med DACPACs kan du paketera och distribuera schemaändringar och data. Du kan skapa en DACPAC med hjälp av SQL Database Project i Visual Studio.
Distributionsuppgiften för Azure SQL Database är den primära mekanismen för att distribuera en databas till Azure. Den här uppgiften, precis som med andra inbyggda Azure-uppgifter, kräver en Azure-tjänstanslutning som indata. Azure-tjänstanslutningen lagrar autentiseringsuppgifterna för att ansluta från Azure Pipelines till Azure.
Det enklaste sättet att komma igång med den här uppgiften är att loggas in som en användare som äger både Azure DevOps-organisationen och Azure-prenumerationen. I det här fallet behöver du inte skapa tjänstanslutningen manuellt. Om du vill lära dig hur du skapar en Azure-tjänstanslutning kan du läsa Skapa en Azure-tjänstanslutning.
Information om hur du skapar en Azure-tjänstanslutning finns i Skapa en Azure-tjänstanslutning.
Om du vill distribuera en DACPAC till en Azure SQL-databas använder du azure SQL Database-distributionsuppgiften. Lägg till följande kodfragment i YAML-filen:
- 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-skript
Du kan också använda SQL-skript i stället för DACPAC för att distribuera databasen. Nedan visas ett enkelt SQL-skript som skapar en tom databas:
USE [main]
GO
IF NOT EXISTS (SELECT name FROM main.sys.databases WHERE name = N'DatabaseExample')
CREATE DATABASE [DatabaseExample]
GO
Om du vill köra SQL-skript från din pipeline måste du lägga till och ta bort brandväggsregler i Azure. Utan dessa regler kan Inte Azure Pipelines-agenten kommunicera med Azure SQL Database.
Ange Azure-brandväggsregler
Följande PowerShell-skript skapar brandväggsregler. Spara den som SetAzureFirewallRule.ps1 och lägg till den på lagringsplatsen:
- ARM
- ASM (klassisk)
[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
Ta bort Azure-brandväggsregler
Följande PowerShell-skript tar bort brandväggsregler. Spara den som RemoveAzureFirewallRule.ps1 och lägg till den på lagringsplatsen:
- ARM
- ASM (klassisk)
[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
Distribuera databas med SQL-skript
I följande exempel beskrivs stegen för att lägga till brandväggsregler, distribuera databasen med SQL-skript och sedan ta bort brandväggsreglerna:
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
Distribuera databasen villkorligt
Du kan välja att endast distribuera specifika versioner till din Azure-databas, vilket ger dig mer kontroll över vilka ändringar som tillämpas baserat på kriterier som källgrenen eller byggstatusen.
Om du vill göra detta i YAML kan du använda någon av följande tekniker:
Isolera distributionsstegen till ett separat jobb och tillämpa ett villkor på det jobbet.
Lägg till ett villkor direkt i steget.
Exemplet nedan visar hur du endast distribuerar byggen från huvudgrenen med hjälp av villkor:
- 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>'
Fler SQL-åtgärder
Sql Azure Dacpac-distributionsuppgiften kanske inte omfattar alla SQL Server-åtgärder som du behöver utföra. I sådana fall kan du använda PowerShell- eller kommandoradsskript för att köra de kommandon som krävs.
Det här avsnittet beskriver vanliga användningsfall för att anropa verktygetSqlPackage.exe. Innan du kör det här verktyget kontrollerar du att du använder en lokalt installerad agent med verktyget installerat.
Anteckning
Om du kör SQLPackage från mappen där den är installerad måste du prefixa sökvägen med & och omsluta den med dubbla citattecken.
Grundläggande syntax
<Path of SQLPackage.exe> <Arguments to SQLPackage.exe>
Du kan använda något av följande SQL-skript baserat på den åtgärd som du vill utföra:
Skapar en databasögonblicksbildfil (.dacpac) från en live SQL-server eller Microsoft Azure SQL Database.
Kommandosyntax:
SqlPackage.exe /TargetFile:"<Target location of dacpac file>" /Action:Extract
/SourceServerName:"<ServerName>.database.windows.net"
/SourceDatabaseName:"<DatabaseName>" /SourceUser:"<Username>" /SourcePassword:"<Password>"
eller
SqlPackage.exe /action:Extract /tf:"<Target location of dacpac file>"
/SourceConnectionString:"Data Source=ServerName;Initial Catalog=DatabaseName;Integrated Security=SSPI;Persist Security Info=False;"
Exempel:
SqlPackage.exe /TargetFile:"C:\temp\test.dacpac" /Action:Extract /SourceServerName:"DemoSqlServer.database.windows.net.placeholder"
/SourceDatabaseName:"Testdb" /SourceUser:"ajay" /SourcePassword:"SQLPassword"
Hjälp:
sqlpackage.exe /Action:Extract /?