Azure DevOps SQL Dacpac 发布作业 - 提取构建变量

Azure DevOps SQL Dacpac release job - extracting build variables

我有一个 CI/CD 管道 运行 在 Azure DevOps 管道中发布数据库 (Visual Studio 2017 + SSDT)。该过程运行良好,但我正在尝试将一些构建信息记录到数据库中。

我创建了一个日志 table 来记录构建信息,并使用 this 作为我想要记录的信息的参考。我在项目属性“SQLCMD 变量”部分设置了变量以匹配我想要的变量(BuildID、Build.TriggeredBy.DefinitionName、Build.Reason、Build.SourceBranch、Build.SourceVersion、Build.SourceMessage).

我在 Azure DevOps 的“附加 SQLPackage.ext 参数”中放入了用于提取这些参数的 sqlcmd:

/v:BuildID=$(Build.BuildId) /v:BuildTriggeredBy=$(Build.TriggeredBy.DefinitionName) /v:BuildReason=$(Build.Reason) /v:BuildSourceBranch=$(Build.SourceBranch) /v:BuildSourceVersion=$(Build.SourceVersion) /v:BuildSourceMessage=$(Build.SourceVersionMessage)

我创建了一个 post 部署脚本,它将把这些值记录到日志 table 中。理论上每次发布成功,应该记录构建信息:

INSERT INTO dbo.ReleaseLog ([BuildID],[TriggeredBy],[Reason],[SourceBranch],[SourceVersion],[SourceVersionMessage]) 
VALUES ('$(BuildID)','$(BuildTriggeredBy)','$(BuildReason)','$(BuildSourceBranch)','$(BuildSourceVersion)','$(BuildSourceMessage)')

其中一些可以正常工作,但其他一些则根本不起作用。有效的是: BuildID、SourceBranch、SourceVersion

没有的(和 return "$(VariableName)")是: Build.TriggeredBy.DefinitionName、Build.Reason、Build.SourceVersion

有人知道为什么吗?我已经检查了所有变量,它们似乎没问题。我相信我包含的所有变量都应该在发布结束时可用。有些变量会起作用而其他变量却不起作用,这似乎很奇怪。我已经进行了三重检查(在 VS 和发布管道之间复制并粘贴了变量名称,并从 MS 站点复制了确切的名称),所以它看起来不像是代码问题。 Azure DevOps 错误?

Azure DevOps SQL Dacpac release job - extracting build variables

那是因为您在 发布管道 中创建了一个 post 部署脚本,它无法在 构建 [=] 中获取所有这些预定义变量26=]管道。

您可以检查 Classic release and artifacts variables. The variables Build.TriggeredBy.DefinitionName, Build.Reason, Build.SourceVersionMessage are not in the Classic release and artifacts variables, it in the Use predefined variables 中的那些变量。这就是您无法在发布管道中获取那些指定变量的原因。

(你的问题说的是Build.SourceVersion,但是根据你提供的图片,好像你写错了变量,应该是Build.SourceVersionMessage).

要解决此问题,您可以尝试在 build 管道中创建 post 部署脚本。

对于找到此内容的任何其他人,希望这将填补更多空白。

在数据库项目中定义一个变量

首先你必须在数据库项目文件的属性中定义一个变量(这里我叫我的YatesEnv):

  1. 右键单击该项目并查看其属性
  2. Select SQLCMD 变量
  3. 添加一个具有默认值的新变量

更新脚本文件

接下来更新您的 Post 或预部署脚本文件以使用它并注意它是如何作为字符串出现的,但我将它放在一个变量中以帮助我测试脚本:

declare @Environment varchar(200) = '$(YatesEnv)'

if @Environment = 'DEV' 
begin
    INSERT INTO [dbo].[Person] ([FirstName],[LastName],[DateOfBirth]) VALUES ('Bob', 'DEV', DATEADD(YEAR, -30, GETDATE()))
end
else if @Environment = 'QA' 
begin
    INSERT INTO [dbo].[Person] ([FirstName],[LastName],[DateOfBirth]) VALUES ('Bob', 'QA', DATEADD(YEAR, -30, GETDATE()))
end

更新发布管道任务

我们希望所有这些都构建一次,然后在您的 RELEASE 管道的每个部分中,您将像这样填充变量:

  1. Select“SQL 服务器数据库部署”任务
  2. 使用 /v:VariableName="some value" 语法更新“附加参数”部分。请注意,我对变量内容使用了双引号,因为单引号会导致管道错误。