如何在 circle-ci/azure-pipeline/any-other-ci 中禁用 master 上的构建并发?

How to disable builds-concurrency on master in circle-ci/azure-pipeline/any-other-ci?

它被认为是 运行 并发部署脚本的错误。

我未能在 circle-ci、azure-pipeline、code-fresh 等中找到解决方案..

Bitbucket-pipelines 有一个非常好的解决方案:

因为我想搬出 bitbucket,所以我不能这样做,直到我找到任何其他具有此基本能力的CI。


也许我遗漏了什么,因为据我所知,所有 CIs 在部署他们的新功能时他们自己也一定有这个问题。除非他们使用 jenkins 并锁定项目哈哈...

我认为您可以使用 azure 发布管道实现这一目标。

如果您要使用 Classic UI Azure release pipeline. 您可以通过配置 部署队列设置 在新构建排队时停止旧构建。请参阅下面的屏幕截图:

1,设置Maximum number of parallel deployments控制并行部署。选中 部署最新并取消其他 将只部署最新的排队部署。所有先前排队的(尚未 运行)部署将被取消。但是如果之前的部署是运行。最新排队的构建必须等到 运行 构建完成,除非您手动取消它。

如果您想取消较旧的 运行 构建,您可以添加一个脚本任务来调用其余 api 以取消之前的 运行 构建。请参阅下面的 yaml 管道示例中的示例:

2,要仅部署到一个目标,您可以在 deployment group 作业中配置 部署目标

如果你要使用 Yaml pipleline。 yaml 管道不支持 Deploy latest and cancel othersDeployment group jobs。看到这个用语音here.

在 Yaml 管道中,您可以使用 deploy jobs and environments instead. You can configure the Define approvals and checks for the Environment to enable the Exclusive lock to ensure only a single run deploys to this environment at a time. And configure the deployment strategy 设置最大并行部署。

要取消旧的 运行 构建,您可以添加一个脚本任务来调用 rest api. See below example: Check my answer to 以获取更多信息。

- task: PowerShell@2
  inputs:
        targetType: inline
        script: |
          $header = @{ Authorization = "Bearer $(system.accesstoken)" }
          $buildsUrl = "$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/build/builds?api-version=5.1"
          echo $buildsUrl
          $builds = Invoke-RestMethod -Uri $buildsUrl -Method Get -Header $header
          $buildsToStop = $builds.value.Where({ ($_.status -eq 'inProgress') -and ($_.definition.name -eq "$(Build.DefinitionName)") -and ($_.id -ne $(Build.BuildId))})
          ForEach($build in $buildsToStop)
          {
            echo $build.id
            $build.status = "cancelling"
            $body = $build | ConvertTo-Json -Depth 10
            $urlToCancel = "$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/build/builds/$($build.id)?api-version=5.1"
            echo $urlToCancel
            Invoke-RestMethod -Uri $urlToCancel -Method Patch -ContentType application/json -Body $body -Header $header
          }