summaryrefslogtreecommitdiff
path: root/.github
diff options
context:
space:
mode:
authorhathach <[email protected]>2025-12-03 11:09:41 +0700
committerhathach <[email protected]>2025-12-03 23:04:49 +0700
commitf51ca33f25841147e93c72458c927261806cdc0e (patch)
tree7882c1ebe7d468512a3d7d770000474d7d01af0e /.github
parentee3d3e3551f95757b85de1c2c9777a1daed8f78d (diff)
upload metrics.json and aggregate code metrics, post metrics comment
fine tune ci matrix run
Diffstat (limited to '.github')
-rw-r--r--.github/workflows/build.yml416
-rw-r--r--.github/workflows/build_util.yml2
-rwxr-xr-x.github/workflows/ci_set_matrix.py6
3 files changed, 230 insertions, 194 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 5e996d9d9..b0b636c65 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -83,6 +83,8 @@ jobs:
code-metrics:
needs: cmake
runs-on: ubuntu-latest
+ permissions:
+ pull-requests: write
steps:
- name: Checkout TinyUSB
uses: actions/checkout@v4
@@ -96,197 +98,233 @@ jobs:
- name: Aggregate Code Metrics
run: |
- tree cmake-build
python tools/get_deps.py
- python tools/metrics.py -f tinyusb/src cmake-build/*/metrics.json
+ pip install tools/linkermap/
+ python tools/metrics.py combine -j -m -f tinyusb/src cmake-build/*/metrics.json
+
+ - name: Upload Metrics Artifact
+ if: github.event_name == 'push'
+ uses: actions/upload-artifact@v5
+ with:
+ name: metrics-tinyusb
+ path: metrics.json
+
+ - name: Download Base Branch Metrics
+ if: github.event_name == 'pull_request'
+ uses: dawidd6/action-download-artifact@v11
+ with:
+ workflow: build.yml
+ branch: ${{ github.base_ref }}
+ name: metrics-tinyusb
+ path: base-metrics
+ continue-on-error: true
+
+ - name: Compare with Base Branch
+ if: github.event_name == 'pull_request'
+ run: |
+ if [ -f base-metrics/metrics.json ]; then
+ python tools/metrics.py compare -f tinyusb/src base-metrics/metrics.json metrics.json
+ cat metrics_compare.md
+ else
+ echo "No base metrics found, skipping comparison"
+ cp metrics.md metrics_compare.md
+ fi
+
+ - name: Post Code Metrics as PR Comment
+ if: github.event_name == 'pull_request'
+ uses: marocchino/sticky-pull-request-comment@v2
+ with:
+ header: code-metrics
+ path: metrics_compare.md
+
# ---------------------------------------
# Build Make: only build on push with one-per-family
# ---------------------------------------
-# make:
-# if: github.event_name == 'push'
-# needs: set-matrix
-# uses: ./.github/workflows/build_util.yml
-# strategy:
-# fail-fast: false
-# matrix:
-# toolchain:
-# - 'aarch64-gcc'
-# #- 'arm-clang'
-# - 'arm-gcc'
-# - 'msp430-gcc'
-# - 'riscv-gcc'
-# - 'rx-gcc'
-# with:
-# build-system: 'make'
-# toolchain: ${{ matrix.toolchain }}
-# build-args: ${{ toJSON(fromJSON(needs.set-matrix.outputs.json)[matrix.toolchain]) }}
-# one-per-family: true
-#
-# # ---------------------------------------
-# # Build IAR
-# # Since IAR Token secret is not passed to forked PR, only build non-forked PR with make.
-# # cmake is built by circle-ci. Due to IAR limit capacity, only build oe per family
-# # ---------------------------------------
-# arm-iar:
-# if: false # disable for now since we got reach capacity limit too often
-# #if: github.event_name == 'push' && github.repository_owner == 'hathach'
-# needs: set-matrix
-# uses: ./.github/workflows/build_util.yml
-# secrets: inherit
-# strategy:
-# fail-fast: false
-# matrix:
-# build-system:
-# - 'make'
-# with:
-# build-system: ${{ matrix.build-system }}
-# toolchain: 'arm-iar'
-# build-args: ${{ toJSON(fromJSON(needs.set-matrix.outputs.json)['arm-iar']) }}
-# one-per-family: true
-#
-# # ---------------------------------------
-# # Build Make/CMake on Windows/MacOS
-# # ---------------------------------------
-# build-os:
-# if: github.event_name == 'pull_request'
-# uses: ./.github/workflows/build_util.yml
-# strategy:
-# fail-fast: false
-# matrix:
-# os: [windows-latest, macos-latest]
-# build-system: [ 'make', 'cmake' ]
-# with:
-# os: ${{ matrix.os }}
-# build-system: ${{ matrix.build-system }}
-# toolchain: 'arm-gcc-${{ matrix.os }}'
-# build-args: '["stm32h7"]'
-# one-per-family: true
-#
-# # ---------------------------------------
-# # Zephyr
-# # ---------------------------------------
-# zephyr:
-# if: github.event_name == 'push'
-# runs-on: ubuntu-latest
-# steps:
-# - name: Checkout TinyUSB
-# uses: actions/checkout@v4
-#
-# - name: Setup Zephyr project
-# uses: zephyrproject-rtos/action-zephyr-setup@v1
-# with:
-# app-path: examples
-# toolchains: arm-zephyr-eabi
-#
-# - name: Build
-# run: |
-# west build -b nrf52840dk -d examples/device/cdc_msc/build examples/device/cdc_msc -- -DRTOS=zephyr
-# west build -b nrf52840dk -d examples/device/msc_dual_lun/build examples/device/msc_dual_lun -- -DRTOS=zephyr
-#
-# # ---------------------------------------
-# # Hardware in the loop (HIL)
-# # Run on PR only (hil-tinyusb), hil-hfp only run on non-forked PR
-# # ---------------------------------------
-# hil-build:
-# if: |
-# github.repository_owner == 'hathach' &&
-# (github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch')
-# needs: set-matrix
-# uses: ./.github/workflows/build_util.yml
-# strategy:
-# fail-fast: false
-# matrix:
-# toolchain:
-# - 'arm-gcc'
-# - 'esp-idf'
-# with:
-# build-system: 'cmake'
-# toolchain: ${{ matrix.toolchain }}
-# build-args: ${{ toJSON(fromJSON(needs.set-matrix.outputs.hil_json)[matrix.toolchain]) }}
-# one-per-family: true
-# upload-artifacts: true
-#
-# # ---------------------------------------
-# # Hardware in the loop (HIL)
-# # self-hosted on local VM, for attached hardware checkout HIL_JSON
-# # ---------------------------------------
-# hil-tinyusb:
-# if: |
-# github.repository_owner == 'hathach' &&
-# (github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch')
-# needs: hil-build
-# runs-on: [self-hosted, X64, hathach, hardware-in-the-loop]
-# steps:
-# - name: Get Skip Boards from previous run
-# if: github.run_attempt != '1'
-# run: |
-# if [ -f "${{ env.HIL_JSON }}.skip" ]; then
-# SKIP_BOARDS=$(cat "${{ env.HIL_JSON }}.skip")
-# else
-# SKIP_BOARDS=""
-# fi
-# echo "SKIP_BOARDS=$SKIP_BOARDS"
-# echo "SKIP_BOARDS=$SKIP_BOARDS" >> $GITHUB_ENV
-#
-# - name: Clean workspace
-# run: |
-# echo "Cleaning up for the first run"
-# rm -rf "${{ github.workspace }}"
-# mkdir -p "${{ github.workspace }}"
-#
-# - name: Checkout TinyUSB
-# uses: actions/checkout@v4
-#
-# - name: Download Artifacts
-# uses: actions/download-artifact@v5
-# with:
-# path: cmake-build
-# merge-multiple: true
-#
-# - name: Test on actual hardware
-# run: |
-# python3 test/hil/hil_test.py ${{ env.HIL_JSON }} $SKIP_BOARDS
-#
-# # ---------------------------------------
-# # Hardware in the loop (HIL)
-# # self-hosted by HFP, build with IAR toolchain, for attached hardware checkout test/hil/hfp.json
-# # Since IAR Token secret is not passed to forked PR, only build non-forked PR
-# # ---------------------------------------
-# hil-hfp:
-# if: |
-# github.repository_owner == 'hathach' &&
-# github.event.pull_request.head.repo.fork == false &&
-# (github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch')
-# runs-on: [self-hosted, Linux, X64, hifiphile]
-# env:
-# IAR_LMS_BEARER_TOKEN: ${{ secrets.IAR_LMS_BEARER_TOKEN }}
-# steps:
-# - name: Clean workspace
-# run: |
-# echo "Cleaning up previous run"
-# rm -rf "${{ github.workspace }}"3
-# mkdir -p "${{ github.workspace }}"
-#
-# - name: Toolchain version
-# run: |
-# iccarm --version
-#
-# - name: Checkout TinyUSB
-# uses: actions/checkout@v4
-#
-# - name: Get build boards
-# run: |
-# MATRIX_JSON=$(python test/hil/hil_ci_set_matrix.py test/hil/hfp.json)
-# BUILD_ARGS=$(echo $MATRIX_JSON | jq -r '.["arm-gcc"] | join(" ")')
-# echo "BUILD_ARGS=$BUILD_ARGS"
-# echo "BUILD_ARGS=$BUILD_ARGS" >> $GITHUB_ENV
-#
-# - name: Get Dependencies
-# run: python3 tools/get_deps.py $BUILD_ARGS
-#
-# - name: Build
-# run: python3 tools/build.py -j 4 --toolchain iar $BUILD_ARGS
-#
-# - name: Test on actual hardware (hardware in the loop)
-# run: python3 test/hil/hil_test.py hfp.json
+ make:
+ if: github.event_name == 'push'
+ needs: set-matrix
+ uses: ./.github/workflows/build_util.yml
+ strategy:
+ fail-fast: false
+ matrix:
+ toolchain:
+ - 'aarch64-gcc'
+ #- 'arm-clang'
+ - 'arm-gcc'
+ - 'msp430-gcc'
+ - 'riscv-gcc'
+ - 'rx-gcc'
+ with:
+ build-system: 'make'
+ toolchain: ${{ matrix.toolchain }}
+ build-args: ${{ toJSON(fromJSON(needs.set-matrix.outputs.json)[matrix.toolchain]) }}
+ one-per-family: true
+
+ # ---------------------------------------
+ # Build IAR
+ # Since IAR Token secret is not passed to forked PR, only build non-forked PR with make.
+ # cmake is built by circle-ci. Due to IAR limit capacity, only build oe per family
+ # ---------------------------------------
+ arm-iar:
+ if: false # disable for now since we got reach capacity limit too often
+ #if: github.event_name == 'push' && github.repository_owner == 'hathach'
+ needs: set-matrix
+ uses: ./.github/workflows/build_util.yml
+ secrets: inherit
+ strategy:
+ fail-fast: false
+ matrix:
+ build-system:
+ - 'make'
+ with:
+ build-system: ${{ matrix.build-system }}
+ toolchain: 'arm-iar'
+ build-args: ${{ toJSON(fromJSON(needs.set-matrix.outputs.json)['arm-iar']) }}
+ one-per-family: true
+
+ # ---------------------------------------
+ # Build Make/CMake on Windows/MacOS
+ # ---------------------------------------
+ build-os:
+ if: github.event_name == 'pull_request'
+ uses: ./.github/workflows/build_util.yml
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [ windows-latest, macos-latest ]
+ build-system: [ 'make', 'cmake' ]
+ with:
+ os: ${{ matrix.os }}
+ build-system: ${{ matrix.build-system }}
+ toolchain: 'arm-gcc-${{ matrix.os }}'
+ build-args: '["stm32h7"]'
+ one-per-family: true
+
+ # ---------------------------------------
+ # Zephyr
+ # ---------------------------------------
+ zephyr:
+ if: github.event_name == 'push'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout TinyUSB
+ uses: actions/checkout@v4
+
+ - name: Setup Zephyr project
+ uses: zephyrproject-rtos/action-zephyr-setup@v1
+ with:
+ app-path: examples
+ toolchains: arm-zephyr-eabi
+
+ - name: Build
+ run: |
+ west build -b nrf52840dk -d examples/device/cdc_msc/build examples/device/cdc_msc -- -DRTOS=zephyr
+ west build -b nrf52840dk -d examples/device/msc_dual_lun/build examples/device/msc_dual_lun -- -DRTOS=zephyr
+
+ # ---------------------------------------
+ # Hardware in the loop (HIL)
+ # Run on PR only (hil-tinyusb), hil-hfp only run on non-forked PR
+ # ---------------------------------------
+ hil-build:
+ if: |
+ github.repository_owner == 'hathach' &&
+ (github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch')
+ needs: set-matrix
+ uses: ./.github/workflows/build_util.yml
+ strategy:
+ fail-fast: false
+ matrix:
+ toolchain:
+ - 'arm-gcc'
+ - 'esp-idf'
+ with:
+ build-system: 'cmake'
+ toolchain: ${{ matrix.toolchain }}
+ build-args: ${{ toJSON(fromJSON(needs.set-matrix.outputs.hil_json)[matrix.toolchain]) }}
+ one-per-family: true
+ upload-artifacts: true
+
+ # ---------------------------------------
+ # Hardware in the loop (HIL)
+ # self-hosted on local VM, for attached hardware checkout HIL_JSON
+ # ---------------------------------------
+ hil-tinyusb:
+ if: |
+ github.repository_owner == 'hathach' &&
+ (github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch')
+ needs: hil-build
+ runs-on: [ self-hosted, X64, hathach, hardware-in-the-loop ]
+ steps:
+ - name: Get Skip Boards from previous run
+ if: github.run_attempt != '1'
+ run: |
+ if [ -f "${{ env.HIL_JSON }}.skip" ]; then
+ SKIP_BOARDS=$(cat "${{ env.HIL_JSON }}.skip")
+ else
+ SKIP_BOARDS=""
+ fi
+ echo "SKIP_BOARDS=$SKIP_BOARDS"
+ echo "SKIP_BOARDS=$SKIP_BOARDS" >> $GITHUB_ENV
+
+ - name: Clean workspace
+ run: |
+ echo "Cleaning up for the first run"
+ rm -rf "${{ github.workspace }}"
+ mkdir -p "${{ github.workspace }}"
+
+ - name: Checkout TinyUSB
+ uses: actions/checkout@v4
+
+ - name: Download Artifacts
+ uses: actions/download-artifact@v5
+ with:
+ path: cmake-build
+ merge-multiple: true
+
+ - name: Test on actual hardware
+ run: |
+ python3 test/hil/hil_test.py ${{ env.HIL_JSON }} $SKIP_BOARDS
+
+ # ---------------------------------------
+ # Hardware in the loop (HIL)
+ # self-hosted by HFP, build with IAR toolchain, for attached hardware checkout test/hil/hfp.json
+ # Since IAR Token secret is not passed to forked PR, only build non-forked PR
+ # ---------------------------------------
+ hil-hfp:
+ if: |
+ github.repository_owner == 'hathach' &&
+ github.event.pull_request.head.repo.fork == false &&
+ (github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch')
+ runs-on: [ self-hosted, Linux, X64, hifiphile ]
+ env:
+ IAR_LMS_BEARER_TOKEN: ${{ secrets.IAR_LMS_BEARER_TOKEN }}
+ steps:
+ - name: Clean workspace
+ run: |
+ echo "Cleaning up previous run"
+ rm -rf "${{ github.workspace }}"3
+ mkdir -p "${{ github.workspace }}"
+
+ - name: Toolchain version
+ run: |
+ iccarm --version
+
+ - name: Checkout TinyUSB
+ uses: actions/checkout@v4
+
+ - name: Get build boards
+ run: |
+ MATRIX_JSON=$(python test/hil/hil_ci_set_matrix.py test/hil/hfp.json)
+ BUILD_ARGS=$(echo $MATRIX_JSON | jq -r '.["arm-gcc"] | join(" ")')
+ echo "BUILD_ARGS=$BUILD_ARGS"
+ echo "BUILD_ARGS=$BUILD_ARGS" >> $GITHUB_ENV
+
+ - name: Get Dependencies
+ run: python3 tools/get_deps.py $BUILD_ARGS
+
+ - name: Build
+ run: python3 tools/build.py -j 4 --toolchain iar $BUILD_ARGS
+
+ - name: Test on actual hardware (hardware in the loop)
+ run: python3 test/hil/hil_test.py hfp.json
diff --git a/.github/workflows/build_util.yml b/.github/workflows/build_util.yml
index 2de0ed229..36043a1d5 100644
--- a/.github/workflows/build_util.yml
+++ b/.github/workflows/build_util.yml
@@ -75,7 +75,7 @@ jobs:
- name: Upload Artifacts for Metrics
if: ${{ inputs.upload-metrics }}
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v5
with:
name: metrics-${{ matrix.arg }}
path: cmake-build/cmake-build-*/metrics.json
diff --git a/.github/workflows/ci_set_matrix.py b/.github/workflows/ci_set_matrix.py
index 5032c83ae..933a8375f 100755
--- a/.github/workflows/ci_set_matrix.py
+++ b/.github/workflows/ci_set_matrix.py
@@ -20,8 +20,7 @@ family_list = {
"ch32v10x ch32v20x ch32v30x fomu gd32vf103": ["riscv-gcc"],
"imxrt": ["arm-gcc", "arm-clang"],
"kinetis_k kinetis_kl kinetis_k32l2": ["arm-gcc", "arm-clang"],
- "lpc11 lpc13 lpc15": ["arm-gcc", "arm-clang"],
- "lpc17 lpc18 lpc40 lpc43": ["arm-gcc", "arm-clang"],
+ "lpc11 lpc13 lpc15 lpc17 lpc18 lpc40 lpc43": ["arm-gcc", "arm-clang"],
"lpc51 lpc54 lpc55": ["arm-gcc", "arm-clang"],
"maxim mcx mm32 msp432e4 tm4c": ["arm-gcc"],
"msp430": ["msp430-gcc"],
@@ -36,8 +35,7 @@ family_list = {
"stm32f7": ["arm-gcc", "arm-clang", "arm-iar"],
"stm32g0 stm32g4 stm32h5": ["arm-gcc", "arm-clang", "arm-iar"],
"stm32h7": ["arm-gcc", "arm-clang", "arm-iar"],
- "stm32h7rs": ["arm-gcc", "arm-clang", "arm-iar"],
- "stm32l0 stm32l4": ["arm-gcc", "arm-clang", "arm-iar"],
+ "stm32h7rs stm32l0 stm32l4": ["arm-gcc", "arm-clang", "arm-iar"],
"stm32n6": ["arm-gcc"],
"stm32u0 stm32u5 stm32wb stm32wba": ["arm-gcc", "arm-clang", "arm-iar"],
"-bespressif_s2_devkitc": ["esp-idf"],