diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1e1fcc9737..0d436ee753 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,10 +23,18 @@ jobs: - name: 'Create plan' id: plan run: | + # Adding [sdl-ci-filter GLOB] to the commit message will limit the jobs + # e.g. [sdl-ci-filter msvc-*] + EOF=$(openssl rand -hex 32) + cat >/tmp/commit_message.txt <<$EOF + ${{ github.event.head_commit.message }} + $EOF + python .github/workflows/create-test-plan.py \ --github-variable-prefix platforms \ --github-ci \ - --verbose + --verbose \ + --commit-message-file /tmp/commit_message.txt level1: needs: [controller] uses: './.github/workflows/generic.yml' diff --git a/.github/workflows/create-test-plan.py b/.github/workflows/create-test-plan.py index 58d8ff308d..77ba2f9c9c 100755 --- a/.github/workflows/create-test-plan.py +++ b/.github/workflows/create-test-plan.py @@ -1,10 +1,12 @@ #!/usr/bin/env python import argparse import dataclasses +import fnmatch from enum import Enum import json import logging import os +import re from typing import Optional logger = logging.getLogger(__name__) @@ -595,6 +597,7 @@ def main(): parser.add_argument("--github-variable-prefix", default="platforms") parser.add_argument("--github-ci", action="store_true") parser.add_argument("--verbose", action="store_true") + parser.add_argument("--commit-message-file") args = parser.parse_args() logging.basicConfig(level=logging.INFO if args.verbose else logging.WARNING) @@ -608,6 +611,18 @@ def main(): ), ) + filters = [] + if args.commit_message_file: + with open(args.commit_message_file, "r") as f: + commit_message = f.read() + for m in re.finditer(r"\[sdl-ci-filter (.*)]", commit_message, flags=re.M): + filters.append(m.group(1).strip(" \t\n\r\t'\"")) + + if not filters: + filters.append("*") + + logger.info("filters: %r", filters) + all_level_platforms = {} for level_i, level_keys in enumerate(all_level_keys, 1): @@ -619,6 +634,16 @@ def main(): all_level_platforms[level_key] = specs_to_plaform(level_specs) logger.info("=" * 80) + logger.info("Keys before filter: %r", remaining_keys) + + filtered_remaining_keys = set() + for filter in filters: + filtered_remaining_keys.update(fnmatch.filter(remaining_keys, filter)) + + logger.info("Keys after filter: %r", filtered_remaining_keys) + + remaining_keys = filtered_remaining_keys + logger.info("Remaining:") remaining_specs = tuple(JOB_SPECS[key] for key in remaining_keys) all_level_platforms["others"] = specs_to_plaform(remaining_specs) @@ -639,4 +664,3 @@ def main(): if __name__ == "__main__": raise SystemExit(main()) -