在 AzureDevOps 管道中将仅在运行时已知的输出变量从 job1 传递到模板 job2

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

我有一个带有作业模板的天蓝色 DevOps 管道。

我需要将前一个作业中的变量传递到作业模板中。

在作业中,您可以导出变量:

echo "##vso[task.setvariable variable=runtimevar1]test"

在各个作业中,您可以设置一个标志,并将其导入到下一个作业的变量中:

    variables:
      var1: $[ dependencies.job1.outputs['setvars.runtimevar2'] ]

echo "##vso[task.setvariable variable=runtimevar2;isOutput=true]test2"

但是,当使用模板时,这不起作用,因为您无法将变量块传递给模板

当 job2 是模板时,是否有一种简单的方法将输出变量(仅在运行时已知)从 job1 传递到 job2?



完整示例:

  • 主要管道:
# ################################################################
# Update the network packages

# Push new network JSON to Topdesk
# Triggers whenever connectivityJSON is updated in main branch
# ################################################################

name: testing-passing-vars

trigger: none

stages:
- stage: stage1
  jobs:
  - job: job1
    steps:
    - checkout: self

    # set a variable
    - script: |
        echo "##vso[task.setvariable variable=runtimevar1]test"
        echo "##vso[task.setvariable variable=runtimevar2;isoutput=true]test2"
      name: setvars
      displayName: 'set vars'

    - script: |
        echo "within a job local var is available"
        echo runtimevar1: $(runtimevar1) # this works
        echo runtimevar2: $(runtimevar2) # this does not work
      displayName: echovars

  - job: job2
    dependsOn: job1
    variables:
      var2: "$[ dependencies.job1.outputs['setvars.runtimevar2'] ]"
    steps:
    - checkout: self

    - script: |
        echo "between jobs only the explicitely exported var is available and using the dependencies keyword in variable block op job"
        # echo runtimevar1: $(runtimevar1) # this will not work
        echo "var2: $(var2)" # this works
      displayName: echovars

  # this does not work
  - template: ./templates/jobs/test-job.yaml
    parameters:
      var1: "$[ dependencies.job1.outputs['setvars.runtimevar2'] ]"
      var2: "empty"
      dependson: job1
   
  # # this is not allowed
  # - template: ./templates/jobs/test-job-variables-template.yaml
  #   variables:
  #     var2: $[ dependencies.job1.outputs['setvars.runtimevar2'] ]
  #   parameters:
  #     var1: $(var2)
  #     var2: "empty"

  • “templates/jobs/test-job.yaml”内的模板
parameters:
  - name: var1
    type: string

  - name: var2
    type: string

  - name: dependson
    type: string

jobs:
  - job: testjob
    displayName: testjob-template1
    dependsOn: ${{ parameters.dependson }}
    variables:
      - name: localvar1
        value: "localvar"
      - name: remotevar
        value: "$[ dependencies.job1.outputs['setvars.runtimevar2'] ]"

    steps:
    - checkout: self

    # Get the Azure credentials for this environment
    - script: |
        echo param1 var1 ${{ parameters.var1 }}
        echo param2 var2 ${{ parameters.var2 }}
        echo local var ${{ variables.localvar1 }}
        echo remote var ${{ variables.remotevar }}
      displayName: 'echo vars'
azure-devops azure-pipelines cicd azure-pipelines-yaml
1个回答
0
投票

不能通过参数传递输出变量。参数需要提前给定,不能是运行时产生的。

但是您可以使用

$[ dependencies.job1.outputs['setvars.runtimevar2'] ]
在模板作业中定义变量,如示例代码中所示,然后使用它
echo remote var $(remotevar)
而不是
${{ variables.remotevar }}

我认为您遵循了正确的方法,但是使用变量时出现了一些错误

这是您的示例代码,进行了一些细微的修改。

main.yml

stages:
- stage: stage1
  jobs:
  - job: job1
    steps:
    # set a variable
    - script: |
        echo "##vso[task.setvariable variable=runtimevar1]test"
        echo "##vso[task.setvariable variable=runtimevar2;isoutput=true]test2"
      name: setvars
      displayName: 'set vars'

    - script: |
        echo runtimevar1: $(runtimevar1)
        echo runtimevar2: $(setvars.runtimevar2)
      displayName: echovars

  - job: job2
    dependsOn: job1
    variables:
      var2: $[ dependencies.job1.outputs['setvars.runtimevar2'] ]
    steps:
    - script: |
        echo "var2: $(var2)"
      displayName: echovars

  # this does not work
  - template: ./test-job.yaml
    parameters:
      var1: "hello world"

test-job.yml

parameters:
- name: var1
  type: string

jobs:
- job: testjob
  displayName: testjob-template1
  dependsOn: job1
  variables:
  - name: remotevar
    value: $[ dependencies.job1.outputs['setvars.runtimevar2'] ]

  steps:
  # Get the Azure credentials for this environment
  - script: |
      echo param1 var1 ${{ parameters.var1 }}
      echo remote var $(remotevar)
    displayName: 'echo vars'

请注意我的文件的相对路径

© www.soinside.com 2019 - 2024. All rights reserved.