如何在 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)
我有这个使用 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)