适用于:SQL Server
Azure 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 数据库。
将这些步骤集成到 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;"