From 76911c9fca38b0f307d787ec06aaa22ca3f989d9 Mon Sep 17 00:00:00 2001 From: "Mikhail f. Shiryaev" Date: Wed, 17 Apr 2024 15:11:42 +0200 Subject: [PATCH] Add ci_config.StatusNames class for common statuses --- tests/ci/ci_config.py | 15 +++++++++++---- tests/ci/commit_status_helper.py | 18 ++++++++---------- tests/ci/finish_check.py | 6 +++--- tests/ci/run_check.py | 5 ++--- tests/ci/sync_pr.py | 15 +++++++++------ 5 files changed, 33 insertions(+), 26 deletions(-) diff --git a/tests/ci/ci_config.py b/tests/ci/ci_config.py index e062a3b054e..bcea001b2e0 100644 --- a/tests/ci/ci_config.py +++ b/tests/ci/ci_config.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 -from copy import deepcopy import logging from argparse import ArgumentDefaultsHelpFormatter, ArgumentParser +from copy import deepcopy from dataclasses import dataclass, field from pathlib import Path from typing import Callable, Dict, Iterable, List, Literal, Optional, Union @@ -181,6 +181,13 @@ class JobNames(metaclass=WithIter): BUGFIX_VALIDATE = "Bugfix validation" +class StatusNames(metaclass=WithIter): + "Class with statuses that aren't related to particular jobs" + CI = "CI running" + MERGEABLE = "Mergeable Check" + SYNC = "A Sync" + + # dynamically update JobName with Build jobs for attr_name in dir(Build): if not attr_name.startswith("__") and not callable(getattr(Build, attr_name)): @@ -1348,7 +1355,7 @@ CI_CONFIG.validate() # checks required by Mergeable Check REQUIRED_CHECKS = [ "PR Check", - "A Sync", # Cloud sync + StatusNames.SYNC, JobNames.BUILD_CHECK, JobNames.BUILD_CHECK_SPECIAL, JobNames.DOCS_CHECK, @@ -1461,9 +1468,9 @@ CHECK_DESCRIPTIONS = [ lambda x: x.startswith("Integration tests ("), ), CheckDescription( - "Mergeable Check", + StatusNames.MERGEABLE, "Checks if all other necessary checks are successful", - lambda x: x == "Mergeable Check", + lambda x: x == StatusNames.MERGEABLE, ), CheckDescription( "Performance Comparison", diff --git a/tests/ci/commit_status_helper.py b/tests/ci/commit_status_helper.py index 330eb3469c3..5561ddf2064 100644 --- a/tests/ci/commit_status_helper.py +++ b/tests/ci/commit_status_helper.py @@ -17,7 +17,7 @@ from github.GithubObject import NotSet from github.IssueComment import IssueComment from github.Repository import Repository -from ci_config import CHECK_DESCRIPTIONS, REQUIRED_CHECKS, CheckDescription +from ci_config import CHECK_DESCRIPTIONS, REQUIRED_CHECKS, CheckDescription, StatusNames from env_helper import GITHUB_REPOSITORY, GITHUB_RUN_URL, TEMP_PATH from lambda_shared_package.lambda_shared.pr import Labels from pr_info import PRInfo @@ -36,9 +36,7 @@ from upload_result_helper import upload_results RETRY = 5 CommitStatuses = List[CommitStatus] -MERGEABLE_NAME = "Mergeable Check" GH_REPO = None # type: Optional[Repository] -CI_STATUS_NAME = "CI running" STATUS_FILE_PATH = Path(TEMP_PATH) / "status.json" @@ -159,16 +157,16 @@ def set_status_comment(commit: Commit, pr_info: PRInfo) -> None: if not statuses: return - if not [status for status in statuses if status.context == CI_STATUS_NAME]: + if not [status for status in statuses if status.context == StatusNames.CI]: # This is the case, when some statuses already exist for the check, - # but not the CI_STATUS_NAME. We should create it as pending. + # but not the StatusNames.CI. We should create it as pending. # W/o pr_info to avoid recursion, and yes, one extra create_ci_report post_commit_status( commit, PENDING, create_ci_report(pr_info, statuses), "The report for running CI", - CI_STATUS_NAME, + StatusNames.CI, ) # We update the report in generate_status_comment function, so do it each @@ -300,7 +298,7 @@ def create_ci_report(pr_info: PRInfo, statuses: CommitStatuses) -> str: ) ) return upload_results( - S3Helper(), pr_info.number, pr_info.sha, test_results, [], CI_STATUS_NAME + S3Helper(), pr_info.number, pr_info.sha, test_results, [], StatusNames.CI ) @@ -429,7 +427,7 @@ def set_mergeable_check( state: StatusType = SUCCESS, ) -> None: commit.create_status( - context=MERGEABLE_NAME, + context=StatusNames.MERGEABLE, description=format_description(description), state=state, target_url=GITHUB_RUN_URL, @@ -457,14 +455,14 @@ def update_mergeable_check(commit: Commit, pr_info: PRInfo, check_name: str) -> def trigger_mergeable_check(commit: Commit, statuses: CommitStatuses) -> None: - """calculate and update MERGEABLE_NAME""" + """calculate and update StatusNames.MERGEABLE""" required_checks = [ status for status in statuses if status.context in REQUIRED_CHECKS ] mergeable_status = None for status in statuses: - if status.context == MERGEABLE_NAME: + if status.context == StatusNames.MERGEABLE: mergeable_status = status break diff --git a/tests/ci/finish_check.py b/tests/ci/finish_check.py index a433cf25aa0..6902e526da9 100644 --- a/tests/ci/finish_check.py +++ b/tests/ci/finish_check.py @@ -3,8 +3,8 @@ import logging from github import Github +from ci_config import StatusNames from commit_status_helper import ( - CI_STATUS_NAME, get_commit, get_commit_filtered_statuses, post_commit_status, @@ -26,7 +26,7 @@ def main(): trigger_mergeable_check(commit, statuses) if not pr_info.is_merge_queue: - statuses = [s for s in statuses if s.context == CI_STATUS_NAME] + statuses = [s for s in statuses if s.context == StatusNames.CI] if not statuses: return # Take the latest status @@ -37,7 +37,7 @@ def main(): SUCCESS, status.target_url, "All checks finished", - CI_STATUS_NAME, + StatusNames.CI, pr_info, dump_to_file=True, ) diff --git a/tests/ci/run_check.py b/tests/ci/run_check.py index e06e8f955d5..9d9d1433073 100644 --- a/tests/ci/run_check.py +++ b/tests/ci/run_check.py @@ -5,9 +5,8 @@ from typing import Tuple from github import Github -from cherry_pick import Labels +from ci_config import StatusNames from commit_status_helper import ( - CI_STATUS_NAME, create_ci_report, format_description, get_commit, @@ -206,7 +205,7 @@ def main(): PENDING, ci_report_url, description, - CI_STATUS_NAME, + StatusNames.CI, pr_info, ) diff --git a/tests/ci/sync_pr.py b/tests/ci/sync_pr.py index 0e1ab2994b9..f1073603e8d 100644 --- a/tests/ci/sync_pr.py +++ b/tests/ci/sync_pr.py @@ -5,10 +5,11 @@ import argparse import sys -from get_robot_token import get_best_robot_token -from pr_info import PRInfo -from github_helper import GitHub +from ci_config import StatusNames from commit_status_helper import get_commit, post_commit_status +from get_robot_token import get_best_robot_token +from github_helper import GitHub +from pr_info import PRInfo from report import SUCCESS @@ -56,7 +57,7 @@ def set_sync_status(gh, pr_info, sync_pr): # FIXME: uncomment posting red Sync status to prohibit merge in MQ if PR state fetching works good if not sync_pr: # post_commit_status( - # get_commit(gh, pr_info.sha), FAILURE, "", "Sync PR not found", "A Sync" + # get_commit(gh, pr_info.sha), FAILURE, "", "Sync PR not found", StatusNames.SYNC # ) return @@ -73,7 +74,9 @@ def set_sync_status(gh, pr_info, sync_pr): if sync_pr.mergeable_state == "clean": print(f"Sync PR [{sync_pr.number}] is clean") - post_commit_status(get_commit(gh, pr_info.sha), SUCCESS, "", "", "A Sync") + post_commit_status( + get_commit(gh, pr_info.sha), SUCCESS, "", "", StatusNames.SYNC + ) else: print( f"Sync PR [{sync_pr}] is not mergeable, state [{sync_pr.mergeable_state}]" @@ -83,7 +86,7 @@ def set_sync_status(gh, pr_info, sync_pr): # FAILURE, # "", # f"state: {sync_pr.mergeable_state}", - # "A Sync", + # StatusNames.SYNC, # )