如何在 CD 的 Azure 管道中捕获和保留通用工件的工件包版本

How to capture and retain the artifact package version for Universal artifacts in azure pipelines for cd

我有这个使用 yaml 的 azure devops ci/cd 管道。我的 yaml 有两个阶段 CI 和 CD。我的 CI 阶段有一项工作叫做 BuildandDeploy。 CD 阶段有一个部署作业。我正在使用通用工件来发布和下载它们。在 CD 阶段,我使用 UniversalPackages devops 任务来下载工件。该任务有一个名为 vstsPackageVersion 的输入变量,它是通用工件中显示的包版本。我知道可以使用 $(Build.BuildId)$(Build.BuildNumber) 的另外两个变量。作为临时解决方案,我正在对通用工件的包版本进行硬编码。

我无法使用任一内置变量下载工件。由于 CI 和 CD 在同一个管道中,有没有办法存储和检索工件的包版本?是否有像 latest 这样的标识符,我可以使用它从通用包中获取最新的工件。

# specific branch build with batching
trigger:
  batch: true
  branches:
    include:
    - master

stages:
- stage: CI
  jobs:
  - job: BuildAndPublish
    pool:
      vmImage: 'Ubuntu-16.04'
    steps:
    - 
      script: |
          docker build -t $(dockerId).azurecr.io/$(imageName):$(version) .
          docker login -u $(dockerId) -p $(pswd) $(dockerId).azurecr.io 
          docker push $(dockerId).azurecr.io/$(imageName):$(version)

    - task: Bash@3
      displayName: Initialize Helm Client - create local repo
      inputs:
        targetType: 'inline'
        script: '
          helm init --client-only
        '
    - task: HelmDeploy@0
      displayName: Package helm chart 
      inputs:
        connectionType: 'Kubernetes Service Connection'
        command: 'package'
        chartPath: 'my-helm-dir'

    - task: UniversalPackages@0
      displayName: Publish helm package to my-company-artifacts
      inputs:
        command: 'publish'
        publishDirectory: '$(Build.ArtifactStagingDirectory)'
        feedsToUsePublish: 'internal'
        vstsFeedPublish: '$(my-feed-guid)'
        vstsFeedPackagePublish: 'my-artifact-name'
        versionOption: patch
        packagePublishDescription: 'My helm package descrition'

- stage: CD
  jobs:
  - deployment: DeployJob
    displayName: Deploy Job
    pool:
      vmImage: Ubuntu-16.04
    environment: dev
    strategy:
      runOnce:    
        deploy:
          steps:
          - task: UniversalPackages@0
            displayName: 'Universal download'
            inputs:
              command: download
              vstsFeed: '$(my-feed-name)'
              vstsFeedPackage: 'my-artifact-name'
              vstsPackageVersion: 0.0.32

          - task: ExtractFiles@1
            displayName: 'Extract files '
            inputs:
              archiveFilePatterns: '*.tgz'
              destinationFolder: 'my-folder'
              cleanDestinationFolder: true

基于 az artifacts universal cli 的通用包任务不支持 "latest version",但仅支持特定版本(顺便说一下,此 cli 处于预览状态)。

作为解决方法,您可以使用 Rest API 检索最新版本并设置新变量,然后在下载任务中使用此变量。

例如,添加获取版本号并设置变量的PowerShell任务:

- powershell: |
   $head = @{ Authorization = "Bearer $env:TOKEN" }
   $url = "https://feeds.dev.azure.com/{organization}/_apis/packaging/Feeds/{feed-name}/packages/{package-guid}?api-version=5.0-preview.1"
   $package = Invoke-RestMethod -Uri $url -Method Get -Headers $head -ContentType application/json
   $latestVersion = ($package.versions.Where({ $_.isLatest -eq $True })).version
   Write-Host "The latest version is $latestVersion"
   Write-Host "##vso[task.setvariable variable=latestVersion]$latestVersion"
  env:
    TOKEN: $(system.accesstoken)

现在,在下载任务中使用它:

vstsPackageVersion: $(latestVersion)