pytorch/.github/scripts/ensure_actions_will_cancel.py
Nikita Shulga d35e3dbd06 Fix concurrency limits for Create Release (#110759)
Also, don't run it on tags, but run on release branch and on `release` event.
Tweak linter to accept different concurrency limits for `create_release.yml`

Fixes https://github.com/pytorch/pytorch/issues/110569 as all the invocations of workflow in the past were cancelled by concurrently limit due to the tag push and release happening at roughly the same time, see https://github.com/pytorch/pytorch/actions/workflows/create_release.yml?query=event%3Arelease

Pull Request resolved: https://github.com/pytorch/pytorch/pull/110759
Approved by: https://github.com/atalman
2023-10-06 23:14:12 +00:00

75 lines
2.5 KiB
Python
Executable file

#!/usr/bin/env python3
import sys
from pathlib import Path
import yaml
REPO_ROOT = Path(__file__).resolve().parent.parent.parent
WORKFLOWS = REPO_ROOT / ".github" / "workflows"
EXPECTED_GROUP_PREFIX = (
"${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}"
)
EXPECTED_GROUP = (
EXPECTED_GROUP_PREFIX + "-${{ github.event_name == 'workflow_dispatch' }}"
)
def should_check(filename: Path) -> bool:
with open(filename) as f:
content = f.read()
data = yaml.safe_load(content)
on = data.get("on", data.get(True, {}))
return "pull_request" in on
if __name__ == "__main__":
errors_found = False
files = [f for f in WORKFLOWS.glob("*.yml") if should_check(f)]
names = set()
for filename in files:
with open(filename) as f:
data = yaml.safe_load(f)
name = data.get("name")
if name is not None and name in names:
print("ERROR: duplicate workflow name:", name, file=sys.stderr)
errors_found = True
names.add(name)
actual = data.get("concurrency", {})
if filename.name == "create_release.yml":
if not actual.get("group", "").startswith(EXPECTED_GROUP_PREFIX):
print(
f"'concurrency' incorrect or not found in '{filename.relative_to(REPO_ROOT)}'",
file=sys.stderr,
)
print(
f"concurrency group should start with {EXPECTED_GROUP_PREFIX} but found {actual.get('group', None)}",
file=sys.stderr,
)
errors_found = True
elif not actual.get("group", "").startswith(EXPECTED_GROUP):
print(
f"'concurrency' incorrect or not found in '{filename.relative_to(REPO_ROOT)}'",
file=sys.stderr,
)
print(
f"concurrency group should start with {EXPECTED_GROUP} but found {actual.get('group', None)}",
file=sys.stderr,
)
errors_found = True
if not actual.get("cancel-in-progress", False):
print(
f"'concurrency' incorrect or not found in '{filename.relative_to(REPO_ROOT)}'",
file=sys.stderr,
)
print(
f"concurrency cancel-in-progress should be True but found {actual.get('cancel-in-progress', None)}",
file=sys.stderr,
)
if errors_found:
sys.exit(1)