Azure Pipelines迁移集成测试至windows-latest代理后LocalDB部署问题
解决Azure Pipelines中LocalDB部署dacpac失败的问题
问题原因
SQL Server Express LocalDB不支持内存优化文件组(Memory-Optimized Filegroups),你的dacpac中包含该特性,导致部署时无法创建对应的物理文件,触发报错。
解决方案
方案一:使用SQL Server Docker容器(推荐)
windows-latest代理预装了Docker,可以快速启动一个完整的SQL Server实例,支持所有高级特性:
- 添加启动SQL Server容器的步骤:
- powershell: | # 启动SQL Server 2022容器 docker run -d -p 1433:1433 --name sqlserver -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=TestPass123!" mcr.microsoft.com/mssql/server:2022-latest # 等待容器初始化完成 Start-Sleep -Seconds 30 displayName: 'Start SQL Server Container'
- 修改原有的Publish Database步骤,指向容器中的SQL Server:
- powershell: | dotnet tool update -g microsoft.sqlpackage $database='$(Database)' & SqlPackage /Action:Publish ` /SourceFile:$(Build.ArtifactStagingDirectory)\Database\Database.dacpac ` /TargetServerName:'localhost' ` /TargetDatabaseName:$database ` /TargetUser:'sa' ` /TargetPassword:'TestPass123!' ` /p:AllowIncompatiblePlatform=true ` /p:CreateNewDatabase=true ` /p:AllowUnsafeRowLevelSecurityDataMovement=true ` /P:DropObjectsNotInSource=true ` /p:DoNotDropObjectTypes='Logins;Users;Permissions;RoleMembership' displayName: 'Publish Database to Container'
方案二:移除dacpac中的内存优化文件组(如果业务允许)
如果你的集成测试不需要依赖内存优化特性,可以修改数据库项目:
- 删除MemoryFileGroup相关的文件组配置
- 移除所有使用内存优化的表或对象
- 重新生成dacpac后,即可正常部署到LocalDB
方案三:安装完整SQL Server Express到代理(不推荐)
在管道中添加SQL Server Express的安装步骤,但每次构建都需要重新安装,会大幅增加构建时间,仅作为备选方案:
- powershell: | Invoke-WebRequest -Uri "https://go.microsoft.com/fwlink/?linkid=2216722" -OutFile "SqlExpress.exe" .\SqlExpress.exe /Q /IACCEPTSQLSERVERLICENSETERMS /ACTION=Install /FEATURES=SQLEngine /INSTANCENAME=SQLEXPRESS /SECURITYMODE=SQL /SAPWD=TestPass123! Start-Sleep -Seconds 45 displayName: 'Install SQL Server Express'
内容的提问来源于stack exchange,提问作者Bart
相关产品推荐
相关产品推荐

