批量删除jenkins历史构建
最近遇到了点问题,是jenkins
这一块的,有关于历史构建的问题,最开始搞jenkins
的时候并没有想过这个问题,目前发现测试的jenkins
有些项目的构建次数高达几百次,生产的还好一点,没这么夸张,之前因为磁盘空间问题也手动清理过这些东西,最近这个问题又出现了,现在准备彻底解决一下这个问题。
先是设置了丢弃旧的构建,项目众多也不是一个一个设置的,通过批量更改项目配置文件的方法搞定的,最大保留多少次历史构建,配置完之后并不是马上就会删除不需要保留的,而是需要构建项目跑一遍不需要的就被删除了,说白了就是下次生效,这个配置好以后就需要清理一下所有项目的历史构建了。
我也是查了一下批量清理历史构建的方法,查到了两种方法,一种是使用jenkins
的脚本命令行,但是一次只能针对一个项目,再一个就是删除jenkins
家目录下job/*
,删除后不要重启jenkins
将所有项目重新跑一遍即可,我琢磨了一下这两种方法不太适合我,第一种不适合主要就是项目太多,一个一个跑我疯了,随便找了一个jenkins
一共这个多项目,这也是要需要清理的jenkins
第二个方法也不太适合我,删了jobs/*
下的文件需要把所有项目都跑一遍,有点麻烦,而且这东西也不是想跑就跑的,所以我准备试试写个python
脚本来搞定这个问题,目标是针对jenkins
上的全部项目,而不是某一个,然后开始分析jenkins
,具体的过程这里就不提了,还是基于python3
,额外安装一个requests
库就可以用了,代码如下,
2020年10月14日13:45:03更新,获取Jenkins-Crumb
值正则修改
import re
import requests
class Del_Build_History(object):
def __init__(self, jenkins_urls, j_username, j_password, retains):
self.jenkins_urls = jenkins_urls
self.j_username = j_username
self.j_password = j_password
self.retains = retains
self.login_session = requests.session()
self.Jenkins_Crumb = None
self.__header = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/80.0.3987.116 Safari/537.36"
}
self.__login_data = {
'j_username': self.j_username,
'j_password': self.j_password,
'Submit': 'Sign in'
}
@property
def get_all_job(self):
try:
all_jobs_url = []
self.login_session.post(url=f'{self.jenkins_urls}j_acegi_security_check', headers=self.__header, data=self.__login_data)
response = self.login_session.get(url=f'{self.jenkins_urls}/me/my-views/view/all/', headers=self.__header).text
all_job = re.findall(r'job_(.+?)"', response)
if len(all_job) == 0:
raise Exception("获取全部job信息失败 请确保输入的信息正确 或当前jenkins job 总数为 0")
print(f'当前共获取到 {len(all_job)} 个项目')
try:
print("开始尝试获取 Jenkins_Crumb 值")
self.Jenkins_Crumb = re.search(r'"Jenkins-Crumb".*?"(.*?)"', response).group(1)
except Exception as e:
raise Exception(f"获取 Jenkins-Crumb 值失败 无法继续 错误信息 {e}")
else:
print(f"获取 Jenkins_Crumb 值成功 当前值 {self.Jenkins_Crumb}")
for job_name in all_job:
all_jobs_url.append(f'{self.jenkins_urls}job/{job_name}/')
except Exception as e:
print(f'获取全部项目或Jenkins-Crumb值失败 错误信息: {e}')
exit(1)
else:
return all_jobs_url
def Delete_Build(self, url):
while True:
job_response = self.login_session.get(url=url, headers=self.__header).text
history = re.findall(r'tip model-link inside build-link display-name.>#(\d+)', job_response)
print(f'当前请求的地址为: {url} 现存的构建历史为: {"|".join(history)}')
if len(history) > int(self.retains):
del_data = {
'Jenkins-Crumb': self.Jenkins_Crumb,
'json': {"Jenkins-Crumb": self.Jenkins_Crumb},
'Submit': 'Yes',
}
print(f'{url} 构建历史大于 {self.retains},开始删除 {"|".join(history[int(self.retains):])} 次构建')
for exceed in history[int(self.retains):]:
self.login_session.post(url=f'{url}/{exceed}/doDelete', data=del_data)
else:
print(f'{url} 现存历史构建为 {len(history)}, 不需要清理或清理已结束')
break
def run(self):
for url in self.get_all_job:
self.Delete_Build(url)
if __name__ == '__main__':
jenkins_url = input('jenkins地址: ')
username = input('jenkins用户名: ')
password = input('登陆密码: ')
retain = input('要保留多少次构建历史,输入十进制数字: ')
Del_Build_History(jenkins_url, username, password, retain).run()
我并没有开多线程,我怕把jenkins
服务器跑崩了,这个小脚本具体怎么用,大概这样,如果你莫得python3
的环境,我建议你用docker
去跑这个脚本,先把上面的脚本存成一个.py
文件,然后将这个文件挂载到容器中执行就可以了,在目标服务器随便找一个项目,看一下构建历史,
这是一个更新不怎么频繁的项目,开始执行脚本,只保留最近5
次的历史构建,剩下的全部删掉,注意,这不是针对某个项目,而是目标jenkins
上所有的项目。
[root@rj-bai ~]# docker run -it -v /root/jenkins.py:/tmp/jenkins.py --rm python:3.6.7 bash
root@7be995384b22:/# pip3 install requests
root@7be995384b22:/# python /tmp/jenkins.py
执行完刷新一下页面,发现历史构建就只剩下5
条了,
这里主要提一下输入的jenkins
地址,目前我们这里的情况是把jenkins
的war
包仍在tomcat
里面的,像是我们的jenkins
完整地址都是这样的,
所以写jenkins
的完整地址就可以了,http://192.168.1.187:9999/jenkins/
,注意不要忘记了最开始的http/https
最后的/
,还有我们用的jenkins
版本为Jenkins 2.150.3
,应该是去年的版本了,之前调试好了以后就作为一个模板使用了,也是好长时间都没更新过了,又测了一下最新版的Jenkins 2.204.4
也没啥问题,所以兼容性这块应该是没啥子问题,暂时就这样了。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。