GitLab API过滤成功作业失效:获取非成功作业日志问题排查
问题排查与修复
你的问题出在获取流水线作业时没有过滤作业的状态:虽然你筛选了状态为success的流水线,但流水线的整体成功不代表其下所有作业都是成功状态(比如可能有作业被跳过、失败后重试成功,原失败作业仍保留在列表中)。你直接取返回的第一个作业,自然可能拿到非成功状态的作业trace。
修复步骤
- 获取指定流水线的作业列表后,新增过滤逻辑,只保留状态为
success的作业 - 增加空值判断,避免过滤后无符合条件的作业导致索引报错
修改后的代码
response = requests.get(GITLAB_PROJECT_BASE_URL + '/pipeline_schedules/' + str(PIPELINE_SCHEDULE_ID) + '/pipelines', headers=headers) successful_pipelines = list(filter(lambda x: x['status'] == 'success', json.loads(response.text))) if not successful_pipelines: print("没有找到成功的流水线") exit() pipeline_id = successful_pipelines[-1]['id'] # 获取该流水线的作业并过滤出成功状态的作业 response = requests.get(GITLAB_PROJECT_BASE_URL + '/pipelines/{}/jobs'.format(pipeline_id), headers=headers) jobs = json.loads(response.text) successful_jobs = list(filter(lambda x: x['status'] == 'success', jobs)) if not successful_jobs: print(f"流水线{pipeline_id}下没有成功的作业") exit() # 取第一个成功作业的trace(如果需要最后一个,就用successful_jobs[-1]) target_job_id = successful_jobs[0]['id'] log_file = str(target_job_id) + ".trace" download_file(GITLAB_PROJECT_BASE_URL + '/jobs/{}/trace'.format(target_job_id), log_file) last_pipeline_job_response_time = get_response_time_trph_from_log(log_file) get_diff_with_last_pipeline(last_pipeline_job_response_time)
额外说明
- 如果你的需求是取该流水线中最后一个成功的作业,把
successful_jobs[0]改成successful_jobs[-1]即可 - GitLab API返回的作业列表默认按创建时间升序排列,第一个是最早创建的作业,最后一个是最晚创建的作业
内容的提问来源于stack exchange,提问作者user22329726
相关产品推荐
相关产品推荐

