前一篇我们通过代码对Jenkins上的任务和节点进行遍历,通过计算可以推断任务执行的资源是否充足。这一篇将通过另外一个角度去观察资源的分布情况。
在我们使用限制运行节点的配置时,系统会自己在配置项下方计算可用环境数量,如果我们点击这个链接,会跳转到下面这样的一个页面
这上面可以很方便的观察任务和节点的绑定情况。
我们这一篇要做的就是将每个label的这个信息提取出来,确认当前的label下的机器分布情况。
基本流程
先统计全部任务中配置的不一样的label。再结合label的这个页面进行数据的提取和对比。
代码实现
label提取参照上一篇文章,此时不需要统计任务的具体数量,只需要维护一个label的集合即可。
job_names = jks.keys()
label_set = set()
for job_name in job_names:
job = jks.get_job(job_name)
dt = parseString(job.get_config())
collection = dt.documentElement
try:
assign_node = collection.getElementsByTagName("assignedNode")[0]
label = assign_node.firstChild.data
except IndexError as e:
print(e)
label = 'built-in'
label_set.add(label)
print(label_set)
在本地机器上得到了这三个label
接下来使用jenkinsapi中的api数据来提取上面那个网页的内容。
for label_name in label_set:
label = jks.get_label(label_name)
label_data = jks.get_data(jks.python_api_url(label.baseurl))
print(label_data)
打印的值如下所示,在网页里也可以点击右下角的Rest api里面的Python api来得到这个数据。
借助Pycharm来对这个数据进行格式化。可以观察到几个关键信息。
执行器数量方面:busyExecutors,忙碌的执行器数量;idleExecutors,闲置的执行器数量,totalExecutors,总执行器数量。
环境资源方面:clouds,云的信息;nodes,节点;
任务方面:tiedJobs,关联到这个label的任务。
同时我们也可发现built-in是主节点。也有相关机器,但看不出相关的任务。
通过上面的方法,我们可以很清晰的去判断自己配置的单个label下所用的机器和分配的任务是否合理。
优缺点分析
优点是很容易观察到执行器相关的信息,并且这是个动态的数据,随任务运行会有变化。还能看到cloud的绑定情况。
缺点是不同label间可能会有交叉。需要做进一步的运算才能确认资源的紧缺情况。
其他
Jenkins中任务非常多的时候,执行遍历任务会耗时较长,我们的jks实例很可能会断掉,此时只需要在jks执行命令的地方加上异常处理,捕捉到异常后重新建立jks并执行这个步骤一般都可解决这个问题。如:
try:
job = jks.get_job(job_name)
except Exception as e:
print(e)
jks = Jenkins('http://127.0.0.1:8080/', username='bob', password='110c70ea8f41063e377aca53007a1ca2e4',
use_crumb=True)
job = jks.get_job(job_name)