Как перехватить и сохранить версию пакета артефактов для универсальных артефактов в лазурных конвейерах для cd - PullRequest
1 голос
/ 28 июня 2019

У меня есть этот конвейер 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

1 Ответ

1 голос
/ 30 июня 2019

Задача Universal Packages, основанная на az artifacts universal cli, которая не поддерживает «последнюю версию», а только конкретную версию (кстати, эта cli находится на предварительном просмотре).

В качестве обходного пути вы можете использовать API Rest для получения последней версии и установки новой переменной, а затем в задаче загрузки используйте эту переменную.

Например, добавьте задачу 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)

enter image description here

enter image description here

...