@@ -127,6 +127,35 @@ commands:
127127 python tools/build.py -s << parameters.build-system >> $TOOLCHAIN_OPTION -j 4 << parameters.build-args >> << parameters.family >>
128128 fi
129129
130+ # Only collect and persist metrics for cmake builds (excluding esp-idf and --one-random)
131+ - when :
132+ condition :
133+ and :
134+ - equal : [ cmake, << parameters.build-system >> ]
135+ - not :
136+ equal : [ esp-idf, << parameters.toolchain >> ]
137+ - not :
138+ equal : [ arm-iar, << parameters.toolchain >> ]
139+ steps :
140+ - run :
141+ name : Collect Metrics
142+ command : |
143+ # Create unique directory per toolchain to avoid workspace conflicts
144+ METRICS_DIR="/tmp/metrics/<< parameters.toolchain >>"
145+ mkdir -p "${METRICS_DIR}"
146+ # Copy all metrics.json files
147+ for f in cmake-build/cmake-build-*/metrics.json; do
148+ if [ -f "$f" ]; then
149+ BOARD_DIR=$(dirname "$f" | xargs basename)
150+ cp "$f" "${METRICS_DIR}/${BOARD_DIR}.json"
151+ fi
152+ done
153+
154+ - persist_to_workspace :
155+ root : /tmp
156+ paths :
157+ - metrics/<< parameters.toolchain >>
158+
130159jobs :
131160 # Build using docker
132161 build :
@@ -146,6 +175,7 @@ jobs:
146175
147176 docker :
148177 - image : cimg/base:current
178+ working_directory : ~/project/tinyusb
149179 resource_class : << parameters.resource_class >>
150180
151181 steps :
@@ -173,6 +203,7 @@ jobs:
173203
174204 machine :
175205 image : ubuntu-2404:current
206+ working_directory : ~/project/tinyusb
176207 resource_class : << parameters.resource_class >>
177208
178209 steps :
@@ -182,20 +213,79 @@ jobs:
182213 family : << parameters.family >>
183214 build-args : << parameters.build-args >>
184215
216+ # Aggregate code metrics from all builds
217+ code-metrics :
218+ docker :
219+ - image : cimg/python:3.12
220+ resource_class : large
221+ steps :
222+ - checkout
223+ - attach_workspace :
224+ at : /tmp
225+
226+ - run :
227+ name : Aggregate Code Metrics
228+ command : |
229+ python tools/get_deps.py
230+ pip install tools/linkermap/
231+ # Combine all metrics files from all toolchain subdirectories
232+ ls -R /tmp/metrics
233+ if ls /tmp/metrics/*/*.json 1> /dev/null 2>&1; then
234+ python tools/metrics.py combine -j -m -f tinyusb/src /tmp/metrics/*/*.json
235+ else
236+ echo "No metrics files found"
237+ exit 1
238+ fi
239+
240+ - store_artifacts :
241+ path : metrics.json
242+ destination : metrics.json
243+
244+ # Compare with base master metrics on PR branches
245+ - when :
246+ condition :
247+ not :
248+ equal : [ master, << pipeline.git.branch >> ]
249+ steps :
250+ - run :
251+ name : Download Base Branch Metrics
252+ command : |
253+ # Download metrics.json artifact from the latest successful build on master branch
254+ mkdir -p base-metrics
255+ # Use CircleCI API to get the latest artifact
256+ curl -s -L "https://dl.circleci.com/api/v2/project/gh/${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}/latest/artifacts?branch=master&filter=successful" \
257+ -H "Circle-Token: ${CIRCLE_TOKEN:-}" | \
258+ jq -r '.items[] | select(.path == "metrics.json") | .url' | \
259+ head -1 | xargs -I {} curl -s -L -o base-metrics/metrics.json {} || true
260+
261+ - run :
262+ name : Compare with Base Branch
263+ command : |
264+ if [ -f base-metrics/metrics.json ]; then
265+ python tools/metrics.py compare -f tinyusb/src base-metrics/metrics.json metrics.json
266+ cat metrics_compare.md
267+ else
268+ echo "No base metrics found, skipping comparison"
269+ cp metrics.md metrics_compare.md
270+ fi
271+
272+ - store_artifacts :
273+ path : metrics_compare.md
274+ destination : metrics_compare.md
275+
185276workflows :
186277 build :
187278 jobs :
279+ # The jobs below are populated dynamically by config.yml set-matrix job
280+ # Example entries that will be generated:
188281# - build:
189282# matrix:
283+ # alias: build-cmake-arm-gcc
190284# parameters:
191285# toolchain: [ 'arm-gcc' ]
192286# build-system: [ 'cmake' ]
193287# family: [ 'nrf' ]
194288# resource_class: ['large']
195- # - build-vm:
196- # matrix:
197- # parameters:
198- # toolchain: ['esp-idf']
199- # build-system: ['cmake']
200- # family: ['-bespressif_kaluga_1']
201- # resource_class: ['large']
289+ # - code-metrics:
290+ # requires:
291+ # - build-cmake-arm-gcc
0 commit comments