如果发布失败,则CI管道失败

时间:2020-01-08 12:45:55

标签: azure-devops azure-pipelines

我正在尝试建立一个分支策略,其中在完成请求请求之前的构建验证必须确保构建和发布管道成功。我可以使CI管道失败,但是如果部署失败,我想使CI管道失败。我该怎么做呢?

我在CI管道.yaml之外有一个单独的Release管道。

谢谢

2 个答案:

答案 0 :(得分:1)

您可以设置目标分支的构建验证。它将强制您选择的构建管道与请求请求提供的文件一起运行。

https://docs.microsoft.com/en-us/azure/devops/repos/git/branch-policies?view=azure-devops

对于发布管道,添加Pull Request触发器并设置目标分支。它将使用您构建管道中的工件。

https://docs.microsoft.com/en-us/azure/devops/pipelines/release/deploy-pull-request-builds?view=azure-devops

如果任何失败,拉取请求将被停止。

附加说明(与您的问题不完全相关)。 在Azure DevOps REST API中,存在端点,当您不想使管道失败而希望停止拉取请求时,可以在特定情况下将拉取请求状态更改为例如“已放弃”状态。

https://docs.microsoft.com/en-us/rest/api/azure/devops/git/pull%20requests/update?view=azure-devops-rest-5.1

答案 1 :(得分:0)

我可以使CI管道失败,但如果 部署失败。

不确定您过去如何使配置项失败,但是一旦部署失败,我有一种方法可以帮助您实现这一目标。

我写了一个简单的扩展,它将扩展发布工作添加到发布管道中。参见我的github仓库merlinLia/PostJob-extension

  {
  "id": "release-octane-pipeline-end-decorator",
  "type": "ms.azure-pipelines.pipeline-decorator",
  "targets": [
    "ms.azure-release-pipelines-agent-job.post-job-tasks"
  ],
  "properties": {
    "template": "release-decorator.yml"
  }
}

这将在发布管道中添加其他自定义的后期作业release-decorator.yml,并且只能在所有定义的任务完成后才能运行。

enter image description here

在您的方案中,您可以与此管道装饰器一起应用。并将condition添加到release-decorator.yml中,例如,仅在您之前的任务失败后才能运行此自定义的发布作业。

并且,在此自定义的职位定义中,您可以采用使CI失败的想法,包括powershell脚本。


我的扩展程序仅用于我自己,因此我没有在市场上公开它。您可以参考我的代码并创建自己的代码。


更新以获取我的想法摘要。

由于您只需要严格的请求请求策略,如果部署失败,则不应允许请求请求完成。

根据我的建议,您可以在所有部署任务完成后运行一个任务。在此任务中,它首先获得先前的部署任务状态。当获得上一个任务失败的命令时,它将运行一个脚本来更改拉取请求的状态,例如Abandoned

结合我的原始想法,您可以创建一个扩展,它将自动将一个职位发布到管道中。通过在脚本中设置 condition (脚本),此作业将自动完成工作(修改请求请求),并且可以自己定制该条件,包括仅某些项目可以将此后期作业应用到管道中。

修改PR的api(由于可以使用预定义变量获取参数,因此可以在所有项目的管道中应用):

PATCH 

$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/git/repositories/$($env:BUILD_REPOSITORY_ID)/pullrequests/$($env:BUILD_PULLREQUEST_ID)?api-version=5.1

请求正文(Abandon):

{"status":2}