【问题标题】:How to disable builds-concurrency on master in circle-ci/azure-pipeline/any-other-ci?如何在 circle-ci/azure-pipeline/any-other-ci 中禁用 master 上的构建并发?
【发布时间】:2020-12-04 18:16:46
【问题描述】:

同时运行部署脚本被认为是一个错误。

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

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

  • 只有一个部署脚本针对特定环境运行
  • 新版本会自动停止旧版本(正在运行)

因为我想离开 bitbucket,所以在我找到任何其他具有此基本能力的 CI 之前,我无法做到。


也许我遗漏了一些东西,因为据我所知,所有 CI 本身在部署新功能时也必须遇到这个问题。除非他们使用 jenkins 并锁定项目哈哈...

【问题讨论】:

    标签: continuous-integration azure-pipelines continuous-deployment circleci continuous-delivery


    【解决方案1】:

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

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

    1、设置Maximum number of parallel deployments控制并行部署。勾选Deploy latest and cancel others只会部署最新的排队部署。所有先前排队(尚未运行)的部署将被取消。但是如果之前的部署正在运行。除非您手动取消,否则最新排队的构建必须等到正在运行的构建完成。

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

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

    如果你要使用 Yaml 管道。 yaml 管道不支持 Deploy latest and cancel othersDeployment group jobs。见此使用语音here

    在 Yaml 管道中,您可以改用 deploy jobsenvironments。您可以为 Environment 配置 Define approvals and checks 以启用 Exclusive lock 以确保一次仅将单个运行部署到此环境。并配置deployment strategy 设置最大并行部署。

    要取消旧的运行版本,您可以添加一个脚本任务来调用rest api。请参阅下面的示例:查看我对this thread 的回答了解更多信息。

    - 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 让它变得简单并为我们提供开箱即用的工作解决方案。每个产品和公司的每种编程语言的每个管道都需要这个)跨度>
    猜你喜欢
    • 2020-12-17
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    相关资源
    最近更新 更多