Azure DevOps 管道条件 - 为啥包含“并且始终”?
Posted
技术标签:
【中文标题】Azure DevOps 管道条件 - 为啥包含“并且始终”?【英文标题】:Azure DevOps pipeline condition - Why include "and always"?Azure DevOps 管道条件 - 为什么包含“并且始终”? 【发布时间】:2022-01-17 15:50:28 【问题描述】:在the documentation for conditions in Azure DevOps pipelines 中给出了以下示例:
and(always(), eq(variables['Build.Reason'], 'Schedule'))
为什么要包含“and(always()”部分?据我了解,它在语义上等同于:
eq(variables['Build.Reason'], 'Schedule')
还是我错过了什么?
【问题讨论】:
【参考方案1】:Kristoffer 说得对,这两个条件在行为上是等价的。
不过,我会提供一个使用长版本的理由:
and(always(), eq(variables['Build.Reason'], 'Schedule'))
在编写任务条件时,很容易忘记succeeded()
是默认值,如果不包含它,那么即使作业失败或取消,您的任务也会运行。
所以我认为在表达式中包含succeeded()
(或always()
或cancelled()
或其他)的所有条件都是一个好习惯;那么如果你看到一个条件没有它,像这样:
eq(variables['Build.Reason'], 'Schedule')
然后您会被提醒质疑该条件是否旨在包括失败/取消的工作。
将其更改为长版本可以消除该错误的风险。
【讨论】:
【参考方案2】:这个例子的标题是“如果构建计划运行,即使失败,即使取消”。
所以,这个条件:
eq(variables['Build.Reason'], 'Schedule')
用于“如果计划构建则运行”部分。
还有这个条件:
always()
用于“即使失败,即使取消”部分。
这两个由and(...)
组成。就是这样。
【讨论】:
但是我在这与在传统逻辑语句中添加“&& true”相关是正确的,它是多余的吗? 不,我不这么认为。always
谓词添加了特定条件。将其视为以下(虚构的)谓词:and(runIfFailing(), runIfCancelled())
>将其视为以下(虚构的)谓词:and(runIfFailing(), runIfCancelled())
如果这是真的,那么and
函数就不能像逻辑“与”一样工作。看起来您指的是逻辑“或”。以上是关于Azure DevOps 管道条件 - 为啥包含“并且始终”?的主要内容,如果未能解决你的问题,请参考以下文章
Azure DevOps Pipelines 中的条件阶段执行
如何:在 Azure DevOps YAML 中有条件地插入模板?
在 Azure DevOps 发布管道中运行 Java Selenium 测试
Azure DevOps 管道 VS 测试失败。所有这些单元测试都在本地通过