Continuous integration 如何在主循环ci/azure管道/任何其他ci上禁用构建并发性?

Continuous integration 如何在主循环ci/azure管道/任何其他ci上禁用构建并发性?,continuous-integration,azure-pipelines,continuous-deployment,circleci,continuous-delivery,Continuous Integration,Azure Pipelines,Continuous Deployment,Circleci,Continuous Delivery,并发运行部署脚本被认为是一个bug 我未能在circle ci、azure pipeline、code fresh等中找到解决方案 Bitbucket管道有一个非常好的解决方案: 只有一个部署脚本针对特定环境运行 新版本将自动停止旧的(正在运行的)版本 因为我想移出bitbucket,所以在找到任何其他具有此基本功能的CI之前,我无法这样做 也许我遗漏了什么,因为据我所知,所有CI在部署其新功能时都必须有这个问题。除非他们使用jenkins并锁定项目哈哈…我认为你可以通过azure发布管道

并发运行部署脚本被认为是一个bug

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

Bitbucket管道有一个非常好的解决方案:

  • 只有一个部署脚本针对特定环境运行
  • 新版本将自动停止旧的(正在运行的)版本
因为我想移出bitbucket,所以在找到任何其他具有此基本功能的CI之前,我无法这样做



也许我遗漏了什么,因为据我所知,所有CI在部署其新功能时都必须有这个问题。除非他们使用jenkins并锁定项目哈哈…

我认为你可以通过azure发布管道实现这一点

如果要使用,可以通过配置部署队列设置来实现在新生成排队时停止旧生成。请参见下面的屏幕截图:

1、设置并行部署的最大数量,以控制并行部署。选中“部署最新部署”并取消“其他部署”将仅部署最新的排队部署。所有先前排队(尚未运行)的部署都将被取消。但是如果以前的部署正在运行。除非手动取消,否则最新排队生成将必须等待运行的生成完成

如果要取消较旧的运行版本,可以添加脚本任务以调用rest api来取消以前的运行版本。请参见下面yaml管道示例中的示例:

2、要仅部署到一个目标,您可以在作业中配置部署目标,如下所示

如果您要使用Yaml pipleline。yaml管道不支持
部署最新作业和取消其他作业
部署组作业
。看这个使用语音

在Yaml管道中,您可以使用和。您可以为环境配置,以启用以确保一次仅将一次运行部署到此环境。并配置以设置maxparallel部署

要取消较旧的运行版本,可以添加脚本任务来调用。请参阅下面的示例:查看我的答案以了解更多信息

- 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
          }
谢谢我试试看。(在另一个话题上,这是一个非常复杂的问题,我不明白为什么没有ci可以让它变得简单,并为我们提供一个开箱即用的解决方案。每个产品和公司的每种编程语言的每一条管道都需要这一点)