【问题标题】:Disable simultaneous build of the same pipeline in VSTS (Azure DevOps)在 VSTS (Azure DevOps) 中禁用同一管道的同时构建
【发布时间】:2019-04-09 16:29:59
【问题描述】:

我在 VSTS(也称为 Azure DevOps,现在众所周知)上有一个构建管道,它在具有 2 个构建代理(代理 A 和 B)的代理池上运行,并设置了持续集成。我想禁用在不同代理上同时执行此构建管道,即如果代理 A 上正在运行构建,我不希望构建在代理 B 上开始运行,直到代理 A 上的构建完成。

我可以通过更改要求来取消除一个构建代理之外的所有构建代理运行构建的资格(例如,只有代理 A 满足需求)来做到这一点。但是,这是不可取的,因为构建代理与其他项目共享,有时选择的代理会很忙,所以我不想将构建代理限制在任何特定的机器上。

在 VSTS 中是否有一种简单的方法可以做到这一点?

【问题讨论】:

  • 为什么不想要并发构建?
  • 因为管道需要更新一个构建变量(通过 VSTS api),该变量在整个管道中使用。我可能可以通过其他方式解决它,但如果我可以在一个设置中禁用并发构建,那将是最简单的
  • 你解决了吗?
  • @IanYates 不,不是。我最终为这项工作配置了一个专用的构建代理
  • 可能的解决方案:stackoverflow.com/a/49055425

标签: azure-devops azure-pipelines


【解决方案1】:

您可以在构建定义的触发页面上使用“构建正在进行时批量更改”设置。文档在这里:https://docs.microsoft.com/en-us/azure/devops/pipelines/build/triggers?view=azure-devops&tabs=yaml

【讨论】:

    【解决方案2】:

    我没有找到任何干净的解决方案,在这个线程(https://developercommunity.visualstudio.com/idea/365730/prevent-parallel-execution-of-the-same-build-defin.html) 中有一个解决方案作为 powershell 中的工作。

    因为我的代理在 linux 上,所以我在 python 中实现了它,使用构建代理上的环境变量(我认为变量在 windows 平台上是相同的,或者如果不是这种情况,你可以使用 " env”任务的一部分。 与 te API 连接的用户令牌隐藏在秘密变量中。

    jobs:
    -   job: ParallelRunPrevention
        timeoutInMinutes: 240
        displayName: 'prevent parallel execution of the pipeline'
        steps:
            - task: UsePythonVersion@0
              inputs:
                versionSpec: '3.x'
                addToPath: true
                architecture: 'x64'
            - script: |
                pip install azure-devops
              displayName: 'install dependency'
            - task: PythonScript@0
              displayName: 'wait for execution'
              env:
                TASK_TOKEN_USER: $(user_token)
              inputs:
                scriptSource: 'inline'
                script: |
    
                  from azure.devops.connection import Connection
                  from msrest.authentication import BasicAuthentication
                  from azure.devops.v6_0.pipelines.pipelines_client import PipelinesClient
                  import time
                  import os
    
    
                  token = os.environ["TASK_TOKEN_USER"]
                  my_definition_id = int(os.environ["SYSTEM_DEFINITIONID"])
                  my_build_id = int(os.environ["BUILD_BUILDID"])
                  my_project = os.environ["SYSTEM_TEAMPROJECT"]
                  my_organization_url = os.environ["SYSTEM_TASKDEFINITIONSURI"]
                  credentials = BasicAuthentication('', token)
                  connection = Connection(base_url=my_organization_url, creds=credentials)
                  pipeline_c: PipelinesClient = connection.clients_v6_0.get_pipelines_client()
                  while not len([run for run in pipeline_c.list_runs(project=my_project, pipeline_id=my_definition_id) if
                                run.state == "inProgress" and run.id <= my_build_id]) == 1:
                      print("not free, build stack:")
                      print([run.id for run in pipeline_c.list_runs(project=my_project, pipeline_id=my_definition_id) if
                            run.state == "inProgress" and run.id <= my_build_id])
                      time.sleep(20)
                  print("lets go")
    

    【讨论】:

      猜你喜欢
      • 2021-01-21
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 2020-01-30
      相关资源
      最近更新 更多