如何在 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 有一个非常好的解决方案:
- 只有一个部署脚本运行针对特定ci特定环境
- 新构建将自动停止旧的 (运行ning) 构建
因为我想搬出 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 others
和 Deployment 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
}
它被认为是 运行 并发部署脚本的错误。
我未能在 circle-ci、azure-pipeline、code-fresh 等中找到解决方案..
Bitbucket-pipelines 有一个非常好的解决方案:
- 只有一个部署脚本运行针对特定ci特定环境
- 新构建将自动停止旧的 (运行ning) 构建
因为我想搬出 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 others
和 Deployment 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
}