【发布时间】:2021-04-29 17:17:54
【问题描述】:
我正在尝试使用 if 条件来执行一个操作块,但它似乎对我不起作用。我不完全确定我是否正确理解了 if 条件,但这就是我一直在使用它的方式 - 或者至少是它的简化版本。
# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml
name: MyTest-$(date:yyyyMMdd)$(rev:.r)
trigger: none
resources:
- repo: self
clean: false
fetchDepth: 2
variables:
- group: TestVG
- name: EnableSigning
value: true
- name: SignDebugBuilds
value: false
stages:
- stage: Stage_Build
displayName: Build Stage
dependsOn: []
jobs:
- job: Job_Build
displayName: Build Job
condition: succeeded()
dependsOn: []
pool:
vmImage: 'windows-latest'
variables:
BuildPlatform: AnyCPU
strategy:
matrix:
Debug:
BuildConfiguration: Debug
Retail:
BuildConfiguration: Retail
steps:
- template: param-test.yml
parameters:
Value: 'Build Solution 1'
#- script: echo 'Build Solution 1'
- ${{ if and(eq(variables['EnableSigning'], True), or(ne(variables['BuildConfiguration'], 'Debug'), eq(variables['SignDebugBuilds'], True))) }}:
#- script: echo 'Build Solution 2 IF check'
- template: param-test.yml
parameters:
Value: 'Build Solution 2 IF check'
- script: echo 'Build Solution 2 COND check'
condition: and(eq(variables['EnableSigning'], True), or(ne(variables['BuildConfiguration'], 'Debug'), eq(variables['SignDebugBuilds'], True)))
param-test.yml 文件是一个简单的文件,用于回显一行以进行日志记录/调试。
parameters:
Value: string
steps:
- script: echo '${{ parameters.Value }}'
我的期望是,对于调试版本,我会看到第一个日志,而其他 2 个日志会被跳过,而所有 3 个日志都将打印用于零售版本。
但是,我看到的是,对于调试版本,会打印第一个和第二个日志,而仅跳过第三个日志(脚本步骤中有明确条件的日志),而所有 3 个日志都打印用于零售构建。
为了澄清一些项目,我使用第三条日志作为对照来检查条件是否正确。这是我在我们的仓库中拥有的实际管道的高度简化版本。我们有一个主管道 YAML 文件,其中声明了所有变量,包括 EnableSigning 和 SignDebugBuilds。这将调用将 EnableSigning 和 SignDebugBuilds 标志传递给相同的模板文件。这种情况在子模板中会发生几次,直到其中一个子模板(负责构建的子模板)使用 if 检查中的参数中的这些。在实际管道中,我有条件使用参数而不是变量,但结果还是一样。
我查看了一些文档,但对于我们可以从 if 语句中得到什么并不是很清楚。而且由于模板标签不支持我们可以传入的显式条件,这似乎是除了维护与标志对应的模板文件的 2 个单独版本之外的唯一选择
【问题讨论】:
标签: azure-devops azure-devops-pipelines