我有一个多代理的Azure DevOps多级管道。一般来说,我的阶段包括:
在几个环境中也是如此。如何允许同时运行管道(例如,为构建#2构建和发布工件,同时为构建#1提供UI测试环境2),同时确保没有两个代理同时对给定环境执行UI测试?
trigger: batch
似乎接近我想要的,但我认为在流水线级,而不是在阶段级,不允许并发。
发布于 2020-12-24 18:55:19
你的
UI测试环境1阶段(特别是运行测试的部署作业)应该针对
env1uitest环境
UI测试环境2阶段(特别是运行测试的部署作业)应该针对
env2uitest环境
然后在这两个环境上设置独占锁( https://learn.microsoft.com/en-us/azure/devops/release-notes/2020/pipelines/sprint-172-update#exclusive-deployment-lock-policy)策略。
它应该满足您的需要:“确保没有两个代理同时对给定的环境执行UI测试”
发布于 2020-12-23 06:31:23
看起来,如果有人运行了两次发布管道,您需要一个一个地运行它,而不是并行运行,对吗?
作为一种解决办法:
每个版本将从第一阶段开始,因此我们可以添加一个PowerShell任务作为第一阶段的任务,以检查是否有以前正在进行的部署。
在这个PowerShell任务中,我们可以调用这个Rest来检查发布阶段的状态。
Power shell脚本:
# Base64-encodes the Personal Access Token (PAT) appropriately
$token = "$(pat)"
$base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))
$success = $false
$count = 0
do{
try{
$stageurl2 = "https://vsrm.dev.azure.com/{org name}/{project name}/_apis/release/deployments?definitionId={release definition ID}&deploymentStatus=inProgress&api-version=6.0"
$stageinfo2 = Invoke-RestMethod -Method Get -ContentType application/json -Uri $stageurl2 -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
$inprogressdeployments = $stageinfo2.value | where {($_.deploymentStatus -eq "inProgress") -and ($_.release.name -ne $ENV:RELEASE_RELEASENAME) -and ($_.releaseEnvironment.name -ne 'stop services')} | Sort-Object -Property completedOn -Descending
#write-output $inprogressdeployments
$stageurl3 = "https://vsrm.dev.azure.com/{org name}/{project name}/_apis/release/deployments?definitionId={release definition ID}&operationStatus=QueuedForAgent&api-version=6.0"
$stageinfo3 = Invoke-RestMethod -Method Get -ContentType application/json -Uri $stageurl3 -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
$queueddeployments = $stageinfo3.value
#write-output $queueddeployments
if($inprogressdeployments) {
Write-output "Deployment In Progress, Waiting for it to finish!"
Write-output "Next attempt in 30 seconds"
Start-sleep -Seconds 30
} else {
Write-Host "No Current Deployment in Progress"
if($queueddeployments) {
write-output "Current Queued deployments"
Write-output "if 2 - Next attempt in 30 seconds"
Start-sleep -Seconds 30
}
else{
write-output "No Queued deployments, starting release"
$success = $true
}
}
}
catch{
Write-output "catch - Next attempt in 30 seconds"
write-output "1"
Start-sleep -Seconds 30
# Put the start-sleep in the catch statemtnt so we
# don't sleep if the condition is true and waste time
}
$count++
}until($count -eq 2000 -or $success)
if(-not($success)){exit}
结果:
Stage1将继续检查,直到所有以前的版本都完成。
我们也可以用需求来尝试,我们可以指定相同的要求。使用需求确保管道所需的功能存在于运行它的代理上。除非代理满足一个或多个要求,否则它不会运行。
发布于 2020-12-22 07:20:44
将任务放入不同的jobs
中,并为需要等待特定作业完成的作业指定一个dependsOn
属性。如果省略了dependsOn
,它将同步运行。
在更仔细地阅读您的提示之后,我认为您只需要一个构建和发布工件的build
阶段。
然后为每个环境提供一个deploy_test
阶段。默认情况下,阶段按顺序运行(与作业不同)
https://stackoverflow.com/questions/65398257
复制相似问题