在Jenkins使用久了以后,机器和任务的标签会越来越多,管理起来十分困难。有时候删除了一个环境,环境自身的标签是没有涉及到任务的,但是表达式的标签却把它拿进去了,导致修改后有的任务又没环境可跑了。
所以给Jenkins系统中的环境和任务做一个标签梳理是很有必要的。
梳理思路
准备先提取所有任务的标签,组合成一个字典。接着对标签下的值进行遍历,查看标签的关联资源。没有资源的就是没环境跑的任务。有资源的将资源存入变量。
接着读取全部节点,与前面的资源变量做集合运算,提取多出来的部分。
需要注意的是不管是任务还是节点,都有涉及到没有配置label的,这种的肯定有节点和任务可以跑,我们先不考虑。
代码实现
13-30行,提取任务中的标签信息,得到一个标签集合 31-51行,将各个标签的节点信息提取出来,形成一个已使用的节点集合,并将没有节点的标签下的任务写入excel表格 52-73行,读取全部节点的数据,排除掉没有给定标签的和主节点,剩下的节点中不在已使用中的,写入到excel表格里
# coding:utf-8
import datetime
import requests
from requests.auth import HTTPBasicAuth
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.append(['工程名称', '标签', 'URL'])
auth = HTTPBasicAuth(username='bob', password='110c70ea8f41063e377aca53007a1ca2e4')
jenkins_url = 'http://127.0.0.1:8080'
response = requests.get(f'{jenkins_url}/api/json', auth=auth)
json_data = response.json()
jobs = json_data.get('jobs')
label_set = set()
for job_item in jobs:
job_name = job_item.get('name')
job_type = job_item.get('_class')
job_url = f'{jenkins_url}/job/{job_name}/api/json'
url = f'{jenkins_url}/job/{job_name}'
resp = requests.get(job_url, auth=auth)
job_data = resp.json()
print(job_data)
label_expression = job_data.get('labelExpression')
if label_expression is None:
continue
label_set.add(label_expression)
print(label_set)
used_node_set = set()
for label in label_set:
label_url = f'{jenkins_url}/label/{label}/api/json'
response = requests.get(label_url, auth=auth)
print(response.status_code)
print(response.text)
nodes = response.json().get('nodes')
tied_jobs = response.json().get('tiedJobs')
clouds = response.json().get('clouds')
# 没有节点和云代表工程无资源
if not nodes and not clouds:
for job in tied_jobs:
job_name = job.get('name')
job_url = job.get('url')
ws.append([job_name, label, job_url])
continue
if nodes:
for node in nodes:
node_name = node.get('nodeName')
used_node_set.add(node_name)
nodes_url = f'{jenkins_url}/manage/computer/api/json'
nodes_resp = requests.get(nodes_url, auth=auth)
nodes_data = nodes_resp.json()
print(nodes_data)
ws.append(['节点名称', '节点标签'])
computers = nodes_data.get('computer')
computer_list = []
for computer in computers:
computer_name = computer.get('displayName')
node_url = f'{jenkins_url}/computer/{computer_name}'
computer_labels = computer.get('assignedLabels')
if not computer_labels:
continue
computer_label_names = [i.get('name') for i in computer_labels]
if 'built-in' in computer_label_names:
continue
if computer_name in used_node_set:
continue
ws.append([computer_name, ','.join(computer_label_names)])
wb.save('data2.xlsx')
最终的表格显示如下:
可以根据自身需要打印更多的详细信息到表格中