Azure Pipelines Universal Package 任务使用 'publishedPackageVar' 选项进行正确的版本部署

Azure Pipelines Universal Package task usage of 'publishedPackageVar' option for correct version deployment

我正在使用 Azure Pipelines,需要在一个阶段(构建)将文件上传到 Azure 工件,然后在另一个阶段(部署)下载具有相同版本的相同包。到目前为止,我已经通过使用通用包任务进行上传和下载来完​​成此操作,因此我在构建阶段使用选项 versionOption: 'patch' 上传包,并在部署阶段使用 vstsPackageVersion: '0.0.*' 下载包。

这是一个不错的解决方案,直到我遇到 运行 两个构建一个接一个地上传到同一个 Azure 工件提要的问题,并且由于我已经在构建和部署阶段之间设置了批准,管道的两次运行都会导致部署推送到提要的最新工件。

经过一些调查,我发现通用包上传任务有一个名为 publishedPackageVar 的选项,它将上传工件的名称和版本保存在一个变量中。我找不到关于此选项的任何文档,但据我所知,它将名称和版本存储为字符串,由 space 字符分隔:<artifact_name> <major>.<minor>.<patch>,以及 vstsPackageVersion 只需要 <major>.<minor>.<patch> 部分。

我的问题是:有没有人出于类似原因使用过此 publishedPackageVar 选项,将其传递给 vstsPackageVersion[= 的最佳方式是什么? 30=]通用包下载任务的选项?

我能想到的所有解决方案都需要一些丑陋的、多步骤的解决方法(比如使用 sed 从变量中获取版本并将其存储为新变量),这只会降低我的管道的可读性。

请参阅有关 Universal Package task

的文档

publishedPackageVar

Package Output Variable Provide a name for the variable that contains the published package name and version.

这个值默认由包名和版本号组成。我们无法修改任务中的格式。

如您所说,一种方法是使用脚本将版本号与此变量分开并存储在新变量中。

我想分享另一个方法

您可以使用自定义包版本号。然后就可以用counter expression构造一个增量版本号了。

变量可以直接分两个阶段使用

这是一个例子:

pool:
  vmImage: windows-2019

variables:
  major: 2
  minor: 9
  restnumber: 1
  patch: $[counter(variables['restnumber'], 0)]
  version: $(major).$(minor).$(patch)

stages:
- stage: Build
  jobs:
  - job: upload
    steps:
      - task: UniversalPackages@0
        inputs:
          command: 'publish'
          publishDirectory: '$(Build.sourcesdirectory)'
          feedsToUsePublish: 'internal'
          vstsFeedPublish: 'xx'
          vstsFeedPackagePublish: 'xx'
          versionOption: 'custom'
          versionPublish: '$(version)'

- stage: Stage
  jobs:
  - job: download
    steps:
      - task: UniversalPackages@0
        inputs:
          command: 'download'
          downloadDirectory: '$(System.DefaultWorkingDirectory)'
          feedsToUse: 'internal'
          vstsFeed: 'xx'
          vstsFeedPackage: 'xx'
          vstsPackageVersion: '$(version)'

在本例中,您可以通过改变变量:restnumber的值来重置计数器。