Jenkins使用时间长了你就会发现,好多任务很久以前跑完以后就再也不跑了,还有些人创建了一堆任务,但也不知道有用没用。这些在界面上又看不出来,所以很有必要对任务进行这方面的梳理。这类任务我暂且称它为日暮任务
日暮任务的梳理逻辑
思路是这样的,首先肯定是距今多少天没有使用的作为日暮任务的首要条件。如何去判断一个任务多少天没使用,根据经验可以有一条判断路径。先判断最后一次执行任务的时间,如果从来没执行过的,或者构建的记录被清理掉的(配置里设置丢弃旧构建,没有保留至少一次的,或者直接删掉了的),判断最后一次任务配置文件的修改时间。
然后根据第一步筛选出来的数据进行上游任务的排查。如果上游任务并不在前面的范围内,说明这个任务可能是执行条件的选择上没有达到,并不是这个任务不需要了,反之亦然。
然后再加点别的判断,剔除一些需要保留的任务。
最后将这些任务删除或者放到特定的label或view里。
代码实现
先实现获得一份每个任务的数据。关键点解析
K1:这部分先通过基本信息的接口,获取全部的job信息。
K2: 逐个解析任务
K3:如果如果任务没有构建的记录,则再读取配置历史的时间,取最后的一次修改时间作为最近时间记录,读取配置记录先要有配置配置历史的插件。
K4:如果有记录,则取最后一次的记录时间,读取记录的时间的时候注意时区。
# coding:utf-8
import datetime
import pytz
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'
# K1
response = requests.get(f'{jenkins_url}/api/json', auth=auth)
json_data = response.json()
jobs = json_data.get('jobs')
# k2
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)
builds = job_data.get('builds')
# K3
if not builds:
config_url = f'{jenkins_url}/job/{job_name}/jobConfigHistory/api/json'
config_resp = requests.get(config_url, auth=auth)
config_data = config_resp.json()
last_time = config_data.get('jobConfigHistory')[-1].get('date')
last_time_obj = datetime.datetime.strptime(last_time, '%Y-%m-%d_%H-%M-%S')
build_status = False
# K4
else:
last_build = builds[0]
last_build_number = last_build.get('number')
build_url = f'{jenkins_url}/job/{job_name}/{last_build_number}/api/json'
build_resp = requests.get(build_url, auth=auth)
build_data = build_resp.json()
print(build_data)
build_time = build_data.get('timestamp')
last_time_obj = datetime.datetime.fromtimestamp(int(build_time) / 1000, tz=pytz.timezone('Asia/Shanghai'))
print(last_time_obj)
build_status = True
ws.append([job_type, job_name, last_time_obj.strftime('%Y-%m-%d %H:%M:%S'), build_status, url])
wb.save('data.xlsx')
得到的数据如下所示:
此时我们要考虑multijob的影响。
建立一个字典,并将数据在执行过程中存入,最后一个值作为删除标记,默认都是待删除的True
job_name_dict[job_name] = [job_type, job_name, last_time_obj, build_status, url,True]
设定一个标准,哪一天以前的算旧工程,设置为5天前的
time_line = datetime.datetime.now()-datetime.timedelta(days=8)
循环上面的数据,将不需要清理的工程标记为False,并标记上下游工程
for k, v in job_name_dict.items():
if v[2] > time_line:
v[5] = False
if v[5] == False:
job_url = f'{jenkins_url}/job/{k}/api/json'
url = f'{jenkins_url}/job/{k}'
resp = requests.get(job_url, auth=auth)
job_data = resp.json()
down_jobs = job_data.get('downstreamProjects')
for down_job in down_jobs:
down_job_name = down_job.get('name')
job_name_dict[down_job_name][5] = False
up_jobs = job_data.get('upstreamProjects')
for up_job in up_jobs:
up_job_name = up_job.get('name')
job_name_dict[up_job_name][5] = False
因为代码里只是简单标记上下游,没标记更深层次的线路,所以这里可以考虑多跑几遍,使路线得到传播。
最后我们将标记为True的工程归档起来就可以了。