Azure DevOps 代理 - 自定义 Setup/Teardown 操作

Azure DevOps Agent - Custom Setup/Teardown Operations

我们在自定义 AMI 上有一个充满自托管 Azure 代理的云 运行。在某些情况下,我有一些清理操作,我真的很想在机器上的作业 运行s 之前或之后进行,但我不希望等待作业的开发人员在作业的开始或结束(它会阻止其他阶段)。

我真正想要的是让 Azure 代理本身说“在这项工作完成后,我将 运行 一组自定义脚本来为下一项工作做准备,但我不会接受更多工作,直到完成该组脚本。

在紧要关头,也许只需要一个“冷却时间”设置就可以了——等待 30 秒再接受另一份工作。 (那么至少一项工作可以在完成之前触发一些后台工作。)

有没有人有过这方面的经验,或者知道可行的解决方案?

我建议三个解决方案

  1. 创建另一个管道以 运行 代理上的清理任务 - 您还可以通过 Agent.Name -equals [Your Agent Name] 添加对特定代理的需求(参见此处 https://docs.microsoft.com/en-us/azure/devops/pipelines/process/demands?view=azure-devops&tabs=yaml)。您可以使用 cron 模式将频率设置为分钟、小时。由于此管道将 运行ning 并占用代理,因此正在清理的代理将无法用于其他作业。请注意,您可以从另一个管道触发此管道,但如果两者都使用相同的代理 - 它们可能会陷入僵局。

  2. 创建一个包含具有所有清理逻辑的脚本任务的模板,并在每个作业(您已打折)结束时使用它。

  3. 与其将静态 VM 用于代理托管,不如将 Azure 规模集用于自托管代理 - 每次缩小代理时,它们都会消失,而在放大时,它们会重新开始。就坐着的代理人在没有人工作时什么都不做而言,这节省了很多钱。我们使用此选项并远离静态代理。我们还使用打包程序 image/vhd 一夜之间创建了 VM,以使用补丁、所需软件和缓存的 docker 图像对其进行更新。 参考: https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/scale-set-agents?view=azure-devops

对于那些发现这个问题的人,有一个更好的方法:运行 你的 self-hosted 代理带有 --once 标志,记录在案 here

您需要将其包装在您自己的 bash 脚本中,但像这样的东西可行:

while :
do
  echo "Performing pre-job setup..."
  
  echo "Waiting for job..."
  ./run.sh --once

  echo "Cleaning up..."

  sleep 2
done

另一种选择是使用 ScaleSet VM 设置,它为每个 运行 准备一个新代理,并在 运行 完成后丢弃 VM。它可以在作业 运行ning 时在后台准备新的 VM。

而且我怀疑您可以实现自己的 IMaintenanceProvirer..

https://github.com/microsoft/azure-pipelines-agent/blob/master/src/Agent.Worker/Maintenance/MaintenanceJobExtension.cs#L53