【问题标题】:Azure Devops: Agent Jumping Around Different BuildsAzure Devops:代理在不同的构建中跳跃
【发布时间】:2021-07-01 20:25:03
【问题描述】:

我注意到,每当我将阶段或作业添加到我的管道中并在队列中有多个构建时,都会发生这样的情况:image

在图片的情况下:

  • 第 1 阶段为底部提交运行
  • 第 1 阶段为最高提交运行
  • 第 2 阶段为底部提交运行
  • 第 2 阶段运行最高提交等...

作业似乎正在尝试以伪并行格式运行,但我只有 1 个构建代理。这导致构建时间超长,因为它为每个工作做一项工作,有效地使第一个工作完成的时间增加了一倍。有什么方法可以关闭它,让管道在进入下一个构建之前完全完成一个构建?

谢谢????

【问题讨论】:

  • 嗨劳伦斯,我的回答有效吗?请检查并请告诉我结果。

标签: azure-devops continuous-integration


【解决方案1】:

经过测试我们发现multi-stages yaml pipeline在不同的构建中触发阶段的顺序是失控的,这就是你遇到这个问题的原因。但是,如果您使用发布管道,则有Deployment queue settings,因此您可以指定“Deploy all in sequence”。

此外,我们发现了这个thread,它提供了一种开发自定义扩展的方法,使管道在进入下一个构建之前完全完成一个构建。

顺便说一句,您可以使用 PowerShell 任务取消其他后面的 notStarted 构建,这是每个阶段的最后一步,因此后面的构建将被取消,然后当前构建可以完全完成。以下是示例PowerShell脚本,需要create a PAT with full access

- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |   
      Write-Host "Start checking."
      $url = "https://dev.azure.com/{organization}/{project}/_apis/build/builds?definitions={definitionId}&statusFilter=inProgress,notStarted&api-version=6.0"
      $connectionToken="PAT here"
      $base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))
      do
      {
          $pipelines = Invoke-RestMethod -Uri $url -Headers @{authorization = "Basic $base64AuthInfo"} -Method Get
          $count = $pipelines.count
          if ($count -gt 1)
          {
              $lastestBuildId = $pipelines.value[-1].id
              $urlCancel = "https://dev.azure.com/{organization}/{project}/_apis/build/builds/" + $lastestBuildId + "?api-version=6.0"
              $body = @{status="cancelling"} | ConvertTo-Json -Compress
              Write-Host $urlCancel
              $result= Invoke-RestMethod -Uri $urlCancel -Body $body -ContentType "application/json" -Headers @{authorization = "Basic $base64AuthInfo"} -Method Patch #cancel the latter noStarted builds
          }
      } while($count -gt 1)
      Write-Host "It's my turn now."

另一种解决方法是,您可以将create an environment 命名为approval-checkdefine approvals and checks,然后将以下check 阶段添加为yaml 管道的第一阶段,因此必须批准新构建然后才能启动.

- stage: check
  jobs:
  - deployment: DeployWeb
    displayName: deploy Web App
    pool:
      vmImage: 'Ubuntu-latest'
    # creates an environment if it doesn't exist
    environment: 'approval-check'
    strategy:
      runOnce:
        deploy:
          steps:
          - script: echo Hello world

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 2021-01-03
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 2020-03-16
    • 2019-03-23
    • 2021-03-13
    • 2020-01-01
    相关资源
    最近更新 更多