diff --git a/.github/workflows/create-test-plan.py b/.github/workflows/create-test-plan.py index 4ce15489b7..69dca4e4c5 100755 --- a/.github/workflows/create-test-plan.py +++ b/.github/workflows/create-test-plan.py @@ -7,6 +7,7 @@ import json import logging import os import re +import shlex from typing import Optional logger = logging.getLogger(__name__) @@ -234,6 +235,7 @@ class JobDetails: pypi_packages: list[str] = dataclasses.field(default_factory=list) setup_gage_sdk_path: str = "" binutils_strings: str = "strings" + ctest_args: str = "" def to_workflow(self, enable_artifacts: bool) -> dict[str, str|bool]: data = { @@ -303,6 +305,7 @@ class JobDetails: "pypi-packages": my_shlex_join(self.pypi_packages), "setup-ngage-sdk-path": self.setup_gage_sdk_path, "binutils-strings": self.binutils_strings, + "ctest-args": self.ctest_args, } return {k: v for k, v in data.items() if v != ""} @@ -318,7 +321,7 @@ def my_shlex_join(s): return " ".join(escape(s)) -def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool) -> JobDetails: +def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool, ctest_args: list[str]) -> JobDetails: job = JobDetails( name=spec.name, key=key, @@ -828,6 +831,7 @@ def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool) -> JobDeta "-DCMAKE_C_COMPILER_LAUNCHER=ccache", "-DCMAKE_CXX_COMPILER_LAUNCHER=ccache", )) + job.ctest_args = shlex.join(ctest_args) if not build_parallel: job.cmake_build_arguments.append("-j1") if job.cflags or job.cppflags: @@ -850,9 +854,14 @@ def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool) -> JobDeta return job -def spec_to_platform(spec: JobSpec, key: str, enable_artifacts: bool, trackmem_symbol_names: bool) -> dict[str, str|bool]: +def spec_to_platform(spec: JobSpec, key: str, enable_artifacts: bool, trackmem_symbol_names: bool, ctest_args:list[str]) -> dict[str, str|bool]: logger.info("spec=%r", spec) - job = spec_to_job(spec, key=key, trackmem_symbol_names=trackmem_symbol_names) + job = spec_to_job( + spec, + key=key, + trackmem_symbol_names=trackmem_symbol_names, + ctest_args=ctest_args, + ) logger.info("job=%r", job) platform = job.to_workflow(enable_artifacts=enable_artifacts) logger.info("platform=%r", platform) @@ -881,6 +890,7 @@ def main(): ) filters = [] + ctest_args = [] if args.commit_message_file: with open(args.commit_message_file, "r") as f: commit_message = f.read() @@ -893,6 +903,9 @@ def main(): if re.search(r"\[sdl-ci-(full-)?trackmem(-symbol-names)?]", commit_message, flags=re.M): args.trackmem_symbol_names = True + for m in re.finditer(r"\[sdl-ci-ctest-args? (.*)]", commit_message, flags=re.M): + ctest_args.extend(shlex.split(m.group(1))) + if not filters: filters.append("*") @@ -900,7 +913,7 @@ def main(): all_level_platforms = {} - all_platforms = {key: spec_to_platform(spec, key=key, enable_artifacts=args.enable_artifacts, trackmem_symbol_names=args.trackmem_symbol_names) for key, spec in JOB_SPECS.items()} + all_platforms = {key: spec_to_platform(spec, key=key, enable_artifacts=args.enable_artifacts, trackmem_symbol_names=args.trackmem_symbol_names, ctest_args=ctest_args) for key, spec in JOB_SPECS.items()} for level_i, level_keys in enumerate(all_level_keys, 1): level_key = f"level{level_i}" diff --git a/.github/workflows/generic.yml b/.github/workflows/generic.yml index 183146679b..82fcbaf156 100644 --- a/.github/workflows/generic.yml +++ b/.github/workflows/generic.yml @@ -242,7 +242,7 @@ jobs: ${{ matrix.platform.pretest-cmd }} set -eu export SDL_TESTS_QUICK=1 - ctest -VV --test-dir build/ -j2 + ctest --test-dir build/ ${{ matrix.platform.ctest-args || '-VV -j2' }} - name: "Build test apk's (CMake)" id: apks if: ${{ always() && steps.build.outcome == 'success' && matrix.platform.android-apks != '' }} diff --git a/docs/README-contributing.md b/docs/README-contributing.md index 02a37bf756..b926e1d0de 100644 --- a/docs/README-contributing.md +++ b/docs/README-contributing.md @@ -95,6 +95,7 @@ Its behaviour can be influenced slightly by including SDL-specific tags in your - `[sdl-ci-filter GLOB]` limits the platforms for which to run ci. - `[sdl-ci-artifacts]` forces SDL artifacts, which can then be downloaded from the summary page. - `[sdl-ci-trackmem-symbol-names]` makes sure the final report generated by `--trackmem` contains symbol names. +- `[sdl-ci-ctest-args]` allows overriding the ctest arguments. Adding `--repeat-until-fail N` and `-R NAME` is useful. ## Contributing to the documentation