You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:14:59