Azure Pipelines如何在每个阶段过滤“仅限手动”的工件触发了发布

时间:2019-06-15 18:02:43

标签: azure-devops azure-pipelines azure-pipelines-release-pipeline

比方说,我有以下3个阶段:开发,质量控制,生产。

我的要求是:

  1. 仅来自特定分支(版本/ *)的工件可以部署到QC / Prod
  2. 所有分支的工件都可以部署到Dev

对于“ After stage”触发的发布,我可以使用工件过滤器实现我想要的功能,但对于“仅限手册”,我需要它。

有没有一种解决方法,可以让我控制/过滤哪些工件可用于特定阶段/环境的部署?

enter image description here

基本上,我需要相当于Octopus Channels的Azure DevOps。

更新
我想我已经接近解决方案了。
在“部署前条件”中,我可以添加一个新的Deployment Gate来进行Rest API调用。 例如URL suffix=/Release/releases/76

现在,我只需要正确解析ApiResponse,因为下面的成功标准不起作用

eq(root['artifacts[0].definitionReference.branch.id'], 'refs/heads/master')
  

表达式'eq(root ['artifacts [0] .definitionReference.branch.id'],'refs / heads / master')'的求值失败。

2 个答案:

答案 0 :(得分:2)

如您所说,您可以在舞台上使用“部署门”来完成此操作。

  1. 从项目设置->管道->服务连接创建新的通用服务连接。
    对于服务URL,类似https://vsrm.dev.azure.com/{OrgName}/{ProjectName}/_apis

  2. 在您的舞台上,打开“部署前条件”

  3. 启用Gates选项。

  4. 添加一个新的Invoke REST API门,并将评估前的延迟设置为0分钟。
    4.1将连接类型设置为“通用”。
    4.2选择您在步骤1中创建的服务连接。
    4.3将方法设置为GET。
    4.4将URL后缀设置为/Release/releases/$(Release.ReleaseId)
    4.5在“高级”区域,将“完成事件”设置为ApiResponse。
    4.6在“高级”区域,将成功条件设置为(或startsWith)
    eq(root['artifacts'][0]['definitionReference']['branch']['id'],'refs/heads/master')

现在,如果尝试不从master分支部署工件,则部署将失败

答案 1 :(得分:1)

有一种解决方法:

在QC / Prod阶段添加一个自定义条件,即仅在工件源分支为release/*的情况下才执行作业:

startsWith(variables['Release.Artifacts.{Artifacts-Alias}.SourceBranch'], 'refs/heads/release')

enter image description here

现在,当您手动运行QC / Prod阶段并且该发行版中未包含工件时,将不执行该作业:

enter image description here