'Delay until' 'Queue a new build' 的完成时间在 Azure 逻辑应用程序中不起作用

'Delay until' finish time of 'Queue a new build' not working in Azure Logic App

我正在从 Azure 容器注册表中的 docker 图像的 https webhook 触发 Azure 逻辑应用程序。

工作流程大致是:

参见:Workflow image

Delay until 操作不起作用,因为排队的 FinishTime0001-01-01T00:00:00

报错格式不对,我手动在FinishTime关键字后面加了一个Z

现在时间戳的格式是正确的,但是时间戳0001-01-01T00:00:00Z显然没有意义,后续步骤没有延迟执行。

有什么我遗漏的吗?

编辑:Queue a new build 将 Azure 管道构建排队。 IE。 FinishTime 属性 来自管道。

您需要在未来设置时间戳,您为"Delay until" 操作设置的时间戳0001-01-01T00:00:00Z 不是未来时间。如果您将时间戳设置为 2020-04-02T07:30:00Z,则 "Delay until" 操作将生效。

更新:

我不认为"Delay until"可以达到你期望的效果,但也许你可以参考下面的操作。只需添加一个"Condition"动作来判断FinishTime是否大于当前时间。

"Condition"中的表达式为:

sub(ticks(variables('FinishTime')), ticks(utcNow()))

简而言之,如果 FinishTime 大于当前时间 --> 执行 "Delay until" 操作。如果 FinishTime 小于当前时间 --> 做任何你想做的事。(顺便说一句,你需要注意你的时间戳的时区,也许你需要转换所有时区转换为 UTC)

我已经与一位 Azure 支持工程师取得联系,他已确认 Delay until 操作应该按照我的预期使用,但是 FinishTime 属性 不会保留我可以使用的值。

与此同时,我找到了一个解决方法,我在其中使用了一些逻辑和相当多的额外步骤。不方便,但至少它做到了我想要的。

以下是从 Webhook 触发工作流后执行的最重要步骤(docker Azure 容器注册表中的基础映像更新)。

基本上,我正在初始化以下变量并等待新构建:

  • buildStatusCompleted:包含目标值的字符串值completed
  • jarsBuildStatus:包含初始值的字符串值notStarted
  • jarsBuildResult:包含默认值failed
  • 的字符串值

然后,我使用 Until 操作来监视 jarsBuildStatus 的值何时切换到 completed

Until 操作中,我重复以下步骤,直到 jarsBuildStatus 将其值更改为 buildStatusCompleted:

  1. Delay 15 秒
  2. HTTP 请求 Azure DevOps 构建,使用个人访问令牌进行身份验证

  1. Parse JSON statusresult 关键字
  2. 的先前原始 HTTP 输出正文
  3. 设置jarsBuildStatus = status

在跳出 Until 操作(循环)后,jarsBuildResult 被设置为已解析的 result

所有这些步骤都是更大的构建编排工作流的一部分,我在其中针对多个不同的 Azure DevOps 构建管道多次重复给定的步骤。 工作流中的最后一步是将所有 statusresult 和其他相关数据作为构建摘要发送到 Azure DevOps。

对我来说,这只是一种解决方法,我会保留这个问题,看看其他人是否也有建议,或者 Azure 支持工程师可以更深入地了解 Delay until 操作。

这是最终工作流程的图片(至少是我实施 Delay until 操作的部分):

edit:事实证明,我可以简化工作流程,因为逻辑应用程序中有一个名为 Send an HTTP request to Azure DevOps 的专用 Azure DevOps 操作,它省略了手动身份验证的需要(Azure 支持工程师指出了这一点)。 现在的工作流程如下所示:

也就是我可以直接查询构建状态,设置jarsBuildStatus

@{body('Send_an_HTTP_request_to_Azure_DevOps:_jar''s')['status']}

上面的代码片段会自动转换为 Set variable 操作的值。因此,无需使用额外的 Parse JSON 操作。