【问题标题】:Prevent parallel releases in TFS防止 TFS 中的并行发布
【发布时间】:2020-12-01 18:58:41
【问题描述】:

我们有一个 API 管理系统,我们创建了 Python 脚本来将新的 API 推送到平台,我们在 TFS 中定义了 5 个环境 - DEV、SYS、ACC、REL 和 PROD。

我们为每个 API 创建一个版本。

如果两个版本在同一环境中同时运行,我们有时会遇到一些问题,我想进行配置,以便两个或多个版本将被序列化 - 即排队并在彼此之后执行。

到目前为止,我发现的唯一解决方案是只允许使用一个代理,但这会很慢,因为我们是一家大型企业,而且代理很忙,他们可能会在没有通知的情况下更改。

目前在 Team Foundation Server 版本 16.131.28601.4,但我们可以迁移到新版本的 Azure Devops。

【问题讨论】:

  • 未获得您的最新信息。只是想检查以下答案是否对您有帮助?如果是,您可以接受一个作为答案,这也可以使与您有相同困惑的其他人受益,我们可以存档此线程。另外,如果仍有任何疑问,请随时在下面发表评论:-)

标签: tfs azure-devops


【解决方案1】:

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

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

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://{instance}/{collection}/{project}/_apis/release/deployments?definitionId={release definition ID}&deploymentStatus=inProgress&api-version=4.1-preview.2"
    $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://{instance}/{collection}/{project}/_apis/release/deployments?definitionId={release definition ID}&operationStatus=QueuedForAgent&api-version=4.1-preview.2"
    $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 将继续检查,直到所有以前的版本都完成

这个变通方法是这个ticket提供的,你可以参考一下。

【讨论】:

    【解决方案2】:

    您可以使用Invoke REST API gate 调用下面的Deployments - List rest api 并检查是否有任何版本在部署中。请参阅以下步骤:

    GET https://{instance}/{collection}/{project}/_apis/release/deployments?operationStatus=queued,queuedForAgent,phaseInProgress&api-version=5.0
    

    1、添加一个Invoke Rest Api Gate

    进入预部署条件-->启用Gate-->添加Invoke Rest Api Gate-->点击管理创建服务连接。

    2、创建服务连接。

    当您在上述步骤中单击“管理”时。您将转到服务连接页面。点击新建服务连接,选择通用服务连接类型:

    • 服务器网址https://{instance}/{collection}/{project}

    • 密码Personal Access Token

    3,回到Invoke Rest Api Gate。选择刚刚创建的服务连接:见下图

    • 方法:获取
    • 网址后缀和参数:/_apis/release/deployments?operationStatus=queued,queuedForAgent,phaseInProgress&api-version=5.0
    • 成功标准eq(root['value'][0], '')

    Invoke rest api 门将调用部署列表 rest api 来过滤这些正在进行或使用 operationStatus 过滤器排队的发布(即 operationStatus=queued,queuedForAgent,phaseInProgress)。如果有任何部署正在进行或排队成功标准:eq(root['value'][0], '') 将失败。并且发布将等到没有活动部署。

    如果您迁移到新版本的 Azure Devops。您可以查看Exclusive lock

    排他锁检查只允许管道中的一次运行继续进行。该管道的所有运行中使用该资源的所有阶段都被暂停

    【讨论】:

      【解决方案3】:

      在每个环境中,您可以配置只能同时部署 1 个版本:

      在一个环境中的部署可以是并行的,其中多个 发布可以同时部署,也可以按发布的顺序部署 一个接一个地部署。为部署指定“1”以进行一次 一个接一个(连续的)。

      【讨论】:

      • 这只会阻止一个特定版本的并行执行 - 但我想阻止项目下定义的所有版本的并行执行。
      猜你喜欢
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      • 2012-01-12
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 2011-03-25
      相关资源
      最近更新 更多