【问题标题】:Do Azure Pipelines coerce types for and() and or()?Azure Pipelines 是否强制使用 and() 和 or() 的类型?
【发布时间】:2021-04-23 01:12:06
【问题描述】:

我正在尝试检测是否应该发布构建。这取决于分支是否是功能分支和(功能分支的名称存储在组变量中或在运行构建时设置参数)。我没有从 and() 和 or() 中得到我所期望的逻辑,它似乎与类型强制有关。

    value: $[ startsWith(variables['build.sourceBranch'], 'refs/heads/feature') ]
  - name: autoPublishBranches
    value: $[ contains(variables['PublishBranches'], variables['build.sourceBranch']) ]
  - name: publishFeature
    value: $[ and( variables.featureBuild, or( variables.autoPublishBranches, ${{ parameters.manualPublishBranch }} ))]
  - name: publishToDocker
    value: $[ or( variables.autoPublishNonFeature, and( variables.featureBuild, or( variables.autoPublishBranches, ${{ parameters.manualPublishBranch }} ))) ]

  - name: debugTest
    value: $[ or('false', and('False', or('True', False))) ]

  - name: TruthTable_Or_1
    value: $[ or('false', 'false') ]
  - name: TruthTable_Or_2
    value: $[ or('false', 'true') ]
  - name: TruthTable_Or_3
    value: $[ or('true', 'false') ]
  - name: TruthTable_Or_4
    value: $[ or('true', 'true') ]
  - name: TruthTable_Or_5
    value: $[ or('False', 'false') ]
  - name: TruthTable_Or_6
    value: $[ or('True', 'true') ]
  - name: TruthTable_Or_7
    value: $[ or(False, False) ]
  - name: TruthTable_Or_8
    value: $[ or(True, True) ]
  - name: TruthTable_Or_9
    value: $[ or('False', 'False') ]
  - name: TruthTable_Or_10
    value: $[ or('True', 'True') ]
  - name: TruthTable_Or_11
    value: $[ or('False', False) ]
  - name: TruthTable_Or_12
    value: $[ or('True', True) ]

生产

  featureBuild:
    Parsing expression: <startsWith(variables['build.sourceBranch'], 'refs/heads/feature')>
    Evaluating: startsWith(variables['build.sourceBranch'], 'refs/heads/feature')
    Expanded: startsWith('refs/heads/user/dreuss/deploy_based_on_group_variable', 'refs/heads/feature')
    Result: 'False'
  autoPublishBranches:
    Parsing expression: <contains(variables['PublishBranches'], variables['build.sourceBranch'])>
    Evaluating: contains(variables['PublishBranches'], variables['build.sourceBranch'])
    Expanded: contains('refs/heads/user/dreuss/deploy_based_on_group_variable,refs/heads/master', 'refs/heads/user/dreuss/deploy_based_on_group_variable')
    Result: 'True'
  publishFeature:
    Parsing expression: <and( variables.featureBuild, or( variables.autoPublishBranches, False ))>
    Evaluating: and(variables['featureBuild'], or(variables['autoPublishBranches'], False))
    Expanded: and('False', or('True', False))
    Result: 'True'
  publishToDocker:
    Parsing expression: <or( variables.autoPublishNonFeature, and( variables.featureBuild, or( variables.autoPublishBranches, False )))>
    Evaluating: or(variables['autoPublishNonFeature'], and(variables['featureBuild'], or(variables['autoPublishBranches'], False)))
    Expanded: or('false', and(variables['featureBuild'], or(variables['autoPublishBranches'], False)))
    Result: 'True'
  debugTest:
    Parsing expression: <or('false', and('False', or('True', False)))>
    Evaluating: or('false', and('False', or('True', False)))
    Expanded: or('false', and('False', or('True', False)))
    Result: 'True'
  TruthTable_Or_1:
    Parsing expression: <or('false', 'false')>
    Evaluating: or('false', 'false')
    Expanded: or('false', 'false')
    Result: 'True'
  TruthTable_Or_2:
    Parsing expression: <or('false', 'true')>
    Evaluating: or('false', 'true')
    Expanded: or('false', 'true')
    Result: 'True'
  TruthTable_Or_3:
    Parsing expression: <or('true', 'false')>
    Evaluating: or('true', 'false')
    Expanded: or('true', 'false')
    Result: 'True'
  TruthTable_Or_4:
    Parsing expression: <or('true', 'true')>
    Evaluating: or('true', 'true')
    Expanded: or('true', 'true')
    Result: 'True'
  TruthTable_Or_5:
    Evaluating: or('false', 'false')
    Expanded: or('false', 'false')
    Result: 'True'
  TruthTable_Or_6:
    Evaluating: or('true', 'true')
    Expanded: or('true', 'true')
    Result: 'True'
  TruthTable_Or_7:
    Parsing expression: <or(False, False)>
    Evaluating: or(False, False)
    Expanded: or(False, False)
    Result: 'False'
  TruthTable_Or_8:
    Parsing expression: <or(True, True)>
    Evaluating: or(True, True)
    Expanded: or(True, True)
    Result: 'True'
  TruthTable_Or_9:
    Evaluating: or('false', 'false')
    Expanded: or('false', 'false')
    Result: 'True'
  TruthTable_Or_10:
    Evaluating: or('true', 'true')
    Expanded: or('true', 'true')
    Result: 'True'
  TruthTable_Or_11:
    Parsing expression: <or('False', False)>
    Evaluating: or('False', False)
    Expanded: or('False', False)
    Result: 'True'
  TruthTable_Or_12:
    Parsing expression: <or('True', True)>
    Evaluating: or('True', True)
    Expanded: or('True', True)
    Result: 'True'

不清楚为什么有时它会评估为“假”与“假”,并且根据文档 and() 和 or() 应该强制类型,但看起来它们不是(或者我的语法不正确)。我想我可以使用 eq() 并查看它是否强制执行,但这比我希望的要复杂。

【问题讨论】:

  • 未获得您的最新信息。只是想检查答案是否对您有帮助?如果是,您可以accept the answer。另外,如果仍有任何疑问,请随时在下面发表评论:-)

标签: azure-devops pipeline


【解决方案1】:

Boolean : TrueFalse 是布尔文字表达式。

String :必须单引号。例如:'false''true'

非空字符串,计算时会计算为 1(True boolean)。 True 和 False 实际上是值 10

如果逻辑或布尔表达式的结果为 1,则认为其结果为真,如果其计算结果为 0,则认为其结果为假。

这里我们以表达式:&lt;or('false', and('False', or('True', False)))&gt; 为例。我们可以认为是&lt;or(1, and(1, or(1, 0)))&gt;,结果是1 -> True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2013-06-04
    • 2021-03-17
    • 2020-06-27
    相关资源
    最近更新 更多