Azure DevOps Pipeline中带有变量的条件OR

6
我有三个条件作为变量(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)]

当我将两个 "false" 作为 OR 条件(例如 checkCondition)时,问题就出现了。我应该得到 "false",但出于某种原因,我得到了 "true"。
  - 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

有人知道为什么条件会给出错误的结果吗?

谢谢!

你可以尝试使用 condition: or(variables.isRelease ,variables.isMaster) 吗?这可能会有所不同。https://developercommunity.visualstudio.com/content/problem/1236160/and-condition-on-stage-level-is-incorrectly-evaulu.html - Krzysztof Madej
@KrzysztofMadej 那将是非常有趣的。我过去也遇到过类似的问题。你可以尝试将你的或条件包装在 and(succeeded(), <your or condition>) 中。 - Mansoor
很遗憾,它仍然是不正确的(我得到了“true”)。 - Rozmaryn
但是,如果我在OR中放入完整的条件$[or(startsWith(variables['Build.SourceBranch'], 'refs/heads/master'), startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'))],我得到了正确的“false” :/ - Rozmaryn
3个回答

18

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


4

如之前所述,or需要是一个表达式,但如果您想让它更易读,并且在变量部分仅对表达式进行一次评估,则可以这样做:

or(eq(variables['isMaster'], 'true'), eq(variables['isRelease'], 'true'))

包含or的and语句的示例:

- task: AzureCLI@2
  displayName: Download feed.xml
  inputs:
    azureSubscription: vanillaResourceConnection
    scriptType: ps
    scriptLocation: inlineScript
    inlineScript: |
      az storage blob download --account-name $(storageAccount) --container-name '$web' --name feed.xml --file .ado\downloadedFeed.xml
   condition: and(succeeded(), or(eq(variables['isMaster'], 'true'), and(eq(variables['isTag'], 'true'), eq(variables['releaseCheck.isRelease'], 'true'))))

0

看起来这是可行的,因为这里有说明:

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

但它不能在任何地方使用。因此,如果您在根级别上有步骤,它将不起作用,但是如果按照以下方式放置它,它应该可以工作。

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%

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接