SQL 프로젝트 자동화

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

이 문서에서는 다양한 소프트웨어 배달 플랫폼에서 SQL 프로젝트에 대한 자동화 옵션의 개요를 제공합니다. 자동화를 사용하여 SQL 데이터베이스 프로젝트를 CI/CD 파이프라인에 통합하고 데이터베이스 변경 내용을 일관되고 반복적으로 배포합니다.

자동화할 내용

SQL 프로젝트 자동화에는 일반적으로 CI/CD 파이프라인의 두 가지 주요 작업이 포함됩니다.

  • SQL 프로젝트 빌드: 프로젝트의 유효성을 검사하고 컴파일할 SQL 데이터베이스 프로젝트에서 실행 dotnet build 하여 배포 아티팩트(.dacpac)를 생성합니다. 필요에 따라 코드 분석 규칙을 실행하여 프로젝트 빌드 중에 코드 품질을 확인합니다.

  • .dacpac배포: SqlPackage 또는 플랫폼별 작업을 사용하여 대상 데이터베이스에 게시 .dacpac 합니다. 배포는 패브릭의 Azure SQL Database, Azure SQL Managed Instance, SQL Server 또는 SQL 데이터베이스를 대상으로 할 수 있습니다.

SQL 프로젝트 빌드에서 dacpac 아티팩트 및 데이터베이스로의 배포로의 흐름을 보여 주는 다이어그램

이러한 단계를 CI/CD 파이프라인에 통합하면 모든 커밋에서 데이터베이스 변경 내용의 유효성이 검사되고 환경 간에 일관되게 배포됩니다.

공통 개념

아티팩트 흐름: 일반적인 파이프라인은 빌드 및 배포 단계를 구분합니다. 빌드 단계에서는 SQL 프로젝트를 컴파일하고 파일을 생성 .dacpac 한 다음, 파이프라인 아티팩트로 게시합니다. 후속 배포 작업(수동 승인 후) 아티팩트가 다운로드되어 대상 데이터베이스에 배포됩니다. 이렇게 분리하면 한 번 빌드하고 동일한 아티팩트도 여러 환경에 배포하여 일관성을 보장할 수 있습니다.

게시 또는 스크립트: 중요한 환경에 배포하기 전에 배포 계획을 검토할 수 있습니다. SqlPackage는 Script 변경 내용을 적용하지 않고 배포 중에 실행되는 T-SQL 스크립트를 생성하는 작업을 지원합니다. 제공된 T-SQL 스크립트를 사용하면 데이터베이스 관리자 또는 검토자가 이전 승인을 적용 .dacpac 하는 데 필요한 정확한 변경 내용을 검사할 수 있습니다. 마찬가지로 이 DeployReport 작업은 계획된 변경 내용에 대한 XML 보고서를 생성합니다.

환경 승인 및 게이트: 프로덕션 배포에는 일반적으로 의도하지 않은 변경을 방지하기 위해 승인 워크플로가 필요합니다. GitHub Actions와 Azure DevOps는 모두 환경 기반 승인을 지원합니다. GitHub에서 필요한 검토자 및 대기 타이머 를 사용하여 환경을 구성할 수 있습니다. Azure DevOps에서 환경은 승인 게이트, 업무 시간 제한 및 기타 배포 제어를 지원합니다. 이러한 컨트롤은 프로덕션에 도달하기 전에 데이터베이스 변경 내용을 검토하고 승인하는 데 도움이 됩니다.

필수 조건

SqlPackage는 플랫폼 간이며 Windows, Linux 및 macOS에서 실행됩니다. 환경 전체에서 일관된 동작을 보장하기 위해 .NET 전역 도구로 설치합니다.

  • 빌드 에이전트에 설치된 .NET SDK입니다.

  • 빌드 에이전트에 설치된 SqlPackage입니다. SqlPackage를 .NET 전역 도구로 설치할 수 있습니다.

    dotnet tool install --global microsoft.sqlpackage
    

소프트웨어 배달 플랫폼

팀의 도구, 규정 준수 및 연결 요구 사항과 일치하는 환경을 선택합니다.

관리되는 가상 환경

GitHub Actions 호스팅된 실행기 및 Azure Pipelines 에이전트에 대한 Microsoft 관리 가상 환경에는 사전 설치된 도구가 포함됩니다.

환경 .NET SDK SqlPackage
Windows Preinstalled Preinstalled
리눅스 Preinstalled 사전 설치되지 않음
macOS Preinstalled 사전 설치되지 않음

Linux 및 macOS 환경에서 워크플로의 일부로 SqlPackage를 설치합니다. 파이프라인의 SqlPackage 설치 및 버전 관리에 대한 자세한 내용은 개발 파이프라인의 SqlPackage를 참조하세요.

자체 호스팅 환경

다음과 같이 환경에 대한 더 많은 제어가 필요한 경우 자체 호스팅 실행기 또는 에이전트에서 배포합니다.

  • 네트워크 격리 요구 사항(공용 인터넷에 노출되지 않는 데이터베이스에 액세스)
  • 사용자 지정 도구 또는 특정 SqlPackage 버전
  • 규정 준수 또는 보안 정책

자체 호스팅 실행기를 이벤트 기반 서버리스 실행을 위한 Azure Container Apps 작업 으로 배포할 수 있습니다. 이 방법을 사용하여 Dockerfile에서 환경을 정의하고 필요에 따라 SqlPackage 및 기타 도구를 설치합니다.

GitHub Actions (GitHub 액션)

Azure SQL 배포 작업(azure/sql-action)은 GitHub Actions 실행기에서 Azure SQL 및 SQL Server에 SQL 프로젝트 및 .dacpac 파일을 배포하기 위한 통합 환경을 제공합니다.

주요 기능:

  • 또는 스크립트를 .dacpac.sqlproj.sql 배포합니다.
  • SQL 인증, Microsoft Entra ID 인증 및 서비스 주체 인증을 지원합니다.
  • 와 결합 azure/login하면 Azure SQL Database에 대한 임시 방화벽 규칙을 자동으로 추가 및 제거합니다.
  • Windows 및 Linux 실행기 모두에서 작동합니다.

예: GitHub Actions를 사용하여 SQL 프로젝트 배포

# .github/workflows/sql-deploy.yml
on: [push]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4

    - uses: azure/sql-action@v2
      with:
        connection-string: ${{ secrets.AZURE_SQL_CONNECTION_STRING }}
        path: './Database.sqlproj'
        action: 'publish'

임시 방화벽 규칙이 필요한 Azure SQL Database 배포의 azure/login 경우 다음 단계를 추가합니다 sql-action.

    - uses: azure/login@v2
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}

    - uses: azure/sql-action@v2
      with:
        connection-string: ${{ secrets.AZURE_SQL_CONNECTION_STRING }}
        path: './Database.dacpac'
        action: 'publish'

실행기에서 직접 SqlPackage를 사용할 수도 있습니다. 자세한 내용은 개발 파이프라인의 SqlPackage를 참조하세요.

Azure Pipelines (애저 파이프라인스)

Azure DevOps는 파일 및 SQL 스크립트를 Azure SQL Database에 배포하기 .dacpac 위한 SqlAzureDacpacDeployment 작업을 제공합니다.

주요 기능:

  • .dacpac 파일을 배포하거나 SQL 스크립트를 실행합니다.
  • SQL 인증, Microsoft Entra ID 인증 및 서비스 주체 인증을 지원합니다.
  • Azure SQL Database에 대한 방화벽 규칙을 자동으로 관리합니다.
  • Windows 에이전트가 필요합니다(Linux 에이전트에서 직접 SqlPackage 사용).

예: Azure DevOps를 사용하여 .dacpac 배포

# azure-pipelines.yml
trigger:
  - main

pool:
  vmImage: 'windows-latest'

steps:
- task: SqlAzureDacpacDeployment@1
  inputs:
    azureSubscription: 'your-service-connection'
    AuthenticationType: 'server'
    ServerName: 'your-server.database.windows.net'
    DatabaseName: 'your-database'
    SqlUsername: '$(SqlUser)'
    SqlPassword: '$(SqlPassword)'
    deployType: 'DacpacTask'
    DeploymentAction: 'Publish'
    DacpacFile: '$(Build.ArtifactStagingDirectory)/Database.dacpac'

Linux 에이전트 또는 배포 프로세스에 대한 더 많은 제어의 경우 SqlPackage를 직접 사용합니다.

steps:
- task: UseDotNet@2
  inputs:
    packageType: 'sdk'
    version: '8.x'

- script: dotnet tool install --global microsoft.sqlpackage
  displayName: 'Install SqlPackage'

- script: |
    sqlpackage /Action:Publish \
      /SourceFile:$(Build.ArtifactStagingDirectory)/Database.dacpac \
      /TargetConnectionString:"$(ConnectionString)"
  displayName: 'Deploy database'

기타 CI/CD 플랫폼

GitLab CI/CD, Jenkins, CircleCI 등과 같은 플랫폼의 경우 SqlPackage를 직접 사용하여 SQL 프로젝트를 빌드하고 배포합니다.

프로젝트 빌드

dotnet build ./Database.sqlproj -c Release

다음을 배포합니다. .dacpac

sqlpackage /Action:Publish \
  /SourceFile:./bin/Release/Database.dacpac \
  /TargetConnectionString:"Server=your-server;Database=your-db;User Id=user;Password=password;"