2021-09-29 07:47:15 +00:00
|
|
|
#!/usr/bin/env python3
|
2024-06-13 14:14:57 +00:00
|
|
|
import argparse
|
2021-09-29 07:47:15 +00:00
|
|
|
import logging
|
2024-02-06 12:39:34 +00:00
|
|
|
|
2021-10-27 07:03:23 +00:00
|
|
|
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
|
2023-04-06 09:40:32 +00:00
|
|
|
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
|
|
|
|
2024-06-13 14:14:57 +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)
|
2024-06-13 14:14:57 +00:00
|
|
|
args = parse_args()
|
2021-09-29 07:47:15 +00:00
|
|
|
|
2024-06-13 14:14:57 +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)
|
2022-07-30 05:07:22 +00:00
|
|
|
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()
|