即使构建不发布工件也会触发发布

Release is triggered even though build does not publish artifact

上周,我们的团队决定将所有独立的 .NET 项目移动到一个解决方案中。因为我们已经在为每个项目使用带有单独构建管道的 Azure DevOps,所以我们研究了仅在特定项目发生更改时才触发构建的可能性。这是为了防止构建代理在每次提交时重建整个解决方案。

因为我们的源存储库是本地托管的 Git,我们没有使用路径过滤器的好处,所以我们求助于使用 Powershell 任务来确定是否应该跳过所有即将到来的任务,使用自定义条件(在 SO 问题中解释)。

现在,在每次提交时,都会触发所有构建,但构建会自行解决是否应继续构建以及(更重要的是)是否应在最后发布构建工件。此类跳过构建的示例如下:

但是,每次这样的构建 'succeeds',都会创建一个新工件,即使跳过了发布工件任务。问题是当构建管道创建工件时,我们所有的发布管道都会被触发。因此,每次如上所示跳过构建时,发布管道都会触发并尝试部署工件。但它失败了,因为它用于部署的工件并不真正存在(看起来它是空的,构建管道实际上并没有在 Summary 选项卡上提到工件),所以在发布时对工件的任何操作都失败了管道。

我们的发布管道设置为在源类型 build artifact上触发,对于相应的构建管道,默认版本 参数设置为 latest.

即使跳过发布工件任务,发布管道仍会触发并尝试部署空工件,这怎么可能?

我假设您在发布管道中启用了继续交付,此选项与构建工件相关。这个选项表示构建成功后会触发Release(不管他有没有artifacts)

所以这就是每次构建后都会启动新版本的原因。

作为解决方法,您可以在构建中添加一个任务,仅当存在工件时才添加 "build tag",并且在发布工件选项中,您可以选择 [= 而不是选择 Latest 12=] 并指定您放入构建中的标签。
另一个选项是在 "Stages" 中单击触发器,然后将其配置为 "After release",因此启用 "Artifact filters" 并在其中指定构建标签。

如何添加构建标签?使用此命令添加 PowerShell 任务:

Write-Host "##vso[build.addbuildtag]test-tag"