ClickHouse/tests/ci/finish_check.py

94 lines
2.5 KiB
Python
Raw Permalink Normal View History

2021-09-29 07:47:15 +00:00
#!/usr/bin/env python3
import argparse
2021-09-29 07:47:15 +00:00
import logging
from github import Github
2021-11-26 14:00:09 +00:00
2024-06-10 09:18:03 +00:00
from ci_config import CI
from commit_status_helper import (
get_commit,
get_commit_filtered_statuses,
post_commit_status,
)
2023-04-20 11:55:33 +00:00
from get_robot_token import get_best_robot_token
from pr_info import PRInfo
2024-06-04 10:36:13 +00:00
from report import FAILURE, PENDING, SUCCESS, StatusType
2021-09-29 07:47:15 +00:00
2021-11-26 14:00:09 +00:00
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
description="Script to merge the given PR. Additional checks for approved "
"status and green commit statuses could be done",
)
parser.add_argument(
"--wf-status",
type=str,
default="",
help="overall workflow status [success|failure]",
)
return parser.parse_args()
2023-04-20 11:55:33 +00:00
def main():
2021-09-29 07:47:15 +00:00
logging.basicConfig(level=logging.INFO)
args = parse_args()
2021-09-29 07:47:15 +00:00
has_workflow_failures = args.wf_status == FAILURE
2024-04-25 11:28:06 +00:00
2021-11-26 14:00:09 +00:00
pr_info = PRInfo(need_orgs=True)
gh = Github(get_best_robot_token(), per_page=100)
2021-09-29 07:47:15 +00:00
commit = get_commit(gh, pr_info.sha)
2024-04-25 11:28:06 +00:00
2024-06-13 14:36:07 +00:00
statuses = get_commit_filtered_statuses(commit)
2024-06-10 09:18:03 +00:00
ci_running_statuses = [s for s in statuses if s.context == CI.StatusNames.CI]
2024-06-13 14:36:07 +00:00
if not ci_running_statuses:
return
# Take the latest status
ci_status = ci_running_statuses[-1]
has_failure = False
has_pending = False
error_cnt = 0
for status in statuses:
2024-06-10 09:18:03 +00:00
if status.context in (
CI.StatusNames.MERGEABLE,
CI.StatusNames.CI,
CI.StatusNames.SYNC,
):
2024-06-13 14:36:07 +00:00
# do not account these statuses
continue
if status.state == PENDING:
has_pending = True
2024-06-13 14:40:01 +00:00
elif status.state != SUCCESS:
2024-06-13 14:36:07 +00:00
has_failure = True
error_cnt += 1
ci_state = SUCCESS # type: StatusType
description = "All checks finished"
if has_failure:
ci_state = FAILURE
description = f"All checks finished. {error_cnt} jobs failed"
elif has_workflow_failures:
ci_state = FAILURE
description = "All checks finished. Workflow has failures."
elif has_pending:
print("ERROR: CI must not have pending jobs by the time of finish check")
description = "ERROR: workflow has pending jobs"
ci_state = FAILURE
2024-06-13 14:40:01 +00:00
post_commit_status(
commit,
ci_state,
ci_status.target_url,
description,
2024-06-10 09:18:03 +00:00
CI.StatusNames.CI,
2024-06-13 14:40:01 +00:00
pr_info,
dump_to_file=True,
)
2023-04-20 11:55:33 +00:00
if __name__ == "__main__":
main()