如何通过Azure CICD使用DbUp库实现SQL Server数据库变更部署
基于Azure CI/CD + DbUp 部署SQL Server变更实现方案
1. 本地环境基础配置
- 创建.NET控制台项目(支持.NET Framework/.NET Core/.NET 5+,推荐使用LTS版本)
- 通过NuGet安装核心依赖包:
DbUp.SqlServer,需要自定义日志可以额外安装DbUp.Serilog或者直接使用内置控制台日志 - 项目根目录新建
Scripts文件夹,所有SQL变更脚本统一存储在此处,脚本命名必须遵循带序号的规则,例如Script0001_CreateUserTable.sql、Script0002_AddUserEmailColumn.sql,DbUp会按照文件名序号从小到大执行,避免执行顺序混乱 - 所有脚本建议设置为「嵌入式资源」:右键脚本文件→属性→生成操作选择「嵌入式资源」,打包时脚本会被嵌入到可执行文件中,避免部署时文件丢失
- 编写主程序核心执行逻辑,连接字符串从流水线变量传入无需硬编码,示例代码如下:
using System; using DbUp; namespace DbUpDeployment { class Program { static int Main(string[] args) { var connectionString = args[0]; var upgrader = DeployChanges.To .SqlDatabase(connectionString) .WithScriptsEmbeddedInAssembly(typeof(Program).Assembly) .LogToConsole() .Build(); var result = upgrader.PerformUpgrade(); if (!result.Successful) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(result.Error); Console.ResetColor(); return -1; } Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("数据库变更执行成功"); Console.ResetColor(); return 0; } } }
- 本地验证:传入测试库连接字符串运行控制台程序,确认脚本执行正常,DbUp会自动在目标库生成
SchemaVersions表,记录已经执行过的脚本,重复运行不会重复执行已成功的脚本
2. Azure DevOps CI流水线配置
CI阶段负责将DbUp项目打包为可执行制品,供CD阶段调用:
- 新建Azure DevOps流水线,关联代码仓库
- 添加.NET任务:执行
dotnet build,指定DbUp项目路径,配置为Release模式 - 添加.NET任务:执行
dotnet publish,参数配置为--configuration Release --output $(Build.ArtifactStagingDirectory)/dbup - 添加发布构建制品任务:将
$(Build.ArtifactStagingDirectory)/dbup下的内容发布为流水线制品,命名为DbUpPackage
3. Azure DevOps CD流水线配置
CD阶段负责将制品部署到对应环境的SQL Server实例:
- 新建发布流水线,关联CI阶段产出的
DbUpPackage制品 - 配置变量组,为不同环境(开发/测试/生产)设置对应的SQL Server连接字符串,注意连接字符串要勾选「保密变量」,避免明文泄露
- 添加「命令行」任务,运行DbUp可执行文件,传入对应环境的连接字符串作为参数:
- Windows环境部署:执行
DbUpDeployment.exe $(ProductionDbConnectionString) - 跨平台部署:执行
dotnet DbUpDeployment.dll $(ProductionDbConnectionString)
- Windows环境部署:执行
- 可选配置:生产环境添加部署前审批环节,需要负责人审批后再执行部署,避免误操作
- 可选配置:添加部署后验证任务,执行简单SQL查询验证变更是否符合预期
4. 落地最佳实践
- 所有SQL脚本必须是幂等的,例如创建表前先判断
IF NOT EXISTS,避免脚本重复执行报错 - 不要修改已经提交过的历史脚本,如果需要调整逻辑,新增更高序号的脚本执行修正逻辑
- 不同环境的流水线变量严格隔离,生产环境连接字符串仅开放给少数运维人员修改
- 每次部署前可以调用DbUp的
CreatePreviewReportAPI生成本次待执行脚本列表,提前预览变更内容
内容的提问来源于stack exchange,提问作者AzureDevOpsBeginner
相关产品推荐
相关产品推荐

