ci: build newly added variants in the PR matrix (#11549)

* ci: build newly added variants in the PR matrix

A new board declares board_level = release, so it gets no CI build until
after merge. Build the first env of each platformio.ini added by a PR,
regardless of board_level.

Only added files qualify; adding an env to an existing config does not.

* ci: also detect added variants in merge_group runs

merge_group uses the same --level pr subset as pull_request, so a newly
added variant was skipped there. Derive the diff base from
github.event.merge_group.base_sha for those runs.

* ci: fail the matrix step when the variant diff errors

Process substitution hides the exit status, so a failed diff silently
yielded an empty list and dropped the new board from the matrix. Capture
into a variable so 'set -e' aborts the step instead.
This commit is contained in:
Thomas Göttgens
2026-08-20 14:42:28 +00:00
committed by GitHub
parent 0b906b4d15
commit 68bfe015e6
2 changed files with 48 additions and 1 deletions
+22
View File
@@ -23,10 +23,29 @@ parser.add_argument(
default=[],
help="Board level to build for (omit for the 'pr' + 'release' matrix)",
)
parser.add_argument(
"--added-config",
action="append",
default=[],
metavar="PATH",
help="platformio.ini added by this PR; its first env is built regardless of board_level",
)
args = parser.parse_args()
outlist = []
# A brand-new board is normally 'release', so it would get no CI until after merge.
# Build the first env of each newly added config so it is compiled at least once.
forced_envs = set()
for added_path in args.added_config:
try:
with open(added_path, encoding="utf-8") as added_file:
first_env = re.search(r"^[ \t]*\[env:([^\]]+)\]", added_file.read(), re.MULTILINE)
except OSError:
continue
if first_env:
forced_envs.add(first_env.group(1).strip())
cfg = ProjectConfig.get_instance()
pio_envs = cfg.envs()
@@ -69,6 +88,9 @@ for env in all_envs:
# Always include board_level = 'pr'
if env["board_level"] == "pr":
outlist.append(env["ci"])
# Include the first env of a platformio.ini added by this PR
elif env["ci"]["board"] in forced_envs:
outlist.append(env["ci"])
# Include board_level = 'extra' when requested
elif "extra" in args.level and env["board_level"] == "extra":
outlist.append(env["ci"])