SQL 项目自动化

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

本文概述了跨不同软件交付平台的 SQL 项目的自动化选项。 使用自动化将 SQL 数据库项目集成到 CI/CD 管道中,并一致且重复地部署数据库更改。

要自动执行哪些任务

SQL 项目自动化通常涉及 CI/CD 管道中的两个关键任务:

  • 生成 SQL 项目:通过在dotnet build要编译的 SQL 数据库项目上运行来验证项目并生成部署项目(.dacpac)。 (可选)执行 代码分析 规则,在项目生成期间检查代码质量。

  • .dacpac部署:使用 SqlPackage 或特定于平台的任务将目标.dacpac数据库发布到目标数据库。 部署可以面向 Fabric 中的 Azure SQL 数据库、Azure SQL 托管实例、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
    

软件交付平台

选择与团队的工具、合规性和连接要求匹配的环境。

托管虚拟环境

Microsoft托管的 GitHub Actions 托管运行程序和 Azure Pipelines 代理的虚拟环境包括预安装的工具:

环境 .NET SDK SqlPackage
Windows操作系统 Preinstalled Preinstalled
Linux Preinstalled 未预安装
macOS Preinstalled 未预安装

在 Linux 和 macOS 环境中,将 SqlPackage 安装为工作流的一部分。 有关管道中的 SqlPackage 安装和版本控制的详细信息,请参阅 开发管道中的 SqlPackage

自承载环境

当你需要对环境进行更多控制时,请从自承载运行程序或代理进行部署,例如:

  • 网络隔离要求(访问未公开给公共 Internet 的数据库)
  • 自定义工具或特定 SqlPackage 版本
  • 合规性或安全策略

可以将自承载运行程序部署为 Azure 容器应用作业 ,以便执行事件驱动的无服务器执行。 使用此方法在 Dockerfile 中定义环境,并根据需要安装 SqlPackage 和其他工具。

GitHub Actions

Azure SQL 部署作azure/sql-action)提供了从任何 GitHub Actions 运行程序将 SQL 项目和.dacpac文件部署到 Azure SQL 和 SQL Server 的集成体验。

主要功能:

  • .dacpac部署、.sqlproj.sql脚本。
  • 支持 SQL 身份验证、Microsoft Entra ID 身份验证和服务主体身份验证。
  • 与 Azure SQL 数据库结合使用 azure/login时,自动添加和删除 Azure SQL 数据库的临时防火墙规则。
  • 适用于 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 数据库部署,请添加 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 提供用于将.dacpac文件和 SQL 脚本部署到 Azure SQL 数据库的 SqlAzureDacpacDeployment 任务。

主要功能:

  • .dacpac部署文件或执行 SQL 脚本。
  • 支持 SQL 身份验证、Microsoft Entra ID 身份验证和服务主体身份验证。
  • 自动管理 Azure SQL 数据库的防火墙规则。
  • 需要 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;"