Skip to content

Commit 93b5315

Browse files
authored
Run CI build with fixed set of boards (#3389)
* run cmake ci build on github with a fixed set of board to keep the size stable * Size Difference Report contain major >1% and minor <1& table
1 parent e7105b1 commit 93b5315

File tree

6 files changed

+112
-76
lines changed

6 files changed

+112
-76
lines changed

.circleci/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ jobs:
4444
local build_args=""
4545
4646
if [[ "$toolchain" == "arm-iar" || "$build_system" == "make" ]]; then
47-
build_args="--one-per-family"
47+
build_args="--one-random"
4848
fi
4949
5050
if [[ "$toolchain" == "esp-idf" ]]; then

.github/workflows/build.yml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ jobs:
5757
echo "hil_matrix=$HIL_MATRIX_JSON" >> $GITHUB_OUTPUT
5858
5959
# ------------------------------------------------------------------------------
60-
# CMake build: only one-per-family. Full built is done by CircleCI in PR
60+
# CMake build: only one board per family (first alphabetically). Full build is done by CircleCI in PR
6161
# Note:
62-
# For Make and IAR build: will be done on CircleCI only (one-per-family too)
62+
# For Make and IAR build: will be done on CircleCI only (one random per family as well)
6363
# ------------------------------------------------------------------------------
6464
cmake:
6565
needs: set-matrix
@@ -78,7 +78,7 @@ jobs:
7878
build-system: 'cmake'
7979
toolchain: ${{ matrix.toolchain }}
8080
build-args: ${{ toJSON(fromJSON(needs.set-matrix.outputs.json)[matrix.toolchain]) }}
81-
one-per-family: true
81+
build-options: '--one-first'
8282
upload-metrics: true
8383

8484
code-metrics:
@@ -153,7 +153,7 @@ jobs:
153153
build-system: 'cmake-make'
154154
toolchain: 'arm-gcc-${{ matrix.os }}'
155155
build-args: '["stm32h7"]'
156-
one-per-family: true
156+
build-options: '--one-random'
157157

158158
# ---------------------------------------
159159
# Zephyr
@@ -196,7 +196,6 @@ jobs:
196196
build-system: 'cmake'
197197
toolchain: ${{ matrix.toolchain }}
198198
build-args: ${{ toJSON(fromJSON(needs.set-matrix.outputs.hil_json)[matrix.toolchain]) }}
199-
one-per-family: true
200199
upload-artifacts: true
201200

202201
# ---------------------------------------

.github/workflows/build_util.yml

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ on:
1212
build-args:
1313
required: true
1414
type: string
15-
one-per-family:
15+
build-options:
1616
required: false
17-
default: false
18-
type: boolean
17+
default: ''
18+
type: string
1919
upload-artifacts:
2020
required: false
2121
default: false
@@ -51,16 +51,6 @@ jobs:
5151
with:
5252
arg: ${{ matrix.arg }}
5353

54-
- name: Set build one-per-family option
55-
id: set-one-per-family
56-
run: |
57-
if [[ "${{ inputs.one-per-family }}" == "true" ]]; then
58-
BUILD_OPTION="--one-per-family"
59-
fi
60-
echo "build_option=$BUILD_OPTION"
61-
echo "build_option=$BUILD_OPTION" >> $GITHUB_OUTPUT
62-
shell: bash
63-
6454
- name: Build
6555
env:
6656
IAR_LMS_BEARER_TOKEN: ${{ secrets.IAR_LMS_BEARER_TOKEN }}
@@ -69,10 +59,10 @@ jobs:
6959
if [ "$TOOLCHAIN" == "esp-idf" ]; then
7060
docker run --rm -v $PWD:/project -w /project espressif/idf:tinyusb python tools/build.py ${{ matrix.arg }}
7161
elif [ "${{ inputs.build-system }}" == "cmake-make" ] || [ "${{ inputs.build-system }}" == "make-cmake" ]; then
72-
python tools/build.py -s make ${{ steps.setup-toolchain.outputs.build_option }} ${{ steps.set-one-per-family.outputs.build_option }} ${{ matrix.arg }}
73-
python tools/build.py -s cmake ${{ steps.setup-toolchain.outputs.build_option }} ${{ steps.set-one-per-family.outputs.build_option }} ${{ matrix.arg }}
62+
python tools/build.py -s make ${{ steps.setup-toolchain.outputs.build_option }} ${{ inputs.build-options }} ${{ matrix.arg }}
63+
python tools/build.py -s cmake ${{ steps.setup-toolchain.outputs.build_option }} ${{ inputs.build-options }} ${{ matrix.arg }}
7464
else
75-
python tools/build.py -s ${{ inputs.build-system }} ${{ steps.setup-toolchain.outputs.build_option }} ${{ steps.set-one-per-family.outputs.build_option }} ${{ matrix.arg }}
65+
python tools/build.py -s ${{ inputs.build-system }} ${{ steps.setup-toolchain.outputs.build_option }} ${{ inputs.build-options }} ${{ matrix.arg }}
7666
fi
7767
shell: bash
7868

hw/bsp/rp2040/skip_ci.txt

Lines changed: 0 additions & 7 deletions
This file was deleted.

tools/build.py

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,23 @@
2727
clean_build = False
2828
parallel_jobs = os.cpu_count()
2929

30+
# CI board control lists (used when running under CI)
31+
ci_skip_boards = {
32+
'rp2040': [
33+
'adafruit_feather_rp2040_usb_host',
34+
'adafruit_fruit_jam',
35+
'adafruit_metro_rp2350',
36+
'feather_rp2040_max3421',
37+
'pico_sdk',
38+
'raspberry_pi_pico_w',
39+
],
40+
}
41+
42+
ci_preferred_boards = {
43+
'stm32h7': ['stm32h743eval'],
44+
}
45+
46+
3047
# -----------------------------
3148
# Helper
3249
# -----------------------------
@@ -195,35 +212,40 @@ def build_boards_list(boards, build_defines, build_system, build_flags_on):
195212
return ret
196213

197214

198-
def get_family_boards(family, one_per_family, boards):
215+
def get_family_boards(family, one_random, one_first):
199216
"""Get list of boards for a family.
200217
201218
Args:
202219
family: Family name
203-
one_per_family: If True, return only one random board
204-
boards: List of boards already specified via -b flag
220+
one_random: If True, return only one random board
221+
one_first: If True, return only the first board (alphabetical)
205222
206223
Returns:
207224
List of board names
208225
"""
209-
skip_ci = []
226+
skip_list = []
227+
preferred_list = []
210228
if os.getenv('GITHUB_ACTIONS') or os.getenv('CIRCLECI'):
211-
skip_ci_file = Path(f"hw/bsp/{family}/skip_ci.txt")
212-
if skip_ci_file.exists():
213-
skip_ci = skip_ci_file.read_text().split()
229+
skip_list = ci_skip_boards.get(family, [])
230+
preferred_list = ci_preferred_boards.get(family, [])
231+
214232
all_boards = []
215233
for entry in os.scandir(f"hw/bsp/{family}/boards"):
216-
if entry.is_dir() and not entry.name in skip_ci:
234+
if entry.is_dir() and entry.name not in skip_list:
217235
all_boards.append(entry.name)
236+
if not all_boards:
237+
print(f"No boards found for family '{family}'")
238+
return []
218239
all_boards.sort()
219240

220-
# If only-one flag is set, select one random board
221-
if one_per_family:
222-
for b in boards:
223-
# skip if -b already specify one in this family
224-
if find_family(b) == family:
225-
return []
226-
all_boards = [random.choice(all_boards)]
241+
# If only-one flags are set, honor select list first, then pick first or random
242+
if one_first or one_random:
243+
if preferred_list:
244+
return [preferred_list[0]]
245+
if one_first:
246+
return [all_boards[0]]
247+
if one_random:
248+
return [random.choice(all_boards)]
227249

228250
return all_boards
229251

@@ -244,7 +266,10 @@ def main():
244266
parser.add_argument('-s', '--build-system', default='cmake', help='Build system to use, default is cmake')
245267
parser.add_argument('-D', '--define-symbol', action='append', default=[], help='Define to pass to build system')
246268
parser.add_argument('-f1', '--build-flags-on', action='append', default=[], help='Build flag to pass to build system')
247-
parser.add_argument('-1', '--one-per-family', action='store_true', default=False, help='Build only one random board inside a family')
269+
parser.add_argument('--one-random', action='store_true', default=False,
270+
help='Build only one random board of each specified family')
271+
parser.add_argument('--one-first', action='store_true', default=False,
272+
help='Build only the first board (alphabetical) of each specified family')
248273
parser.add_argument('-j', '--jobs', type=int, default=os.cpu_count(), help='Number of jobs to run in parallel')
249274
parser.add_argument('-v', '--verbose', action='store_true', help='Verbose output')
250275
args = parser.parse_args()
@@ -255,7 +280,8 @@ def main():
255280
build_system = args.build_system
256281
build_defines = args.define_symbol
257282
build_flags_on = args.build_flags_on
258-
one_per_family = args.one_per_family
283+
one_random = args.one_random
284+
one_first = args.one_first
259285
verbose = args.verbose
260286
clean_build = args.clean
261287
parallel_jobs = args.jobs
@@ -283,7 +309,7 @@ def main():
283309
# get boards from families and append to boards list
284310
all_boards = list(boards)
285311
for f in all_families:
286-
all_boards.extend(get_family_boards(f, one_per_family, boards))
312+
all_boards.extend(get_family_boards(f, one_random, one_first))
287313

288314
# build all boards
289315
result = build_boards_list(all_boards, build_defines, build_system, build_flags_on)

tools/metrics.py

Lines changed: 57 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -245,8 +245,18 @@ def write_compare_markdown(comparison, path, sort_order='size'):
245245
header += " Total |"
246246
separator += "------:|"
247247

248-
md_lines.append(header)
249-
md_lines.append(separator)
248+
def is_significant(file_row):
249+
for s in sections:
250+
sd = file_row["sections"][s]
251+
diff = abs(sd["diff"])
252+
base = sd["base"]
253+
if base == 0:
254+
if diff != 0:
255+
return True
256+
else:
257+
if (diff / base) * 100 > 1.0:
258+
return True
259+
return False
250260

251261
# Sort files based on sort_order
252262
if sort_order == 'size-':
@@ -263,38 +273,56 @@ def write_compare_markdown(comparison, path, sort_order='size'):
263273
reverse = False
264274
sorted_files = sorted(comparison["files"], key=key_func, reverse=reverse)
265275

266-
sum_base = {s: 0 for s in sections}
267-
sum_base["total"] = 0
268-
sum_new = {s: 0 for s in sections}
269-
sum_new["total"] = 0
270-
276+
significant = []
277+
minor = []
271278
for f in sorted_files:
272279
# Skip files with no changes
273280
if f["total"]["diff"] == 0 and all(f["sections"][s]["diff"] == 0 for s in sections):
274281
continue
275-
276-
row = f"| {f['file']} |"
282+
(significant if is_significant(f) else minor).append(f)
283+
284+
def render_table(title, rows):
285+
md_lines.append(f"## {title}")
286+
if not rows:
287+
md_lines.append("No entries.")
288+
md_lines.append("")
289+
return
290+
291+
md_lines.append(header)
292+
md_lines.append(separator)
293+
294+
sum_base = {s: 0 for s in sections}
295+
sum_base["total"] = 0
296+
sum_new = {s: 0 for s in sections}
297+
sum_new["total"] = 0
298+
299+
for f in rows:
300+
row = f"| {f['file']} |"
301+
for s in sections:
302+
sd = f["sections"][s]
303+
sum_base[s] += sd["base"]
304+
sum_new[s] += sd["new"]
305+
row += f" {format_diff(sd['base'], sd['new'], sd['diff'])} |"
306+
307+
td = f["total"]
308+
sum_base["total"] += td["base"]
309+
sum_new["total"] += td["new"]
310+
row += f" {format_diff(td['base'], td['new'], td['diff'])} |"
311+
312+
md_lines.append(row)
313+
314+
# Add sum row
315+
sum_row = "| **SUM** |"
277316
for s in sections:
278-
sd = f["sections"][s]
279-
sum_base[s] += sd["base"]
280-
sum_new[s] += sd["new"]
281-
row += f" {format_diff(sd['base'], sd['new'], sd['diff'])} |"
282-
283-
td = f["total"]
284-
sum_base["total"] += td["base"]
285-
sum_new["total"] += td["new"]
286-
row += f" {format_diff(td['base'], td['new'], td['diff'])} |"
287-
288-
md_lines.append(row)
289-
290-
# Add sum row
291-
sum_row = "| **SUM** |"
292-
for s in sections:
293-
diff = sum_new[s] - sum_base[s]
294-
sum_row += f" {format_diff(sum_base[s], sum_new[s], diff)} |"
295-
total_diff = sum_new["total"] - sum_base["total"]
296-
sum_row += f" {format_diff(sum_base['total'], sum_new['total'], total_diff)} |"
297-
md_lines.append(sum_row)
317+
diff = sum_new[s] - sum_base[s]
318+
sum_row += f" {format_diff(sum_base[s], sum_new[s], diff)} |"
319+
total_diff = sum_new["total"] - sum_base["total"]
320+
sum_row += f" {format_diff(sum_base['total'], sum_new['total'], total_diff)} |"
321+
md_lines.append(sum_row)
322+
md_lines.append("")
323+
324+
render_table("Changes >1% in any section", significant)
325+
render_table("Changes <1% in all sections", minor)
298326

299327
with open(path, "w", encoding="utf-8") as f:
300328
f.write("\n".join(md_lines))

0 commit comments

Comments
 (0)