问题描述
正在使用Azure DevOps,并且有5个Microsoft-hosted agents和10个pipelines。其中一个pipeline可能会占用较多资源,因此用户希望将其限制为只使用2个agents。但是用户希望其他9个pipelines仍然可以访问剩下的3个agents。用户认为Agent Pools是解决这个问题的正确方法。默认情况下,Azure DevOps为我们设置了一个名为”Azure Pipelines”的单一pool,其中包含我们的self-hosted agents。用户希望将其拆分为2个pools。然而,当用户尝试”创建新pool”时,只能选择添加”self-hosted” agents。用户想知道如何创建一个新的Agent Pool,并将其中一些现有的Microsoft-hosted agents添加到其中。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
根据我所了解,目前还没有办法将Microsoft-hosted agents添加到新的Agent Pool中。根据文档上关于在一个集合中共享并行作业的说明,目前还没有办法将并行作业容量分区或专用于特定的项目或agent pool。
考虑到在pipelines中使用capabilities和companion demands来实现部分agents的分组,但是由于hosted pipelines不支持demands,这种方法也行不通。
在我自己的情况下,我们有一些会分散到多个并行作业中的贪婪pipelines,我们不得不使用每个作业的dependsOn来使其按顺序运行。如果你的情况相对简单,你可以尝试在第一个阶段中检查队列长度或正在运行的构建数量,但这可能会变得复杂,并且可能很难扩展。
希望这个功能能够尽快添加。我会查看开发者社区论坛上是否有相关的投票。我也对其他解决这个问题的方法感兴趣!
编辑:在开发者社区论坛上找到了一个相关的功能投票链接,可以在这里进行投票。
方案2
使用脚本或工具来管理并行作业的分配可能会增加复杂性,并且需要确保并行作业的分配正确设置。
另一种方法是编写脚本或使用工具来控制并行作业的分配。你可以使用Azure DevOps的API来手动控制并行作业的分配,或者使用一些第三方工具来管理并行作业的分配。
以下是一个简单的bash脚本示例,可以在pipeline运行之前检查并行作业的数量,并根据需要进行分配:
#!/bin/bash
# 检查并行作业的数量
running_jobs=$(az pipelines build list --query "[?status=='inProgress'].id" --org https://dev.azure.com/{organization} --project {project} | jq length)
# 检查队列中的作业数量
queued_jobs=$(az pipelines build list --query "[?status=='notStarted'].id" --org https://dev.azure.com/{organization} --project {project} | jq length)
# 计算可用的并行作业数量
available_jobs=$((5 - running_jobs - queued_jobs))
# 根据需要分配并行作业
if [[ $available_jobs -ge 2 ]]; then
# 分配2个并行作业给特定的pipeline
az pipelines build queue --definition-id {pipeline_definition_id} --org https://dev.azure.com/{organization} --project {project} --parallel 2
else
# 分配1个并行作业给特定的pipeline
az pipelines build queue --definition-id {pipeline_definition_id} --org https://dev.azure.com/{organization} --project {project} --parallel 1
fi
在这个示例中,我们使用Azure DevOps的API来获取正在运行和等待的作业数量,并计算可用的并行作业数量。然后,根据需要分配并行作业给特定的pipeline。你可以根据自己的需求修改脚本中的参数。
请注意,使用脚本或工具来管理并行作业的分配可能会增加复杂性,并且需要确保并行作业的分配正确设置。