SQL 项目自动化

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

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

要自动执行哪些任务

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

  • 构建 SQL 项目:通过在 SQL 数据库项目上运行 dotnet build 进行编译,验证项目并生成部署工件(.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
    

软件交付平台

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

托管虚拟环境

适用于 GitHub Actions 托管运行器和 Azure Pipelines 代理的 Microsoft 托管虚拟环境包括以下预装工具:

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

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

自托管环境

当需要更好地控制环境时,例如在以下情况下,请从自托管运行器或代理进行部署:

  • 网络隔离要求(访问未暴露到公共互联网的数据库)
  • 自定义工具或特定 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/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 数据库部署,请在 sql-action 之前添加 azure/login 步骤:

    - 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 提供了 SqlAzureDacpacDeployment 任务,用于将 .dacpac 文件和 SQL 脚本部署到 Azure SQL 数据库。

主要功能:

  • .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;"