Jenkins 的api综合应用之过时任务梳理

224 阅读3分钟

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')

得到的数据如下所示: image.png

此时我们要考虑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

因为代码里只是简单标记上下游,没标记更深层次的线路,所以这里可以考虑多跑几遍,使路线得到传播。

image.png

最后我们将标记为True的工程归档起来就可以了。