SDK-style Sqlproj构建时设置变量,自动写入版本号与PR描述至版本表
解决方案:SDK-style SQL项目+Azure Pipelines自动版本控制与版本表插入
核心问题分析
DacVersion是dacpac的元数据版本,无法直接在部署脚本中作为sqlcmd变量使用;sqlcmd变量需要在构建/部署阶段显式传递,才能被脚本识别。以下是分步实现方案:
1. 配置SQL项目与部署后脚本
1.1 映射DacVersion为sqlcmd变量
在你的.sqlproj文件中添加以下配置,将DacVersion映射为可在脚本中使用的sqlcmd变量DatabaseVersion,同时预留ReleaseNotes变量接收PR描述:
<PropertyGroup> <!-- 绑定DacVersion到sqlcmd变量 --> <SqlCmdVariables> <DatabaseVersion>$(DacVersion)</DatabaseVersion> <ReleaseNotes>$(ReleaseNotes)</ReleaseNotes> </SqlCmdVariables> </PropertyGroup> <!-- 确保PostDeployment.sql被标记为部署后脚本 --> <ItemGroup> <None Include="PostDeployment.sql"> <DeploymentAction>PostDeploy</DeploymentAction> </None> </ItemGroup>
1.2 编写部署后插入脚本
在PostDeployment.sql中使用定义好的sqlcmd变量完成版本表插入:
-- 假设版本表结构为:CREATE TABLE VersionHistory (VersionNumber VARCHAR(50), ReleaseNotes TEXT, CreatedAt DATETIME DEFAULT GETDATE()) INSERT INTO dbo.VersionHistory (VersionNumber, ReleaseNotes) VALUES ('$(DatabaseVersion)', '$(ReleaseNotes)');
2. Azure Pipelines构建阶段配置
2.1 生成版本号(GitVersion)
添加GitVersion任务生成语义化版本号,输出变量GitVersion.SemVer:
- task: GitVersion@5 inputs: runtime: 'core' updateAssemblyInfo: false
2.2 预处理PR描述(转义特殊字符)
用PowerShell处理PR描述中的单引号,避免SQL语法错误,生成干净的ReleaseNotes变量:
- task: PowerShell@2 inputs: targetType: 'inline' script: | # 转义单引号,避免SQL插入报错 $cleanNotes = "$(System.PullRequest.Description)" -replace "'", "''" # 设置为Pipeline可用变量 Write-Host "##vso[task.setvariable variable=ReleaseNotes]$cleanNotes"
2.3 构建SQL项目并传递变量
使用MSBuild任务构建项目,设置DacVersion为GitVersion生成的版本号,同时传递ReleaseNotes变量:
- task: MSBuild@1 inputs: solution: '**/*.sqlproj' msbuildArguments: > /t:Build /p:DacVersion=$(GitVersion.SemVer) /p:ReleaseNotes=$(ReleaseNotes) /p:OutputPath=$(Build.ArtifactStagingDirectory)
3. Azure Pipelines发布阶段配置
使用SqlAzureDacpacDeployment任务部署dacpac,并显式传递sqlcmd变量,确保脚本能读取到值:
- task: SqlAzureDacpacDeployment@1 inputs: azureSubscription: '你的Azure订阅名称' ServerName: 'your-sql-server.database.windows.net' DatabaseName: '你的数据库名称' SqlUsername: 'SQL账号' SqlPassword: 'SQL密码' DacpacFile: '$(Build.ArtifactStagingDirectory)/**/*.dacpac' # 显式传递sqlcmd变量给部署引擎 AdditionalArguments: '/v:DatabaseVersion=$(GitVersion.SemVer) /v:ReleaseNotes=$(ReleaseNotes)'
关键注意事项
- 只有PR触发的Pipeline才能获取
$(System.PullRequest.Description),若需支持其他触发方式,可添加默认值或手动输入参数。 - 若使用本地SQL Server部署,可替换为
SqlDacpacDeploymentOnMachineGroup任务,参数逻辑一致。 - 确保版本表已存在于数据库中,或在预部署脚本中创建。
内容的提问来源于stack exchange,提问作者Angelure
相关产品推荐
相关产品推荐

