问题描述
在Jenkins中,有许多问题询问如何返回Jenkins实例上所有作业的列表,或者如何获取当前正在运行的作业列表,但我有一个更具体的用例。
我需要查看单个作业是否已在运行。换句话说,如果有1个作业构建正在运行,则返回一个值;如果有2个或更多作业构建正在运行,则返回另一个值。
背景是这样的:我们已经自动化了成功单元测试后的镜像创建。它被设置为每隔七个小时最多构建一个镜像,方法是通过检查上一个镜像的构建时间,如果不到7小时就取消构建。对于大多数情况,这个方法运行得很好。然而,这些镜像需要大约20分钟来构建。如果已经过去了7个小时,但在20分钟内有两个单元测试完成,第二个构建将看不到第一个构建正在进行,于是继续构建。我们每隔7小时会得到两个功能上完全相同的镜像,相隔几分钟。我想检查控制器作业的状态,以便第二个构建知道它是否已经在运行,从而可以取消构建。
我尝试过通过curl以下API来检索数据,但它似乎没有注册单独的构建,只是在一般情况下指示作业正在运行,对于此案例来说毫无用处,因为它的自触发意味着它已经在运行;单个构建和多个构建之间没有区别。
http://JENKINS_URL/api/xml?tree=jobs[name,url,color]&xpath=/hudson/job[ends-with(color/text(),%22_anime%22)]&wrapper=jobs
解决方案
以下解决方案基于提供的问题背景和最佳回答。
方案
您可以通过访问特定的URL来获取XML输出,其中包含所有当前正在运行的构建,以及它们的构建号。您可以通过对这些输出进行处理,计算正在运行的构建数量,从而解决您的问题。
- 使用以下URL获取当前正在运行的构建列表:
http://jenkinsURL/computer/api/xml?tree=computer[executors[currentExecutable[url]],oneOffExecutors[currentExecutable[url]]]&xpath=//url&wrapper=builds
- 根据您的需要,您可以使用工具(如
grep
命令)来处理输出,以计算正在运行的构建数量。
例如,在Linux或Unix命令行中,您可以使用以下命令来获取正在运行的构建数量:
curl -s "http://jenkinsURL/computer/api/xml?tree=computer[executors[currentExecutable[url]],oneOffExecutors[currentExecutable[url]]]&xpath=//url&wrapper=builds" | grep -o "<url>" | wc -l
这个命令会通过curl
从URL获取XML输出,然后使用grep
和wc
来计算<url>
标签的数量,从而得出正在运行的构建数量。
注意事项
请注意,Jenkins的API可能会随着版本更新而变化,因此在使用这些调用时,请确保与您的Jenkins版本兼容。此外,根据您的使用情况,可能需要调整解决方案以满足您的实际需求。
请注意,解决方案仅针对提供的背景和问题而编写。在实际实施中,您可能需要根据您的环境和要求进行适当的调整和测试。