'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 逻辑应用程序。
工作流程大致是:
When a HTTP request is received
Queue a new build
Delay until
FinishTime
个 Queue a new build
参见:Workflow image
Delay until
操作不起作用,因为排队的 FinishTime
是 0001-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
:
Delay
15 秒
HTTP
请求 Azure DevOps 构建,使用个人访问令牌进行身份验证
Parse JSON
status
和 result
关键字 的先前原始 HTTP
输出正文
- 设置
jarsBuildStatus = status
在跳出 Until
操作(循环)后,jarsBuildResult
被设置为已解析的 result
。
所有这些步骤都是更大的构建编排工作流的一部分,我在其中针对多个不同的 Azure DevOps 构建管道多次重复给定的步骤。
工作流中的最后一步是将所有 status
、result
和其他相关数据作为构建摘要发送到 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
操作。
我正在从 Azure 容器注册表中的 docker 图像的 https webhook 触发 Azure 逻辑应用程序。
工作流程大致是:
When a HTTP request is received
Queue a new build
Delay until
FinishTime
个Queue a new build
参见:Workflow image
Delay until
操作不起作用,因为排队的 FinishTime
是 0001-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
:
Delay
15 秒HTTP
请求 Azure DevOps 构建,使用个人访问令牌进行身份验证
Parse JSON
status
和result
关键字 的先前原始 - 设置
jarsBuildStatus = status
HTTP
输出正文
在跳出 Until
操作(循环)后,jarsBuildResult
被设置为已解析的 result
。
所有这些步骤都是更大的构建编排工作流的一部分,我在其中针对多个不同的 Azure DevOps 构建管道多次重复给定的步骤。
工作流中的最后一步是将所有 status
、result
和其他相关数据作为构建摘要发送到 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
操作。