Azure YAML从上一阶段运行的作业获取变量

问题描述 投票:0回答:1

我正在Azure DevOps中创建YAML管道,该过程包括两个阶段。

第一阶段(先决条件)负责读取git commit并创建一个逗号分隔的变量,其中包含已受到该提交影响的服务列表。

第二阶段(构建)负责构建项目并进行单元测试。此阶段包含许多templates,每个服务一个。在模板脚本中,作业将检查上一步创建的变量中是否有相关的Service。如果作业找到服务,它将继续构建和测试服务。但是,如果找不到服务,它将跳过该作业。

Run.yml:

stages:
- stage: Prerequisites
  jobs:
  - job: SetBuildQueue
    steps:
    - task: powershell@2
      name: SetBuildQueue
      displayName: 'Set.Build.Queue'
      inputs:
        targetType: inline
        script: |
            ## ... PowerShell script to get changes - working as expected
            Write-Host "Build Queue Auto: $global:buildQueueVariable"
            Write-Host "##vso[task.setvariable variable=buildQueue;isOutput=true]$global:buildQueueVariable"

- stage: Build
  jobs:
  - job: StageInitialization

  - template: Build.yml
    parameters:
      projectName: Service001
      projectLocation: src/Service001

  - template: Build.yml
    parameters:
      projectName: Service002
      projectLocation: src/Service002

Build.yml:

parameters:
  projectName: ''
  projectLocation: ''

jobs:
- job:
  displayName: '${{ parameters.projectName }} - Build'
  dependsOn: SetBuildQueue
  continueOnError: true
  condition: and(succeeded(), contains(dependencies.SetBuildQueue.outputs['SetBuildQueue.buildQueue'], '${{ parameters.projectName }}'))
  steps:
  - task: NuGetToolInstaller@1
    displayName: 'Install Nuget'

问题:

[运行第一阶段时,它将创建一个名为buildQueue的变量,该变量的填充如PowerShell脚本任务的控制台输出所示:

Service001 Changed
Build Queue Auto: Service001;

但是,当进入第二阶段并尝试运行构建模板时,在检查条件时会返回以下输出:

Started: Today at 12:05 PM
Duration: 16m 7s
Evaluating: and(succeeded(), contains(dependencies['SetBuildQueue']['outputs']['SetBuildQueue.buildQueue'], 'STARS.API.Customer.Assessment'))
Expanded: and(True, contains(Null, 'service001'))
Result: False

因此,我的问题是如何设置dependsOncondition以从上一阶段获取信息?

azure-devops dependencies yaml azure-pipelines
1个回答
0
投票

这是因为您希望在与定义变量不同的阶段访问变量。当前,这是不可能的,每个阶段都是新鲜代理的新实例。

this博客中,您可以找到一种解决方法,其中涉及利用pipeline artifacts将变量写入磁盘,然后将其作为文件传递。

将变量FOO从一个作业传递到另一个阶段的另一个作业:

  1. 创建一个文件夹,其中将包含您要传递的所有变量;任何文件夹都可以使用,但是类似mkdir -p $(Pipeline.Workspace)/variable的文件夹可能是个好主意。
  2. 将变量的内容写入文件,例如echo "$FOO" > $(Pipeline.Workspace)/variables/FOO。即使名称可以是您想要的任何名称,也可以为文件提供与变量相同的名称,这可能是个好主意。
  3. $(Pipeline.Workspace)/variables文件夹发布为名为variables的管道项目>
  4. 在第二阶段,下载变量管道工件
  5. 将每个文件读入变量,例如FOO=$(cat $(Pipeline.Workspace)/variables/FOO)
  6. 像在第一个示例中一样,将变量暴露在当前作业中:echo "##vso[task.setvariable variable=FOO]$FOO"
  7. 然后您可以通过在Azure Pipelines ($(FOO))中展开它来访问该变量,或者将其用作bash脚本($FOO)中的环境变量。
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.