【答疑】【python】jenkinsapi库获取构建结果

问题背景:


image
在完善测试平台代码时:
后端代码中,发现只要调用执行任务接口就返回error:0,跟构建结果与测试结果无关
前端代码中,发现后端的返回值只能走前端的if分支
综上,修改目的为:根据构建结果来返回前端不同的响应
测试平台代码:

问题1:
使用get_status方法无法获取当前构建任务的结果,只能获取上次构建任务的结果
问题2:
按照老师的方法,去判断biuldnumber是否变化,来进一步判断是否构建完成,从而获取构建结果,但结果依然不行,获取None
问题3:
使用get console方法来打印构建信息,发现无法获取完整的构建信息

想请教老师怎么处理这个问题

你这个是哪个三方库来着

jenkinsapi库

我贴个 @hogwarts_wenzi 蚊子大佬写的调用JenkinsApi查询是否正在构建运行中的代码出来吧,你看看有合适你的没

# 循环判断Jenkins是否打包完成
                while True:
                    if not my_job.is_queued_or_running():
                        # 获取最新一次打包信息
                        count_build = my_job.get_build(build_num)
                        # 获取打包开始时间
                        start_time = count_build.get_timestamp() + datetime.timedelta(hours=8)
                        # 获取打包日志
                        console_out = count_build.get_console()
                        # 获取运行状态
                        status = count_build.get_status()
                        # 获取变更内容
                        change = count_build.get_changeset_items()
                        log.info("" + str(start_time) + "发起的" + my_job_name + "构建已完成, 构建的状态为:" + status)
                        p2 = re.compile(r".*ERROR.*")
                        err_list = p2.findall(console_out)
                        log.info("打包日志为:" + console_out)
                        if status == "SUCCESS":
                            if len(change)> 0:
                                for data in change:
                                    for file_list in data["affectedPaths"]:
                                        log.info(" 发起的" + my_job_name + "变更的类:" + file_list)
                                    log.info(" 发起的" + my_job_name + "变更的备注:" + data["msg"])
                                    log.info(" 发起的" + my_job_name + "变更的提交人" + data["author"]["fullName"])
                            else:
                                log.info(" 发起的" + my_job_name + "构建没有变更内容")

                            if len(err_list) > 0:
                                log.info(" 构建的" + my_job_name + "构建状态为成功,但包含了以下错误:")
                                for error in err_list:
                                    log.error(error)
                        else:
                            if len(err_list) > 0:
                                log.warning(" 构建的" + my_job_name + "包含了以下错误:")
                                for error in err_list:
                                    log.error(error)
                        break

谢谢分享,我试了一下,发现is_queued_or_running()这个方法可行,对象是构建任务的实例化
再分享一下,我自己的解决方案(没有蚊子老师那么完善,基本单线程可行)

    def get_build_result(cls,nodeid):
        jenkins_job = Jenkins(cls.baseurl, cls.username, cls.password).get_job(nodeid)
        url = jenkins_job.__dict__['_data']['lastBuild']['url']
        number = jenkins_job.__dict__['_data']['lastBuild']['number']
        obj = Build(url, number, jenkins_job)
        # 等待任务完成,如果任务在运行则等待一秒
        obj.block()
        # 反复获取构建状态,直到不等于None,返回状态结果
        while True:
            # 因为get_status只是获取一次结果,所以需要构建对象反复刷新,从而构建结果反复刷新来获取结果
            obj = Build(url, number, jenkins_job)
            result = obj.get_status()
            if result != None:
                return result