MENU

批量删除jenkins历史构建

2020 年 03 月 05 日 • 派森编程

最近遇到了点问题,是jenkins这一块的,有关于历史构建的问题,最开始搞jenkins的时候并没有想过这个问题,目前发现测试的jenkins有些项目的构建次数高达几百次,生产的还好一点,没这么夸张,之前因为磁盘空间问题也手动清理过这些东西,最近这个问题又出现了,现在准备彻底解决一下这个问题。

先是设置了丢弃旧的构建,项目众多也不是一个一个设置的,通过批量更改项目配置文件的方法搞定的,最大保留多少次历史构建,配置完之后并不是马上就会删除不需要保留的,而是需要构建项目跑一遍不需要的就被删除了,说白了就是下次生效,这个配置好以后就需要清理一下所有项目的历史构建了。

我也是查了一下批量清理历史构建的方法,查到了两种方法,一种是使用jenkins的脚本命令行,但是一次只能针对一个项目,再一个就是删除jenkins家目录下job/*,删除后不要重启jenkins将所有项目重新跑一遍即可,我琢磨了一下这两种方法不太适合我,第一种不适合主要就是项目太多,一个一个跑我疯了,随便找了一个jenkins一共这个多项目,这也是要需要清理的jenkins

第二个方法也不太适合我,删了jobs/*下的文件需要把所有项目都跑一遍,有点麻烦,而且这东西也不是想跑就跑的,所以我准备试试写个python脚本来搞定这个问题,目标是针对jenkins上的全部项目,而不是某一个,然后开始分析jenkins,具体的过程这里就不提了,还是基于python3,额外安装一个requests库就可以用了,代码如下,

import re
import requests


class Del_History_build(object):
    def __init__(self, jenkins_urls, j_username, j_password, retains):
        # jenkins地址
        self.jenkins_urls = jenkins_urls
        # jenkins用户名
        self.j_username = j_username
        # jenkins 密码
        self.j_password = j_password
        # 保留多少次构建历史
        self.retains = retains
        # 初始化一个session
        self.login_session = requests.session()
        self.Jenkins_Crumb = ''
        # 默认请求头
        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"
        }
        # 登陆POST数据
        self.login_data = {
            'j_username': self.j_username,
            'j_password': self.j_password,
            'from': '/jenkins/',
            'Submit': 'Sign in'
        }
        # 项目地址列表
        self.all_jobs_url = []

    # 获取全部项目方法,将项目地址添加至列表
    def Get_All_Job(self):
        try:
            # 请求登陆接口
            self.login_session.post(url='%sj_acegi_security_check' % self.jenkins_urls, headers=self.header, data=self.login_data)
            # 获取全部项目名
            response = self.login_session.get(url=self.jenkins_urls, headers=self.header).text
            all_job = re.findall(r'job_(.+?)"', response)
            self.Jenkins_Crumb = re.search(r'Jenkins-Crumb", "(.+)"\)', response).group(1)
            print('当前共获取到 %d 个项目' % len(all_job))
            for i in all_job:
                self.all_jobs_url.append('%sjob/%s/' % (self.jenkins_urls, i))
        except Exception as e:
            print('获取全部项目失败,请确认输入的信息是否正确, 错误信息: %s' % e)

    # 删除历史构建方法
    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('当前请求的地址为: %s 现存的构建历史为: %s' % (url, '|'.join(history)))
            if len(history) > int(self.retains):
                # 删除构建历史POST数据
                del_data = {
                    'Jenkins-Crumb': self.Jenkins_Crumb,
                    'json': {"Jenkins-Crumb": self.Jenkins_Crumb},
                    'Submit': 'Yes',
                }
                print('%s 构建历史大于 %s,开始删除 %s 次构建' % (url, self.retains, '|'.join(history[int(self.retains):])))
                for exceed in history[int(self.retains):]:
                    self.login_session.post(url='%s/%s/doDelete' % (url, exceed), data=del_data)
            else:
                print('%s 现存历史构建为 %d, 不需要清理或清理已结束' % (url, len(history)))
                break

    def run(self):
        self.Get_All_Job()
        for url in self.all_jobs_url:
            self.Delete_Build(url)


if __name__ == '__main__':
    jenkins_url = input('jenkins地址: ')
    username = input('jenkins用户名: ')
    password = input('登陆密码: ')
    retain = input('要保留多少次构建历史,输入十进制数字: ')
    init = Del_History_build(jenkins_url, username, password, retain)
    init.run()

我并没有开多线程,我怕把jenkins服务器跑崩了,这个小脚本具体怎么用,大概这样,如果你莫得python3的环境,我建议你用docker去跑这个脚本,先把上面的脚本存成一个.py文件,然后将这个文件挂载到容器中执行就可以了,在目标服务器随便找一个项目,看一下构建历史,

这是一个更新不怎么频繁的项目,开始执行脚本,只保留最近5次的历史构建,剩下的全部删掉,注意,这不是针对某个项目,而是目标jenkins上所有的项目。

[root@rj-bai ~]# docker run -it -v /root/jenkins.py:/tmp/jenkins.py python:3.6.7 bash
root@7be995384b22:/# pip3 install requests
root@7be995384b22:/# python /tmp/jenkins.py 

执行完刷新一下页面,发现历史构建就只剩下5条了,

这里主要提一下输入的jenkins地址,目前我们这里的情况是把jenkinswar包仍在tomcat里面的,像是我们的jenkins完整地址都是这样的,

所以写jenkins的完整地址就可以了,http://192.168.1.187:9999/jenkins/,注意不要忘记了最开始的http/https最后的/,还有我们用的jenkins版本为Jenkins 2.150.3,应该是去年的版本了,之前调试好了以后就作为一个模板使用了,也是好长时间都没更新过了,又测了一下最新版的Jenkins 2.204.4也没啥问题,所以兼容性这块应该是没啥子问题,暂时就这样了。

最后编辑于: 2020 年 03 月 06 日
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码