问题描述
同时运行部署脚本被认为是一个错误。
我无法在circle-ci,azure-pipeline,code-fresh等中找到解决方案。
Bitbucket-pipelines有一个非常好的解决方案:
- 针对特定环境仅运行一个部署脚本
- 新版本将自动停止旧版本(运行中)
当我想移出位桶时,直到找到其他具有此基本功能的配置项,我才能这样做。
也许我遗漏了一些东西,因为据我所知,所有CI本身在部署其新功能时也必定会遇到此问题。除非他们使用jenkins并锁定项目哈哈...
解决方法
我认为您可以使用天蓝色的发布管道来实现这一目标。
如果要使用Classic UI Azure release pipeline.,则可以通过配置 Deployment queue settings (部署队列设置)来在新版本排队时停止旧版本。请参见下面的屏幕截图:
1,设置Maximum number of parallel deployments
以控制并行部署。选中部署最新部署并取消其他部署,将仅部署最新的排队部署。先前所有排队(尚未运行)的部署将被取消。但是,如果先前的部署正在运行。除非您手动将其删除,否则最新的排队构建将必须等到运行的构建完成后才能使用。
如果要取消运行的较早版本,可以添加脚本任务以调用rest api来取消先前的运行版本。请参阅以下yaml管道示例中的示例:
2,要仅部署到一个目标,可以在 deployment group作业
中如下配置部署目标如果要使用Yaml Pipleline。 yaml管道不支持Deploy latest and cancel others
和Deployment group jobs
。看到此使用语音here。
在Yaml管道中,可以改为使用deploy jobs和environments。您可以为环境配置Define approvals and checks,以启用Exclusive lock,以确保一次只运行一次到该环境。并配置deployment strategy来设置maxparallel部署。
要取消运行的旧版本,可以添加脚本任务来调用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
}