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 测试失败。所有这些单元测试都在本地通过

在 Azure Devops 中部署管道后暂存槽的 Web 作业未停止

Azure Databricks 的 Azure DevOps 管道