Udostępnij za pośrednictwem


Wdrażanie bazy danych Azure SQL

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

Aktualizacje bazy danych można wdrożyć automatycznie w bazie danych Azure SQL Database po każdej pomyślnej kompilacji.

Wymagania wstępne

produkt Wymagania
Azure DevOps projekt usługi Azure DevOps.
Uprawnienia: -
    — Aby utworzyć połączenia usług, musisz mieć rolę administratora lub twórcy dla połączeń usług.

Pakiet DACPAC

Najprostszym sposobem wdrożenia bazy danych jest użycie pakietu warstwy danych lub pakietu DACPAC. DACPACs umożliwiają pakowanie i wdrażanie zmian schematu i danych. Możesz utworzyć pakiet DACPAC przy użyciu Projektu bazy danych SQL w programie Visual Studio.

Zadanie wdrażania usługi Azure SQL Database jest podstawowym mechanizmem wdrażania bazy danych na platformie Azure. To zadanie, podobnie jak w przypadku innych wbudowanych zadań platformy Azure, wymaga połączenia z usługą platformy Azure jako danych wejściowych. Połączenie usługi Azure przechowuje poświadczenia do łączenia Azure Pipelines z platformą Azure.

Najprostszym sposobem rozpoczęcia pracy z tym zadaniem jest zalogowanie się jako użytkownik, który jest właścicielem zarówno organizacji usługi Azure DevOps, jak i subskrypcji platformy Azure. W takim przypadku nie trzeba ręcznie tworzyć połączenia usługi. W przeciwnym razie, aby dowiedzieć się, jak utworzyć połączenie z usługą platformy Azure, zobacz Tworzenie połączenia z usługą platformy Azure.

Aby dowiedzieć się, jak utworzyć połączenie z usługą platformy Azure, zobacz Tworzenie połączenia z usługą platformy Azure.

Aby wdrożyć pakiet DACPAC w bazie danych Azure SQL Database, użyj zadania wdrażania usługi Azure SQL Database. Dodaj następujący fragment kodu do pliku 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>'

Skrypty SQL

Alternatywnie możesz użyć skryptów SQL zamiast pakietu DACPAC do wdrożenia bazy danych. Poniżej znajduje się prosty skrypt SQL, który tworzy pustą bazę danych:

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

Aby uruchomić skrypty SQL z Twojego potoku, należy dodać i usunąć reguły zapory z platformy Azure. Bez tych reguł agent usługi Azure Pipelines nie może komunikować się z usługą Azure SQL Database.

Ustawianie reguł zapory platformy Azure

Poniższy skrypt programu PowerShell tworzy reguły zapory sieciowej. Zapisz go jako SetAzureFirewallRule.ps1 i dodaj go do repozytorium:

[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

Usuwanie reguł zapory platformy Azure

Poniższy skrypt programu PowerShell usuwa reguły zapory. Zapisz go jako RemoveAzureFirewallRule.ps1 i dodaj go do repozytorium:

[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

Wdrażanie bazy danych za pomocą skryptów SQL

W poniższym przykładzie przedstawiono kroki dodawania reguł zapory, wdrażania bazy danych przy użyciu skryptów SQL, a następnie usuwania reguł zapory:

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

Warunkowe wdrażanie bazy danych

Możesz zdecydować się na wdrożenie tylko określonych kompilacji w bazie danych platformy Azure, co zapewnia większą kontrolę nad tym, które zmiany są stosowane na podstawie kryteriów, takich jak gałąź źródłowa lub stan kompilacji.

Aby to zrobić w języku YAML, możesz użyć jednej z następujących technik:

  • Izoluj kroki wdrażania do oddzielnego zadania i zastosuj warunek do tego zadania.

  • Dodaj warunek bezpośrednio do kroku.

W poniższym przykładzie pokazano, jak wdrażać tylko kompilacje z gałęzi głównej przy użyciu warunków:

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

Więcej akcji SQL

Zadanie wdrażania usługi SQL Azure Dacpac może nie obejmować wszystkich akcji serwera SQL, które należy wykonać. W takich przypadkach można użyć programu PowerShell lub skryptów wiersza polecenia, aby wykonać wymagane polecenia.

W tej sekcji opisano typowe przypadki użycia wywoływania narzędziaSqlPackage.exe. Przed uruchomieniem tego narzędzia upewnij się, że używasz własnego agenta z zainstalowanym narzędziem.

Uwaga

Jeśli uruchamiasz SQLPackage z folderu, w którym jest zainstalowany, musisz poprzedzić ścieżkę prefiksem & i ująć ją w podwójne cudzysłowy.

Podstawowa składnia

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

Możesz użyć dowolnego z następujących skryptów SQL na podstawie akcji, którą chcesz wykonać:

Tworzy plik migawki bazy danych (dacpac) z działającego serwera SQL lub bazy danych Microsoft Azure SQL.

Składnia polecenia:

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

lub

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

Przykład:

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

Pomoc:

sqlpackage.exe /Action:Extract /?