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