问题描述
正在编写一个Azure Pipeline,其中使用拉取请求的targetBranchName
来定义要使用的测试环境。由于在执行之前,targetBranchName
没有值,所以他创建了一个“prepare”阶段,在其中捕获变量的值以在后续阶段使用。
- stage: prepare
jobs:
- job: variables
steps:
- checkout: none
- powershell: Write-Output "##vso[task.setvariable variable=TARGET;isOutput=true;isReadOnly=true]$(system.pullRequest.targetBranchName)"
随后,在后续阶段中,他想使用输出变量BRANCH_NAME
来确定是否应该运行该阶段,如果是的话,加载适当的组变量。他还想在作业变量中捕获输出变量的值,以便可以使用更“方便”的名称引用它。
阶段的条件似乎在使用prepare
作业中手动设置TARGET
值进行测试时正常工作,但实际上他看不到TARGET
的值,因此他添加了一个“print”步骤,结果显示TARGET
没有值。
他对于引用输出变量以复制其值(stage
vs. stageDependencies
)的方式不确定,或者是在dependencies
/stageDependencies
中恢复变量值的语法($()
,$[]
或${{}}
)是否有问题。
解决方案
请注意以下操作可能因版本差异或特定情况而有所不同。
为了在Azure Pipelines中引用前一个阶段中定义的输出变量,以定义阶段条件和新变量,你可以遵循以下步骤:
- 定义输出变量:
在“prepare”阶段的作业中,使用##vso[task.setvariable]
命令定义输出变量,如下所示:
yaml
- stage: prepare
jobs:
- job: variables
steps:
- checkout: none
- powershell: Write-Output "##vso[task.setvariable variable=TARGET;isOutput=true;isReadOnly=true]$(system.pullRequest.targetBranchName)"
-
在后续阶段中引用输出变量:
在后续阶段中,你可以使用dependencies
和stageDependencies
来引用输出变量。以下是你可以采用的两种方式: -
使用
dependencies
:
“`yaml- stage: deploy_to_cint
dependsOn: prepare
condition: and(succeeded(‘prepare’), in(dependencies.prepare.outputs[‘variables.TARGET’], ‘env1’, ‘env2’))
variables: - name: TARGET
value: $[ dependencies.prepare.outputs[‘variables.TARGET’] ] - group: ‘EnvironmentCredentials-$(TARGET)’
jobs: - job: debug
steps:- bash: echo This is running for $(TARGET).
“`
- bash: echo This is running for $(TARGET).
- stage: deploy_to_cint
-
使用
stageDependencies
:
“`yaml- stage: deploy_to_cint
stageDependencies:- stage: prepare
variables: - name: TARGET
alias: TARGET_FROM_PREPARE
condition: and(succeededStage(‘prepare’), in(stageDependencies.prepare.outputs[‘variables.TARGET_FROM_PREPARE’], ‘env1’, ‘env2’))
variables:
- stage: prepare
- group: ‘EnvironmentCredentials-$(TARGET_FROM_PREPARE)’
jobs: - job: debug
steps:- bash: echo This is running for $(TARGET_FROM_PREPARE).
“`
- bash: echo This is running for $(TARGET_FROM_PREPARE).
- stage: deploy_to_cint
无论你选择使用dependencies
还是stageDependencies
,都可以在后续阶段中引用输出变量并进行条件判断,以及加载适当的组变量。在上述示例中,env1
和env2
是你希望的TARGET
值,可以根据你的需求进行调整。
通过采用这些步骤,你应该能够成功引用前一个阶段中定义的输出变量,并在后续阶段中使用它来定义阶段条件和新变量。