다음을 통해 공유


Azure SQL Database 배포

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

빌드가 성공할 때마다 Azure SQL 데이터베이스에 데이터베이스 업데이트를 자동으로 배포할 수 있습니다.

필수 조건

제품 요구 사항
Azure DevOps - Azure DevOps 프로젝트.
- 권한:
    - 서비스 연결을 만들려면 서비스 연결에 대한 관리자 또는 작성자 역할이 있어야 합니다.

DACPAC

데이터베이스를 배포하는 가장 간단한 방법은 데이터 계층 패키지 또는 DACPAC를 사용하는 것입니다. DACPAC를 사용하면 스키마 변경 내용 및 데이터를 패키지하고 배포할 수 있습니다. Visual Studio에서 SQL Database 프로젝트를 사용하여 DACPAC를 만들 수 있습니다.

Azure SQL Database 배포 작업은 Azure에 데이터베이스를 배포하는 기본 메커니즘입니다. 다른 기본 제공 Azure 작업과 마찬가지로 이 작업에는 입력으로 Azure 서비스 연결이 필요합니다. Azure 서비스 연결은 Azure Pipelines에서 Azure로 연결하기 위한 자격 증명을 저장합니다.

이 작업을 시작하는 가장 쉬운 방법은 Azure DevOps 조직과 Azure 구독을 모두 소유하는 사용자로 로그인하는 것입니다. 이 경우 서비스 연결을 수동으로 만들 필요가 없습니다. 또는 Azure 서비스 연결을 만드는 방법을 알아보려면 Azure 서비스 연결 만들기를 참조하세요.

Azure 서비스 연결을 만드는 방법을 알아보려면 Azure 서비스 연결 만들기를 참조하세요.

Azure SQL 데이터베이스에 DACPAC를 배포하려면 Azure SQL Database 배포 작업을 사용합니다. 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>'

SQL 스크립트

또는 DACPAC 대신 SQL 스크립트를 사용하여 데이터베이스를 배포할 수 있습니다. 다음은 빈 데이터베이스를 만드는 간단한 SQL 스크립트입니다.

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

파이프라인에서 SQL 스크립트를 실행하려면 Azure에서 방화벽 규칙을 추가하고 제거해야 합니다. 이러한 규칙이 없으면 Azure Pipelines 에이전트는 Azure SQL Database와 통신할 수 없습니다.

Azure 방화벽 규칙 설정

다음 PowerShell 스크립트는 방화벽 규칙을 만듭니다. SetAzureFirewallRule.ps1로 저장한 뒤, 이를 리포지토리에 추가하세요.

[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

Azure 방화벽 규칙 제거

다음 PowerShell 스크립트는 방화벽 규칙을 제거합니다. RemoveAzureFirewallRule.ps1로 저장한 뒤, 이를 리포지토리에 추가하세요.

[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

SQL 스크립트를 사용하여 데이터베이스 배포

다음 예제에서는 방화벽 규칙을 추가하고 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: '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

조건부로 데이터베이스 배포

특정 빌드만 Azure 데이터베이스에 배포하도록 선택할 수 있으므로 원본 분기 또는 빌드 상태와 같은 기준에 따라 적용되는 변경 내용을 더 자세히 제어할 수 있습니다.

YAML에서 이 작업을 수행하려면 다음 기술 중 하나를 사용할 수 있습니다.

  • 배포 단계를 별도의 작업으로 격리하고 해당 작업에 조건을 적용합니다.

  • 단계에 직접 조건을 추가합니다.

아래 예제에서는 조건을 사용하여 주 분기의 빌드만 배포하는 방법을 보여 줍니다.

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

추가 SQL 작업

SQL Azure Dacpac 배포 태스크는 수행해야 하는 모든 SQL Server 작업을 다루지 않을 수 있습니다. 이러한 경우 PowerShell 또는 명령줄 스크립트를 사용하여 필요한 명령을 실행할 수 있습니다.

이 섹션에서는 SqlPackage.exe 도구를 호출하는 일반적인 사용 사례에 대해 설명합니다. 이 도구를 실행하기 전에 도구가 설치된 자체 호스팅 에이전트를 사용하고 있는지 확인합니다.

참고

SQLPackage가 설치된 폴더에서 SQLPackage를 실행하는 경우, 경로를 &로 접두사하여 큰따옴표로 래핑해야 합니다.

기본 구문

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

수행하려는 작업에 따라 다음 SQL 스크립트를 사용할 수 있습니다.

라이브 SQL Server 또는 Microsoft Azure SQL Database에서 데이터베이스 스냅샷(.dacpac) 파일을 만듭니다.

명령 구문:

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

또는

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

예제:

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

도움말:

sqlpackage.exe /Action:Extract /?