Browse Source

ci: limit jobs by using sdl-ci-filter

[sdl-ci-filter msvc-*]
Anonymous Maarten 8 months ago
parent
commit
12eb1f1497
2 changed files with 34 additions and 2 deletions
  1. 9 1
      .github/workflows/build.yml
  2. 25 1
      .github/workflows/create-test-plan.py

+ 9 - 1
.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'

+ 25 - 1
.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())
-