首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >极限同时透光管道级

极限同时透光管道级
EN

Stack Overflow用户
提问于 2020-12-21 18:42:07
回答 3查看 1.1K关注 0票数 0

我有一个多代理的Azure DevOps多级管道。一般来说,我的阶段包括:

  • 构建和发布工件
  • 部署到环境1
  • UI测试环境1
  • 部署到环境2
  • UI测试环境2

在几个环境中也是如此。如何允许同时运行管道(例如,为构建#2构建和发布工件,同时为构建#1提供UI测试环境2),同时确保没有两个代理同时对给定环境执行UI测试?

trigger: batch似乎接近我想要的,但我认为在流水线级,而不是在阶段级,不允许并发。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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测试”

https://learn.microsoft.com/en-us/azure/devops/pipelines/process/approvals?view=azure-devops&tabs=check-pass#exclusive-lock

票数 1
EN

Stack Overflow用户

发布于 2020-12-23 06:31:23

看起来,如果有人运行了两次发布管道,您需要一个一个地运行它,而不是并行运行,对吗?

作为一种解决办法:

每个版本将从第一阶段开始,因此我们可以添加一个PowerShell任务作为第一阶段的任务,以检查是否有以前正在进行的部署。

在这个PowerShell任务中,我们可以调用这个Rest来检查发布阶段的状态。

Power shell脚本:

代码语言:javascript
运行
复制
# 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将继续检查,直到所有以前的版本都完成。

我们也可以用需求来尝试,我们可以指定相同的要求。使用需求确保管道所需的功能存在于运行它的代理上。除非代理满足一个或多个要求,否则它不会运行。

票数 1
EN

Stack Overflow用户

发布于 2020-12-22 07:20:44

将任务放入不同的jobs中,并为需要等待特定作业完成的作业指定一个dependsOn属性。如果省略了dependsOn,它将同步运行。

在更仔细地阅读您的提示之后,我认为您只需要一个构建和发布工件的build阶段。

然后为每个环境提供一个deploy_test阶段。默认情况下,阶段按顺序运行(与作业不同)

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65398257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档