Azure DevOps 代理 - 自定义 Setup/Teardown 操作
Azure DevOps Agent - Custom Setup/Teardown Operations
我们在自定义 AMI 上有一个充满自托管 Azure 代理的云 运行。在某些情况下,我有一些清理操作,我真的很想在机器上的作业 运行s 之前或之后进行,但我不希望等待作业的开发人员在作业的开始或结束(它会阻止其他阶段)。
我真正想要的是让 Azure 代理本身说“在这项工作完成后,我将 运行 一组自定义脚本来为下一项工作做准备,但我不会接受更多工作,直到完成该组脚本。
在紧要关头,也许只需要一个“冷却时间”设置就可以了——等待 30 秒再接受另一份工作。 (那么至少一项工作可以在完成之前触发一些后台工作。)
有没有人有过这方面的经验,或者知道可行的解决方案?
我建议三个解决方案
创建另一个管道以 运行 代理上的清理任务 - 您还可以通过 Agent.Name -equals [Your Agent Name]
添加对特定代理的需求(参见此处 https://docs.microsoft.com/en-us/azure/devops/pipelines/process/demands?view=azure-devops&tabs=yaml)。您可以使用 cron 模式将频率设置为分钟、小时。由于此管道将 运行ning 并占用代理,因此正在清理的代理将无法用于其他作业。请注意,您可以从另一个管道触发此管道,但如果两者都使用相同的代理 - 它们可能会陷入僵局。
创建一个包含具有所有清理逻辑的脚本任务的模板,并在每个作业(您已打折)结束时使用它。
与其将静态 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..
我们在自定义 AMI 上有一个充满自托管 Azure 代理的云 运行。在某些情况下,我有一些清理操作,我真的很想在机器上的作业 运行s 之前或之后进行,但我不希望等待作业的开发人员在作业的开始或结束(它会阻止其他阶段)。
我真正想要的是让 Azure 代理本身说“在这项工作完成后,我将 运行 一组自定义脚本来为下一项工作做准备,但我不会接受更多工作,直到完成该组脚本。
在紧要关头,也许只需要一个“冷却时间”设置就可以了——等待 30 秒再接受另一份工作。 (那么至少一项工作可以在完成之前触发一些后台工作。)
有没有人有过这方面的经验,或者知道可行的解决方案?
我建议三个解决方案
创建另一个管道以 运行 代理上的清理任务 - 您还可以通过
Agent.Name -equals [Your Agent Name]
添加对特定代理的需求(参见此处 https://docs.microsoft.com/en-us/azure/devops/pipelines/process/demands?view=azure-devops&tabs=yaml)。您可以使用 cron 模式将频率设置为分钟、小时。由于此管道将 运行ning 并占用代理,因此正在清理的代理将无法用于其他作业。请注意,您可以从另一个管道触发此管道,但如果两者都使用相同的代理 - 它们可能会陷入僵局。创建一个包含具有所有清理逻辑的脚本任务的模板,并在每个作业(您已打折)结束时使用它。
与其将静态 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..