条件表达式在 Azure DevOps 2019 中不起作用

Posted

技术标签:

【中文标题】条件表达式在 Azure DevOps 2019 中不起作用【英文标题】:Conditional Expression not working in Azure DevOps 2019 【发布时间】:2021-12-08 16:01:47 【问题描述】:

我正在尝试有条件地在 Azure DevOps Server 2019 中执行一个步骤。我按照说明进行操作 here。

我正在将一个 runTests 参数传递给我的模板。起初我在 Job 上尝试了一个条件,但是没有用,因为它总是使用模板中的默认值,所以我切换到了条件表达式。我的工作 YAML 现在看起来像

- job: TestJob
  pool: 'mypool'    
  #condition: eq('$ parameters.runTests ', 'true')
  workspace:
    clean: all
  steps:
  - script: echo $ parameters.runTests 
  - script: echo $ eq(parameters.runTests, 'true') 
  - $ if eq(parameters.runTests, 'true') :
    - task: UiPathTest@2
      inputs:
        testTarget: 'TestProject'
        orchestratorConnection: 'Orch'
        testProjectPath: '$(Build.SourcesDirectory)\$(projectPath)'
        folderName: $(folderName)

我添加了行来回显参数和表达式的结果。参数值为'true',正确,但eq(parameters.runTests, 'true')的结果始终为false。不过,我的 YAML 几乎与示例相同。有什么想法可能是错的吗?我没有任何错误。该步骤不存在。

【问题讨论】:

根据您的情况,删除参数名称周围的'$ ... '。条件语法将理解您试图在那里引用一个变量。可以选择在完整条件周围添加$[ ...] 不幸的是,这不起作用。 “由于存在验证错误或警告,无法将构建排队。/project-pipeline-template.yaml@templates(第 29 行,第 5 列):意外值 'if eq(parameters.runTests, 'true')'” 这是 Azure DevOps Server 2019 为什么你的条件行用 # 注释掉了? 因为这不适用于 DevOps Server 2019 中的参数。我正在对其进行测试并将其保留。Server 2019 将始终在该条件下使用默认值,而不是传入的值。 【参考方案1】:

我创建了一个类似的管道,但是为参数值添加了参数定义和指定类型。

parameters:
- name: runTests
  type: boolean

jobs:
  - job: TestJob
    #condition: eq('$ parameters.runTests ', 'true')
    workspace:
      clean: all
    steps:
    - script: echo $ parameters.runTests 
    - script: echo $ eq(parameters.runTests, True) 
    - $ if eq(parameters.runTests, True) :
      - task: Bash@3
        inputs:
          targetType: 'inline'
          script: |
            echo 'Hello world'

当触发管道时,我检查了 runTests 框

以下步骤按预期执行,echo 步骤均返回 True 另外还会执行条件 bash 脚本。

我建议将此参数设置为布尔值并将其与布尔值True 进行比较,而不是字符串'true'

【讨论】:

是在 Azure DevOps Server 2019 上吗?这就是我遇到问题的地方。我不认为我可以在 2019 年定义这样的参数。我也通过使用文件作为模板来传递参数。【参考方案2】:

事实证明,造成差异的是

variables:
  runTests: 'true'

---

jobs:
- template: template.yaml@templates  # Template reference
  parameters:
    runTests: $(runTests)

vs 跳过变量

---

jobs:
- template: template.yaml@templates  # Template reference
  parameters:
    runTests: 'true'

我不知道为什么。

【讨论】:

以上是关于条件表达式在 Azure DevOps 2019 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

azure devops cloud 和 azure devops server 2019 之间的区别

Azure DevOps 管道条件 - 为啥包含“并且始终”?

如何:在 Azure DevOps YAML 中有条件地插入模板?

Azure 拉取请求 | Azure Devops - “您必须在 '+' 运算符之后提供值表达式。”

Azure DevOps Pipelines 中的条件阶段执行

Azure Visual Studio 2019 无法推送到 Azure DevOps Git