在Azure Devops管道中使用条件或变量

时间:2020-11-02 17:31:23

标签: azure-devops yaml conditional-statements azure-pipelines

我有三个条件作为变量(isMaster,isRelease,isHotfix):

variables:
  isMaster: $[startsWith(variables['Build.SourceBranch'], 'refs/heads/master')]
  isRelease: $[startsWith(variables['Build.SourceBranch'], 'refs/heads/release/')]
  isHotfix: $[startsWith(variables['Build.SourceBranch'], 'refs/heads/hotfix/')]
  checkCondition: $[or(variables.isMaster, variables.isRelease)]

问题是当我为OR条件(例如checkCondition)输入两个“ false”时。 我应该得到“假”,但由于某种原因我得到“真”。

  - task: CmdLine@2
       inputs:
         script: |
           echo %BUILD_SOURCEBRANCH%
           echo %ISMASTER%
           echo %ISRELEASE%
           echo %ISHOTFIX%
           echo %CHECKCONDITION%
       condition: or(variables.isMaster ,variables.isRelease)
...
Result:
...
refs/heads/someBranch
False
False
False
True
Finishing: CmdLine

任何人都有一个想法,为什么条件会给出错误的结果? 谢谢!

2 个答案:

答案 0 :(得分:1)

使用OR function时,您需要使用or(expression, expression),然后它将表达式转换为Boolean进行求值。如果使用or(variables.isMaster ,variables.isRelease),则有两个字符,没有表达式可以转换为布尔值。您需要改用or(startsWith(variables['Build.SourceBranch'], 'refs/heads/master'), startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'))

答案 1 :(得分:0)

看起来很可行,因为它写为here

评估条件以决定是否开始一个阶段,工作或步骤。这意味着在该工作单元内运行时无法计算任何内容。例如,如果您有一个使用$ []语法使用运行时表达式设置变量的作业,则不能在自定义条件下使用该变量。

,但不能在任何地方使用。因此,如果您在根目录上有步骤,它将无法正常工作,但是如果您以这种方式进行操作,则应该如此

variables:
  isMaster: $[startsWith(variables['Build.SourceBranch'], 'refs/heads/master')]
  isRelease: $[startsWith(variables['Build.SourceBranch'], 'refs/heads/release/')]
  isHotfix: $[startsWith(variables['Build.SourceBranch'], 'refs/heads/hotfix/')]
  checkCondition: $[or(variables.isMaster, variables.isRelease)]

pool:
  vmImage: 'ubuntu-latest'

stages:
- stage: A
  jobs:
  - job: A1
    steps:
      - script: echo Hello Stage A!

- stage: B
  condition:  or(variables.isMaster ,variables.isRelease)
  jobs:
  - job: B1
    steps:
    - task: CmdLine@2
      inputs:
        script: |
          echo %BUILD_SOURCEBRANCH%
          echo %ISMASTER%
          echo %ISRELEASE%
          echo %ISHOTFIX%
          echo %CHECKCONDITION%
      condition: or(variables.isMaster ,variables.isRelease)
    - task: CmdLine@2
      inputs:
        script: |
          echo %BUILD_SOURCEBRANCH%
          echo %ISMASTER%
          echo %ISRELEASE%
          echo %ISHOTFIX%
          echo %CHECKCONDITION%