如何在Azure Pipelines中从上游CI流水线资源获取变量与参数值
解决方案
Azure DevOps默认不会将上游流水线的自定义参数、变量直接暴露给下游触发的流水线,你需要先在CI流水线中将需要传递的值导出,再在CD流水线中读取即可,具体操作步骤如下:
第一步:修改CI流水线,导出需要传递的参数和变量
在你原有CI流水线的所有执行步骤末尾,新增以下两个步骤,将environment参数和version变量标记为可跨流水线读取的输出变量,同时写入配置文件作为构建产物上传兜底:
# 你原有的CI流水线参数、变量、构建步骤均保持不变,在末尾追加以下内容 steps: # 原有所有构建步骤放在此处,下方是新增的导出步骤 - task: PowerShell@2 displayName: '导出需要传递给CD的参数变量' name: exportVars inputs: targetType: 'inline' script: | # 写入配置文件 $config = @{ environment = "${{ parameters.environment }}" version = "$(version)" } $config | ConvertTo-Json | Out-File -FilePath "$(Build.ArtifactStagingDirectory)/pipeline-config.json" -Encoding utf8 # 标记为跨流水线输出变量 Write-Host "##vso[task.setvariable variable=outputEnvironment;isOutput=true]${{ parameters.environment }}" Write-Host "##vso[task.setvariable variable=outputVersion;isOutput=true]$(version)" - task: PublishBuildArtifacts@1 displayName: '上传流水线配置产物' inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)/pipeline-config.json' ArtifactName: 'pipeline-config' publishLocation: 'Container'
第二步:修改CD流水线读取值
两种读取方式二选一即可,第二种读配置文件的方式兼容性更强,不受流水线变量作用域限制:
方式1:直接读取上游输出变量
在CD流水线中新增变量块引用CI的输出变量:
resources: pipelines: - pipeline: web-ci source: PoC-Web-CI trigger: branches: include: - cicd/azure-pipelines - develop # 新增变量块,引用CI导出的输出变量 variables: cdEnvironment: $[ resources.pipeline.web-ci.outputs['exportVars.outputEnvironment'] ] cdVersion: $[ resources.pipeline.web-ci.outputs['exportVars.outputVersion'] ] stages: - stage: 'Package_Deploy' jobs: - deployment: 'Deploy_to_Server' environment: 'PoC-Web.PoC_WEB_SERVER' strategy: rolling: deploy: steps: - task: CmdLine@2 inputs: script: | echo "Fetching CI Pipeline Environment Variables" echo "Pipeline-ID: $(resources.pipeline.web-ci.pipelineID)" echo "Source-Commit: $(resources.pipeline.web-ci.sourceCommit)" echo "Version: $(cdVersion)" echo "environment: $(cdEnvironment)"
提示:如果导出变量的步骤在CI的独立Job中,需要把引用路径加上Job名称,格式为
$[ resources.pipeline.web-ci.outputs['Job名.exportVars.outputEnvironment'] ]
方式2:读取CI上传的配置文件
stages: - stage: 'Package_Deploy' jobs: - deployment: 'Deploy_to_Server' environment: 'PoC-Web.PoC_WEB_SERVER' strategy: rolling: deploy: steps: # 先下载CI上传的配置产物 - task: DownloadBuildArtifacts@1 inputs: buildType: 'specific' project: '你的DevOps项目名称' definition: 'PoC-Web-CI' buildVersionToDownload: 'latest' downloadType: 'single' artifactName: 'pipeline-config' downloadPath: '$(System.ArtifactsDirectory)' - task: PowerShell@2 displayName: '读取CI传递的配置' inputs: targetType: 'inline' script: | $config = Get-Content "$(System.ArtifactsDirectory)/pipeline-config/pipeline-config.json" | ConvertFrom-Json Write-Host "##vso[task.setvariable variable=cdEnvironment]$($config.environment)" Write-Host "##vso[task.setvariable variable=cdVersion]$($config.version)" - task: CmdLine@2 inputs: script: | echo "Fetching CI Pipeline Environment Variables" echo "Pipeline-ID: $(resources.pipeline.web-ci.pipelineID)" echo "Source-Commit: $(resources.pipeline.web-ci.sourceCommit)" echo "Version: $(cdVersion)" echo "environment: $(cdEnvironment)"
内容的提问来源于stack exchange,提问作者Sainadh P
相关产品推荐
相关产品推荐

