ClickHouse/tests/ci/bugfix_validate_check.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

125 lines
3.5 KiB
Python
Raw Normal View History

2022-03-18 12:36:45 +00:00
#!/usr/bin/env python3
2023-09-27 14:27:37 +00:00
from pathlib import Path
from typing import List, Tuple, Optional
2022-03-18 12:36:45 +00:00
import argparse
import csv
import logging
2022-03-18 12:36:45 +00:00
2022-10-27 11:32:42 +00:00
from github import Github
from commit_status_helper import get_commit, post_commit_status
2022-10-27 11:32:42 +00:00
from get_robot_token import get_best_robot_token
from pr_info import PRInfo
from report import TestResults, TestResult
from s3_helper import S3Helper
2022-10-27 11:32:42 +00:00
from upload_result_helper import upload_results
2023-09-27 14:27:37 +00:00
def parse_args() -> argparse.Namespace:
2022-03-18 12:36:45 +00:00
parser = argparse.ArgumentParser()
2023-09-27 14:27:37 +00:00
parser.add_argument("files", nargs="+", type=Path, help="Path to status files")
2022-03-18 12:36:45 +00:00
return parser.parse_args()
2023-09-27 14:27:37 +00:00
def post_commit_status_from_file(file_path: Path) -> List[str]:
with open(file_path, "r", encoding="utf-8") as f:
res = list(csv.reader(f, delimiter="\t"))
2022-03-18 12:36:45 +00:00
if len(res) < 1:
raise Exception(f'Can\'t read from "{file_path}"')
if len(res[0]) != 3:
raise Exception(f'Can\'t read from "{file_path}"')
return res[0]
# Returns (is_ok, test_results, error_message)
def process_result(file_path: Path) -> Tuple[bool, TestResults, Optional[str]]:
test_results = [] # type: TestResults
2022-03-18 12:36:45 +00:00
state, report_url, description = post_commit_status_from_file(file_path)
2023-09-27 14:27:37 +00:00
prefix = file_path.parent.name
if description.strip() in [
"Invalid check_status.tsv",
"Not found test_results.tsv",
"Empty test_results.tsv",
]:
status = (
f'Check failed (<a href="{report_url}">Report</a>)'
if report_url != "null"
else "Check failed"
)
return False, [TestResult(f"{prefix}: {description}", status)], "Check failed"
2022-10-27 13:06:37 +00:00
is_ok = state == "success"
if is_ok and report_url == "null":
return is_ok, test_results, None
2022-10-27 13:06:37 +00:00
2023-09-27 14:27:37 +00:00
status = (
f'OK: Bug reproduced (<a href="{report_url}">Report</a>)'
if is_ok
else f'Bug is not reproduced (<a href="{report_url}">Report</a>)'
)
test_results.append(TestResult(f"{prefix}: {description}", status))
return is_ok, test_results, None
2022-03-18 12:36:45 +00:00
def process_all_results(
file_paths: List[Path],
) -> Tuple[bool, TestResults, Optional[str]]:
2022-10-27 16:51:11 +00:00
any_ok = False
2022-10-27 11:32:42 +00:00
all_results = []
error = None
2022-10-27 15:11:16 +00:00
for status_path in file_paths:
is_ok, test_results, error = process_result(status_path)
2022-10-27 16:51:11 +00:00
any_ok = any_ok or is_ok
if test_results is not None:
all_results.extend(test_results)
2023-12-21 11:27:31 +00:00
return any_ok and error is None, all_results, error
2022-10-27 15:11:16 +00:00
2022-10-27 11:32:42 +00:00
2023-09-27 14:27:37 +00:00
def main():
logging.basicConfig(level=logging.INFO)
2023-09-27 14:27:37 +00:00
args = parse_args()
status_files = args.files # type: List[Path]
2022-10-27 11:32:42 +00:00
check_name_with_group = "Bugfix validate check"
is_ok, test_results, error = process_all_results(status_files)
description = ""
if error:
description = error
elif not is_ok:
description = "Changed tests don't reproduce the bug"
2022-10-27 15:11:16 +00:00
pr_info = PRInfo()
if not test_results:
description = "No results to upload"
report_url = ""
logging.info("No results to upload")
else:
report_url = upload_results(
S3Helper(),
pr_info.number,
pr_info.sha,
test_results,
status_files,
check_name_with_group,
)
2022-10-27 11:32:42 +00:00
gh = Github(get_best_robot_token(), per_page=100)
commit = get_commit(gh, pr_info.sha)
2022-10-27 11:32:42 +00:00
post_commit_status(
commit,
2022-10-27 11:32:42 +00:00
"success" if is_ok else "error",
report_url,
description,
check_name_with_group,
pr_info,
dump_to_file=True,
2022-10-27 11:32:42 +00:00
)
2022-03-18 12:36:45 +00:00
if __name__ == "__main__":
2023-09-27 14:27:37 +00:00
main()