如何在 Azure DevOps 的 Script.PostDeployment.sql 中引用 sql 脚本(不是过程)?

Posted

技术标签:

【中文标题】如何在 Azure DevOps 的 Script.PostDeployment.sql 中引用 sql 脚本(不是过程)?【英文标题】:How do you reference a sql script (not procedure) in a Script.PostDeployment.sql in Azure DevOps? 【发布时间】:2019-10-01 10:57:51 【问题描述】:

如何在 Azure DevOps 构建中获取脚本(而非过程)的路径?

我正在尝试获取要在 Visual Studio 数据库项目 PostDeployment 中使用的解决方案或项目文件的路径。

在本地工作

在 Visual Studio 数据库项目的 Script.PostDeployment.sql 文件中,我有以下代码

SELECT @solutionDir = REPLACE('$(SolutionPath)','MySoulution.sln','');
SET @File = @solutionDir + 'myScript.sql'
-- and here I can use the @File

当我进行本地发布/或构建时,我可以使用变量/宏 $(SolutionPath) 获取解决方案的完整本地路径。

这样我可以指向我需要访问的脚本。

AzureDevops 失败

但 Azure DevOps 构建没有 $(SolutionPath) 宏,我收到 以下错误

SCRIPT.POSTDEPLOYMENT.SQL(17,32,17,32): Build error SQL72008: Variable SolutionPath is not defined.

所以我需要一种方法(在 AzureDevops 中)在构建步骤中获取脚本的路径。

我尝试过的

    我尝试了各种似乎不起作用的宏。 我曾尝试与predefined variables 合作 我尝试使用SqlCommandVariableOverride,但它似乎在前一段时间从数据库项目中消失了。

问题

    如何将 $(SolutionPath)(或其他内容)添加到我的构建步骤中,以便在本地和 Azure DevOps 构建中都可以使用? 是否有其他方法可以获取部署后 SQLCMD 文件的解决方案或项目 url? MSBuild Extension Pack 是我应该看的东西吗?如果这是我唯一的选择,我会的。

附言

我也created a ticket for this in Azure Pipelines Tasks,因为他们似乎没有那么积极地回答,我等不及了。

e.s

我在developercommunity.visualstudio.com 提出了同样的问题。让我们希望有人能够回答这个问题。如果是这样,我会用答案更新这个问题。

【问题讨论】:

您可以在构建管道中使用此任务来运行使用 SQLCMD 变量的部署后脚本 - marketplace.visualstudio.com/… 我不确定它是否适用于我的 Script.PostDeployment.sq 脚本。您的构建任务将在该任务之后运行,但如果数据库项目没有遇到找不到 $(SolutionPath) 变量的问题,那么它当时已经创建了一个 dacpac 文件。我认为需要另一种解决方案... 【参考方案1】:

所以首先仔细检查您的构建是否正在发布工件。构建的右上角应该有一个蓝色按钮,上面写着“工件”。要访问工件,您需要在构建完成后执行存档任务并将其指向

$(Build.ArtifactStagingDirectory)

那么我建议不要使用 SQL 直接引用构建服务器的文件系统。如果这是绝对必要的,那么您应该使用环境变量。

我建议为 SQL 脚本的部署设置一个发布管道。发布管道实际上是为部署而设计的,而构建是为编译而设计的。

要配置发布,请将其指向工件,然后您可以通过$(System.DefaultWorkingDirectory)/**/*.zip 访问该工件,然后运行您想要执行的任何命令来处理它。

【讨论】:

您好,谢谢,但不是我要找的。我正在处理的是在解决方案构建时创建的 *.dacpack,其中包含我需要的 postdeploy.sql 文件。 Script.PostDeployment.sql 文件需要在构建时包含一些内容才能设置这些路径。但是感谢您的尝试... 好吧,即使你的答案不是我想要的,这让我想到我可以将 *.dacpack 更改为 zip,然后操作文件的内容。在这个阶段,我不知道这将如何发展。然后我必须对 *.dacpac 进行 1.u-zip 压缩。 2. 将脚本的路径更改为构建的绝对路径。 3. 将文件重新压缩回 dackpack。必须有另一种方式 @Sturla 有一个免费的执行 SQL 脚本的 DevOps 插件marketplace.visualstudio.com/… 如果这不能让您到达您要去的地方,您还可以从发布代理或直接运行 powershell 脚本来自 DevOps。如果您使用 Azure SQL,则更容易,因为您可以直接从“azure SQL 部署”任务部署 DACPAC。

以上是关于如何在 Azure DevOps 的 Script.PostDeployment.sql 中引用 sql 脚本(不是过程)?的主要内容,如果未能解决你的问题,请参考以下文章

在 Azure Devops 中编写 EF6 迁移脚本

如何将 Azure DevOps Extension for Azure CLI 与 Azure DevOps Server 一起使用?

如何在 Azure Devops 中安装 Mac 配置文件?

如何从 Azure DevOps Pipeline 读取 Azure 文件共享文件

如何从 Azure Devops 服务器迁移到 Azure Devops 服务中的现有组织

如何在 Azure DevOps 变量组中使用 SecureFile?