Azure Pipelines 如何为“仅限手动”触发的版本筛选每个阶段的工件
Posted
技术标签:
【中文标题】Azure Pipelines 如何为“仅限手动”触发的版本筛选每个阶段的工件【英文标题】:Azure Pipelines how filter artifacts per stage for "Manual only" triggered Releases 【发布时间】:2019-06-15 18:02:43 【问题描述】:假设我有这 3 个阶段:Dev、QC、Prod。
我的要求是:
-
只能将来自特定分支 (release/*) 的工件部署到 QC/Prod
所有分支的工件都可以部署到 Dev
我可以使用 工件过滤器 来实现我想要的“后期”触发版本,但我需要它来实现“仅限手动”。
是否有一种解决方法可以让我控制/过滤哪些工件可用于特定阶段/环境的部署?
基本上,我需要相当于 Octopus Channels 的 Azure DevOps。
更新
我想我已经接近解决方案了。
在“部署前条件”中,我可以添加一个新的部署门,它会调用 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')' 的评估失败。
【问题讨论】:
【参考方案1】:正如你所说,你可以在你的阶段使用部署门来做到这一点。
从项目设置 -> 管道 -> 服务连接创建新的通用服务连接。
对于服务 URL,例如 https://vsrm.dev.azure.com/OrgName/ProjectName/_apis
在您的舞台上,打开部署前条件
启用 Gates 选项。
添加新的 Invoke REST API 门并将评估前的延迟设置为 0 分钟。
4.1 将连接类型设置为通用。
4.2 选择您在步骤 1 中创建的服务连接。
4.3 设置方法为GET。
4.4 设置URL后缀为/Release/releases/$(Release.ReleaseId)
4.5 在 Advanced 区域,将 Completion Event 设置为 ApiResponse。
4.6 在高级区域,将成功条件设置为(或startsWith)eq(root['artifacts'][0]['definitionReference']['branch']['id'],'refs/heads/master')
现在,如果您尝试部署不是来自 master 分支的工件,部署将失败
【讨论】:
我使用个人访问令牌通过登录名/密码验证我的请求。但他们的时间跨度有限,最长为 1 年。是否有更集成或更永久的解决方案来从发布门查询相同的组织 API? 嗨,这让我解决了我的问题,唯一的问题是即使使用完全访问 pat 令牌 _apis/release/releases/$(Release.ReleaseId) 总是给我一个找不到的页面,但我使用 /build/builds/$(Build.BuildId) 和 eq(root['sourceBranch'],'refs/heads/master') 以另一种方式管理它。不知道为什么根据 MS 文档,发布 url 不能正常工作 我很抱歉错过了 vsrm,构建 url 没有它但发布 url 需要它,我的错!【参考方案2】:有一个解决方法:
在 QC/Prod 阶段添加一个自定义条件,即作业将仅在工件源分支为 release/*
时执行:
startsWith(variables['Release.Artifacts.Artifacts-Alias.SourceBranch'], 'refs/heads/release')
现在,当您手动运行 QC/Prod 阶段并且工件不是来自发布时,将不会执行作业:
【讨论】:
Shayki,感谢您的回答。在我发布问题后,我读到了这个。我今天试试这个 我误解了你的回答,如果可能的话,我宁愿根本不做这份工作。我想我可以使用部署门来实现这一点,请参阅我的更新 哦,好吧,这也是个好主意,但是表达式文档太差了,我不知道如何让它工作:( 你说得对,我把这个外包给了我的兄弟,他找到了解决方案。尽管 +1,您的方法可能会在其他情况下有所帮助以上是关于Azure Pipelines 如何为“仅限手动”触发的版本筛选每个阶段的工件的主要内容,如果未能解决你的问题,请参考以下文章
对 Azure Boards 和 Azure Pipelines 使用相同的名称
将标签推送到外部 git 不会触发 Azure Pipelines CI
我可以通过 CLI 验证 azure-pipelines.yml 文件吗?
建立Azure Dev Ops持续集成和持续交付(CICD)(使用 Azure Pipelines 建立CICD)