Azure Pipelines同流水线通用制品版本捕获复用及latest使用问询
解决方案:在同一Azure DevOps流水线中传递Universal制品版本号及获取最新版本的方法
针对你遇到的两个问题,我整理了具体的解决办法,结合你的现有YAML代码给出修改方案:
一、在CI和CD阶段之间传递制品版本号(推荐方案)
因为你的CI和CD在同一个流水线里,最可靠的方式是把CI阶段发布的制品版本号设为阶段级输出变量,让CD阶段直接引用。具体步骤如下:
1. 给CI的Universal发布任务命名并捕获输出变量
在你的Publish helm package to my-company-artifacts任务中添加name属性,方便后续引用它自动输出的publishedPackageVersion变量(这个变量是UniversalPackages任务内置的,会记录本次发布的版本号):
- task: UniversalPackages@0 displayName: Publish helm package to my-company-artifacts name: PublishUniversalPackage # 给任务起个唯一名称 inputs: command: 'publish' publishDirectory: '$(Build.ArtifactStagingDirectory)' feedsToUsePublish: 'internal' vstsFeedPublish: '$(my-feed-guid)' vstsFeedPackagePublish: 'my-artifact-name' versionOption: patch packagePublishDescription: 'My helm package descrition'
2. 将任务输出变量提升为阶段输出
在CI阶段的BuildAndPublish作业下添加outputs字段,把刚才的任务输出变量升级为整个CI阶段的输出变量,这样CD阶段就能访问到:
- stage: CI jobs: - job: BuildAndPublish pool: vmImage: 'Ubuntu-16.04' outputs: # 新增:定义阶段输出变量 packageVersion: $[ job.BuildAndPublish.outputs['PublishUniversalPackage.publishedPackageVersion'] ] steps: # 你的其他步骤保持不变...
3. 在CD阶段引用阶段输出变量
修改CD阶段的Universal下载任务,用$(CI.packageVersion)替换硬编码的版本号,同时确保CD阶段依赖CI阶段(默认已经依赖,但显式声明更清晰):
- stage: CD dependsOn: CI # 显式声明依赖CI阶段 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: $(CI.packageVersion) # 引用CI阶段的输出变量 # 你的其他步骤保持不变...
这样修改后,CD阶段就会自动下载CI阶段刚发布的那个版本的制品,完全不需要硬编码版本号。
二、使用latest标识符获取最新版本的制品
如果你确实需要跨流水线拉取通用制品的最新版本,UniversalPackages@0任务的vstsPackageVersion参数支持直接填写latest,它会自动拉取该制品的最新稳定版本:
- task: UniversalPackages@0 displayName: 'Universal download latest' inputs: command: download vstsFeed: '$(my-feed-name)' vstsFeedPackage: 'my-artifact-name' vstsPackageVersion: latest
不过要注意两个细节:
latest指向的是最新的正式发布版本,带预发布标签的版本不会被包含;- 如果是同一流水线内CI紧接着CD的场景,还是推荐用第一种阶段变量的方式,因为
latest可能会被其他并行运行的流水线发布的版本覆盖,导致CD下载到非当前CI的版本。
完整修改后的YAML参考
# specific branch build with batching trigger: batch: true branches: include: - master stages: - stage: CI jobs: - job: BuildAndPublish pool: vmImage: 'Ubuntu-16.04' outputs: packageVersion: $[ job.BuildAndPublish.outputs['PublishUniversalPackage.publishedPackageVersion'] ] 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 name: PublishUniversalPackage 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 dependsOn: CI 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: $(CI.packageVersion) - task: ExtractFiles@1 displayName: 'Extract files ' inputs: archiveFilePatterns: '*.tgz' destinationFolder: 'my-folder' cleanDestinationFolder: true
内容的提问来源于stack exchange,提问作者randominstanceOfLivingThing
相关产品推荐
相关产品推荐

