2021-10-07-check_job_failed

# coding:utf-8
import os
import sys
import jenkins
import jenkins_moudle
import yaml
import xml.dom.minidom
from  jenkins_moudle.tools import  Tools

# 判断是否陪跑。
def is_job_online(branch,component):
    # dom = xml.dom.minidom.parse()
    pass

# 判断工程是否超过一天
def is_over_one_day(day_job):
    pass


# 筛选url,跳过 禁用  没有构建  超过24小时的构建的url, 考虑下这里是否需要使用多线程
def sift_url(url_list):
    domain_user = 'admin'
    domain_password = 'xxxxx'
    total_url_list = []
    for url in url_list :
        try :
            one_job = jenkins_moudle.JobInfo.init_URL(url,domain_user,domain_password)
            # 跳过禁用的工程
            if not one_job.get_is_able():
                continue
            # 跳过没有构建的工程
            if not len(one_job.get_builds_number_list()):
                continue
            # 跳过超过24小时没有构建的工程
            last_build = jenkins_moudle.BuildInfo.init_URL(one_job.detail_Dict.get('lastBuild',{}).get('url',''))
            if last_build.build_start_time <  Tools.get_current_timestamp() - 86400:
                continue
            # last_build_timestamp = one_job.buildsInstance.get(one_job.get_lastBuild_number()).build_start_time
            # if last_build_timestamp <  Tools.get_current_timestamp() - 86400:
            #     continue
            total_url_list.append(url)
        except Exception as e:
            print  'fail:%s' %url
    return total_url_list

# 放入类中了,可以不在这里写。
def juge_all_fail(buildsInstance):
    '''
    判断所有构建是否失败,
    :param buildsInstance:{1:buildobject1,2:buildobject2}
    :return:True or False
    '''
    for number,build in buildsInstance.items():
        if build.build_result == 'SUCCESS':
            return False
    return True

# 也放入类中了
def is_job_type(buildsInstance):
    ch_list = []
    tag_list = []
    for number,build in buildsInstance.items():
        try:
            changeid = build.get_build_one_parmas('GERRIT_CHANGE_ID','')
            if len(changeid) == 41:
                ch_list.append(number)
            else:
                tag_list.append(number)
        except:
            return 'all_tag'
    if not ch_list:
        return 'all_tag'
    return 'not_all_tag'





def check_every_job(url):
    domain_user = 'admin'
    domain_password = 'xxxx'
    one_job = jenkins_moudle.Analyze_Job_Builds.init_URL(url, domain_user, domain_password)


    # 1.先取出前20个build(排除被abort的和正在运行的构建)
    one_job.get_limit_no_running_numbers(20)
        # one_job.get_limit_numbers(20)
    print one_job.buildsInstance.keys()

    # 2.判断是否全部失败,如果失败,则直接返回False:则job挂了
    if one_job.juge_all_fail():
        print 'url: %s  -->挂了'%url
        return False

    # for number,build in one_job.buildsInstance.items():
    #     print build.get_build_one_parmas('GERRIT_CHANGE_ID')

    # 3. 判断job如果是全部都是tag
    # print one_job.is_job_type()
    if one_job.is_job_type() == 'all_tag':
        # 取出前5个(可能小于5),判断是否全部失败,如果失败则job挂了。
        one_job.get_limit_numbers(5)
        if one_job.juge_all_fail():
            print 'url: %s  -->挂了' % url
            return False

    # 工程不为全tag(changeid /changeid+tag)
    #     #4. 是否把tag的build全部删除。(?)
    one_job.del_tag_build()
        # 取出前10个,如果全部失败
    one_job.get_limit_numbers(10)
    print one_job.buildsInstance.keys()

            ## 如果总数<10,直接返回job挂了【不需要,因为如果<10,直接被全部失败返回了】
            # 判断是否是相同changedid,如果不是相同changeid,则job挂了,
            # 如果总数>10:后面肯定有成功的。
            # 判断是否所有20个build是否是相同changeid,如果是不同的changeid,则直接返回job 挂了。



def get_need_check_list():
    # 获取需要监控的manifest分支的yaml文件
    manifest_branch_dict  = open(r'.....manifest.yaml')
    branch_info_dict  = yaml.load(manifest_branch_dict)
    manifest_branch_list = list(branch_info_dict.values())[0]

    # BRANCH2JENKINSJOB.yaml
    branch_to_jenkins_job_dict = open(r'...')
    job_info_dict = yaml.load(branch_to_jenkins_job_dict)


    url_list = []
    master_list = []
    job_list = []
    # 循环jenkins Job中的manifest
    for branch in job_info_dict.keys():
        # 如果jenkins Job中的manifest分支在配置文件的manifest中,则进入,变向筛选了,配置文件中写的manifest分支的有效性
        if branch in manifest_branch_list:
            # 根据manifest分支获取形态名列表。
            component_info_list = job_info_dict[branch].keys()
            for component in component_info_list:
                # 根据配置文件,跳过陪跑工程。
                if not is_job_online(branch,component):
                    continue
                info = job_info_dict[branch][component]
                master = info[0][:-1] if info[0].endswith('/') else info[0]
                url = ''.join([master,'/job/',info[1]])
                url_list.append(url)
    url_list = list(set(url_list))
    return url_list


if __name__ == '__main__':



    #### 下面就是根据 配置文件和Jenkins2Job.yaml文件,获取需要检查的job的url的列表
    # url_list = get_need_check_list()
    #
    # # 继续筛选需要检查url的列表
    # total_list = sift_url(url_list)
    #
    # for url in total_list:
    #     check_every_job(url)

    # check_every_job('http://10.0.0.70:8080/jenkins/job/all_changed_failed')
    check_every_job('http://10.0.0.70:8080/jenkins/job/test02/')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值