mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-25 17:12:03 +00:00
Fix cancel-lambda for closed PRs
- Create a fallback function for some edge cases - Process synchronized PRs as help for cancel-workflow action
This commit is contained in:
parent
4bad2cd364
commit
52a7544aa4
@ -92,28 +92,33 @@ WorkflowDescription = namedtuple(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_workflows_description_for_pull_request(pull_request_event):
|
def get_workflows_description_for_pull_request(
|
||||||
|
pull_request_event,
|
||||||
|
) -> List[WorkflowDescription]:
|
||||||
head_repo = pull_request_event["head"]["repo"]["full_name"]
|
head_repo = pull_request_event["head"]["repo"]["full_name"]
|
||||||
head_branch = pull_request_event["head"]["ref"]
|
head_branch = pull_request_event["head"]["ref"]
|
||||||
head_sha = pull_request_event["head"]["sha"]
|
|
||||||
print("PR", pull_request_event["number"], "has head ref", head_branch)
|
print("PR", pull_request_event["number"], "has head ref", head_branch)
|
||||||
workflows_data = []
|
|
||||||
workflows = _exec_get_with_retry(
|
|
||||||
API_URL + f"/actions/runs?branch={head_branch}&event=pull_request&page=1"
|
|
||||||
)
|
|
||||||
workflows_data += workflows["workflow_runs"]
|
|
||||||
i = 2
|
|
||||||
while len(workflows["workflow_runs"]) > 0:
|
|
||||||
workflows = _exec_get_with_retry(
|
|
||||||
API_URL + f"/actions/runs?branch={head_branch}&event=pull_request&page={i}"
|
|
||||||
)
|
|
||||||
workflows_data += workflows["workflow_runs"]
|
|
||||||
i += 1
|
|
||||||
if i > 30:
|
|
||||||
print("Too many workflows found")
|
|
||||||
break
|
|
||||||
|
|
||||||
DEBUG_INFO["workflows"] = [] # type: List[Dict[str, str]]
|
workflows_data = []
|
||||||
|
request_url = f"{API_URL}/actions/runs?per_page=100"
|
||||||
|
# Get all workflows for the current branch
|
||||||
|
for i in range(1, 11):
|
||||||
|
workflows = _exec_get_with_retry(
|
||||||
|
f"{request_url}&event=pull_request&branch={head_branch}&page={i}"
|
||||||
|
)
|
||||||
|
if not workflows["workflow_runs"]:
|
||||||
|
break
|
||||||
|
workflows_data += workflows["workflow_runs"]
|
||||||
|
if i == 10:
|
||||||
|
print("Too many workflows found")
|
||||||
|
|
||||||
|
if not workflows_data:
|
||||||
|
print("No workflows found by filter")
|
||||||
|
return []
|
||||||
|
|
||||||
|
print(f"Total workflows for the branch {head_branch} found: {len(workflows_data)}")
|
||||||
|
|
||||||
|
DEBUG_INFO["workflows"] = []
|
||||||
workflow_descriptions = []
|
workflow_descriptions = []
|
||||||
for workflow in workflows_data:
|
for workflow in workflows_data:
|
||||||
# Some time workflow["head_repository"]["full_name"] is None
|
# Some time workflow["head_repository"]["full_name"] is None
|
||||||
@ -123,13 +128,13 @@ def get_workflows_description_for_pull_request(pull_request_event):
|
|||||||
{
|
{
|
||||||
"full_name": workflow["head_repository"]["full_name"],
|
"full_name": workflow["head_repository"]["full_name"],
|
||||||
"name": workflow["name"],
|
"name": workflow["name"],
|
||||||
|
"branch": workflow["head_branch"],
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
# unfortunately we cannot filter workflows from forks in request to API
|
# unfortunately we cannot filter workflows from forks in request to API
|
||||||
# so doing it manually
|
# so doing it manually
|
||||||
if (
|
if (
|
||||||
workflow["head_sha"] == head_sha
|
workflow["head_repository"]["full_name"] == head_repo
|
||||||
and workflow["head_repository"]["full_name"] == head_repo
|
|
||||||
and workflow["name"] in NEED_RERUN_OR_CANCELL_WORKFLOWS
|
and workflow["name"] in NEED_RERUN_OR_CANCELL_WORKFLOWS
|
||||||
):
|
):
|
||||||
workflow_descriptions.append(
|
workflow_descriptions.append(
|
||||||
@ -144,6 +149,60 @@ def get_workflows_description_for_pull_request(pull_request_event):
|
|||||||
return workflow_descriptions
|
return workflow_descriptions
|
||||||
|
|
||||||
|
|
||||||
|
def get_workflow_description_fallback(event_data) -> List[WorkflowDescription]:
|
||||||
|
pull_request_event = event_data["pull_request"]
|
||||||
|
head_repo = pull_request_event["head"]["repo"]["full_name"]
|
||||||
|
head_branch = pull_request_event["head"]["ref"]
|
||||||
|
head_sha = pull_request_event["head"]["sha"]
|
||||||
|
print("Get last 500 workflows from API to search related there")
|
||||||
|
# Fallback for a case of an already deleted branch and no workflows received
|
||||||
|
request_url = f"{API_URL}/actions/runs?per_page=100"
|
||||||
|
workflows_data = []
|
||||||
|
i = 1
|
||||||
|
for i in range(1, 6):
|
||||||
|
workflows = _exec_get_with_retry(f"{request_url}&page={i}")
|
||||||
|
if not workflows["workflow_runs"]:
|
||||||
|
break
|
||||||
|
# Prefilter workflows
|
||||||
|
workflows_data += [
|
||||||
|
wf
|
||||||
|
for wf in workflows["workflow_runs"]
|
||||||
|
if wf["head_repository"] is not None
|
||||||
|
and wf["head_repository"]["full_name"] == head_repo
|
||||||
|
and wf["head_branch"] == head_branch
|
||||||
|
and wf["name"] in NEED_RERUN_OR_CANCELL_WORKFLOWS
|
||||||
|
]
|
||||||
|
|
||||||
|
print(f"Total workflows in last 500 actions matches: {len(workflows_data)}")
|
||||||
|
|
||||||
|
DEBUG_INFO["workflows"] = [
|
||||||
|
{
|
||||||
|
"full_name": wf["head_repository"]["full_name"],
|
||||||
|
"name": wf["name"],
|
||||||
|
"branch": wf["head_branch"],
|
||||||
|
}
|
||||||
|
for wf in workflows_data
|
||||||
|
]
|
||||||
|
if event_data["action"] == "synchronize":
|
||||||
|
print(f"Leave only workflows with SHA but {head_sha} for updated PR")
|
||||||
|
# Cancel all events with SHA different than current
|
||||||
|
workflows_data = list(
|
||||||
|
filter(lambda x: x["head_sha"] != head_sha, workflows_data)
|
||||||
|
)
|
||||||
|
|
||||||
|
workflow_descriptions = [
|
||||||
|
WorkflowDescription(
|
||||||
|
run_id=wf["id"],
|
||||||
|
status=wf["status"],
|
||||||
|
rerun_url=wf["rerun_url"],
|
||||||
|
cancel_url=wf["cancel_url"],
|
||||||
|
)
|
||||||
|
for wf in workflows_data
|
||||||
|
]
|
||||||
|
|
||||||
|
return workflow_descriptions
|
||||||
|
|
||||||
|
|
||||||
def get_workflow_description(workflow_id):
|
def get_workflow_description(workflow_id):
|
||||||
workflow = _exec_get_with_retry(API_URL + f"/actions/runs/{workflow_id}")
|
workflow = _exec_get_with_retry(API_URL + f"/actions/runs/{workflow_id}")
|
||||||
return WorkflowDescription(
|
return WorkflowDescription(
|
||||||
@ -189,6 +248,21 @@ def main(event):
|
|||||||
if action == "closed" or "do not test" in labels:
|
if action == "closed" or "do not test" in labels:
|
||||||
print("PR merged/closed or manually labeled 'do not test' will kill workflows")
|
print("PR merged/closed or manually labeled 'do not test' will kill workflows")
|
||||||
workflow_descriptions = get_workflows_description_for_pull_request(pull_request)
|
workflow_descriptions = get_workflows_description_for_pull_request(pull_request)
|
||||||
|
workflow_descriptions = (
|
||||||
|
workflow_descriptions or get_workflow_description_fallback(event_data)
|
||||||
|
)
|
||||||
|
urls_to_cancel = []
|
||||||
|
for workflow_description in workflow_descriptions:
|
||||||
|
if workflow_description.status != "completed":
|
||||||
|
urls_to_cancel.append(workflow_description.cancel_url)
|
||||||
|
print(f"Found {len(urls_to_cancel)} workflows to cancel")
|
||||||
|
exec_workflow_url(urls_to_cancel, token)
|
||||||
|
elif action == "synchronize":
|
||||||
|
print("PR is synchronized, going to stop old actions")
|
||||||
|
workflow_descriptions = get_workflows_description_for_pull_request(pull_request)
|
||||||
|
workflow_descriptions = (
|
||||||
|
workflow_descriptions or get_workflow_description_fallback(event_data)
|
||||||
|
)
|
||||||
urls_to_cancel = []
|
urls_to_cancel = []
|
||||||
for workflow_description in workflow_descriptions:
|
for workflow_description in workflow_descriptions:
|
||||||
if workflow_description.status != "completed":
|
if workflow_description.status != "completed":
|
||||||
|
Loading…
Reference in New Issue
Block a user