Skip to content

Commit b594a08

Browse files
michael-membrowseRbb666
authored andcommitted
CI: MemBrowse integration
1 parent 6fc3e18 commit b594a08

5 files changed

Lines changed: 492 additions & 0 deletions

File tree

.github/membrowse-targets.json

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
[
2+
{
3+
"target_name": "stm32f407-rt-spark",
4+
"toolchain": "arm-none-eabi",
5+
"bsp_path": "bsp/stm32/stm32f407-rt-spark",
6+
"elf": "bsp/stm32/stm32f407-rt-spark/rt-thread.elf",
7+
"ld": "bsp/stm32/stm32f407-rt-spark/board/linker_scripts/link.lds",
8+
"map_file": "bsp/stm32/stm32f407-rt-spark/rt-thread.map",
9+
"linker_vars": ""
10+
},
11+
{
12+
"target_name": "stm32l475-atk-pandora-llvm",
13+
"toolchain": "llvm-arm",
14+
"bsp_path": "bsp/stm32/stm32l475-atk-pandora",
15+
"rtt_cc": "llvm-arm",
16+
"elf": "bsp/stm32/stm32l475-atk-pandora/rt-thread.elf",
17+
"ld": "bsp/stm32/stm32l475-atk-pandora/board/linker_scripts/link.lds",
18+
"map_file": "bsp/stm32/stm32l475-atk-pandora/rt-thread.map",
19+
"linker_vars": ""
20+
},
21+
{
22+
"target_name": "raspberry-pico-rp2040",
23+
"toolchain": "arm-none-eabi",
24+
"bsp_path": "bsp/raspberry-pico/RP2040",
25+
"elf": "bsp/raspberry-pico/RP2040/rtthread-pico.elf",
26+
"ld": "bsp/raspberry-pico/RP2040/link.ld",
27+
"map_file": "bsp/raspberry-pico/RP2040/rt-thread.map",
28+
"linker_vars": ""
29+
},
30+
{
31+
"target_name": "at32f415-start",
32+
"toolchain": "arm-none-eabi",
33+
"bsp_path": "bsp/at32/at32f415-start",
34+
"elf": "bsp/at32/at32f415-start/rtthread.elf",
35+
"ld": "bsp/at32/at32f415-start/board/linker_scripts/link.lds",
36+
"map_file": "bsp/at32/at32f415-start/rt-thread.map",
37+
"linker_vars": ""
38+
},
39+
{
40+
"target_name": "gd32105r-start",
41+
"toolchain": "arm-none-eabi",
42+
"bsp_path": "bsp/gd32/arm/gd32105r-start",
43+
"elf": "bsp/gd32/arm/gd32105r-start/rtthread.elf",
44+
"ld": "bsp/gd32/arm/gd32105r-start/board/linker_scripts/link.ld",
45+
"map_file": "bsp/gd32/arm/gd32105r-start/rtthread.map",
46+
"linker_vars": ""
47+
},
48+
{
49+
"target_name": "hc32f334",
50+
"toolchain": "arm-none-eabi",
51+
"bsp_path": "bsp/hc32/ev_hc32f334_lqfp64",
52+
"elf": "bsp/hc32/ev_hc32f334_lqfp64/rtthread.elf",
53+
"ld": "bsp/hc32/ev_hc32f334_lqfp64/board/linker_scripts/link.ld",
54+
"map_file": "bsp/hc32/ev_hc32f334_lqfp64/rtthread.map",
55+
"linker_vars": ""
56+
},
57+
{
58+
"target_name": "nxp-lpc1114",
59+
"toolchain": "arm-none-eabi",
60+
"bsp_path": "bsp/nxp/lpc/lpc1114",
61+
"elf": "bsp/nxp/lpc/lpc1114/rtthread-lpc1114.elf",
62+
"ld": "bsp/nxp/lpc/lpc1114/link.lds",
63+
"map_file": "bsp/nxp/lpc/lpc1114/rtthread.map",
64+
"linker_vars": ""
65+
},
66+
{
67+
"target_name": "nordic-nrf51822",
68+
"toolchain": "arm-none-eabi",
69+
"bsp_path": "bsp/nrf5x/nrf51822",
70+
"elf": "bsp/nrf5x/nrf51822/rt-thread.elf",
71+
"ld": "bsp/nrf5x/nrf51822/board/linker_scripts/link.lds",
72+
"map_file": "bsp/nrf5x/nrf51822/rtthread.map",
73+
"linker_vars": ""
74+
},
75+
{
76+
"target_name": "nuvoton-m487",
77+
"toolchain": "arm-none-eabi",
78+
"bsp_path": "bsp/nuvoton/numaker-iot-m487",
79+
"elf": "bsp/nuvoton/numaker-iot-m487/rtthread.elf",
80+
"ld": "bsp/nuvoton/numaker-iot-m487/linking_scripts/m480_link.ld",
81+
"map_file": "bsp/nuvoton/numaker-iot-m487/rtthread.map",
82+
"linker_vars": ""
83+
},
84+
{
85+
"target_name": "infineon-psoc6",
86+
"toolchain": "arm-none-eabi",
87+
"bsp_path": "bsp/Infineon/psoc6-cy8ckit-062s4",
88+
"elf": "bsp/Infineon/psoc6-cy8ckit-062s4/rt-thread.elf",
89+
"ld": "bsp/Infineon/psoc6-cy8ckit-062s4/board/linker_scripts/link.ld",
90+
"map_file": "bsp/Infineon/psoc6-cy8ckit-062s4/rtthread.map",
91+
"linker_vars": ""
92+
},
93+
{
94+
"target_name": "renesas-ra2l1",
95+
"toolchain": "arm-none-eabi",
96+
"bsp_path": "bsp/renesas/ra2l1-cpk",
97+
"elf": "bsp/renesas/ra2l1-cpk/rtthread.elf",
98+
"ld": "bsp/renesas/ra2l1-cpk/script/fsp.ld",
99+
"map_file": "bsp/renesas/ra2l1-cpk/rtthread.map",
100+
"linker_vars": ""
101+
},
102+
{
103+
"target_name": "qemu-virt64-aarch64",
104+
"toolchain": "aarch64-none-elf",
105+
"bsp_path": "bsp/qemu-virt64-aarch64",
106+
"elf": "bsp/qemu-virt64-aarch64/rtthread.elf",
107+
"ld": "libcpu/aarch64/link.lds",
108+
"map_file": "bsp/qemu-virt64-aarch64/rtthread.map",
109+
"linker_vars": ""
110+
},
111+
{
112+
"target_name": "wch-ch32v208w-r0",
113+
"toolchain": "riscv-none-embed",
114+
"bsp_path": "bsp/wch/risc-v/ch32v208w-r0",
115+
"elf": "bsp/wch/risc-v/ch32v208w-r0/rtthread.elf",
116+
"ld": "bsp/wch/risc-v/ch32v208w-r0/board/linker_scripts/link.lds",
117+
"map_file": "bsp/wch/risc-v/ch32v208w-r0/rtthread.map",
118+
"linker_vars": ""
119+
},
120+
{
121+
"target_name": "hpmicro-hpm5301evklite",
122+
"toolchain": "riscv32-unknown-elf-multilib",
123+
"bsp_path": "bsp/hpmicro/hpm5301evklite",
124+
"elf": "bsp/hpmicro/hpm5301evklite/rtthread.elf",
125+
"ld": "bsp/hpmicro/hpm5301evklite/board/linker_scripts/gcc/flash_rtt.ld",
126+
"map_file": "",
127+
"linker_vars": ""
128+
},
129+
{
130+
"target_name": "xuantie-e901plus",
131+
"toolchain": "xuantie-elf-newlib",
132+
"bsp_path": "bsp/xuantie/smartl/e901plus",
133+
"elf": "bsp/xuantie/smartl/e901plus/rtthread.elf",
134+
"ld": "bsp/xuantie/libraries/xuantie_libraries/chip_riscv_dummy/gcc_flash_smartl_lite.ld",
135+
"map_file": "bsp/xuantie/smartl/e901plus/rtthread.map",
136+
"linker_vars": ""
137+
},
138+
{
139+
"target_name": "esp32-c3",
140+
"toolchain": "riscv32-esp-elf",
141+
"bsp_path": "bsp/ESP/ESP32_C3",
142+
"elf": "bsp/ESP/ESP32_C3/rtthread.elf",
143+
"ld": "bsp/ESP/ESP32_C3/idf_port/ld/memory.ld bsp/ESP/ESP32_C3/idf_port/ld/sections.ld",
144+
"map_file": "bsp/ESP/ESP32_C3/rtthread.map",
145+
"linker_vars": ""
146+
},
147+
{
148+
"target_name": "k230",
149+
"toolchain": "riscv64-linux-musl-k230",
150+
"bsp_path": "bsp/k230",
151+
"elf": "bsp/k230/rtthread.elf",
152+
"ld": "bsp/k230/link.lds.generated",
153+
"map_file": "bsp/k230/rtthread.map",
154+
"linker_vars": ""
155+
},
156+
{
157+
"target_name": "loongson-ls1cdev",
158+
"toolchain": "mips-sde-elf",
159+
"bsp_path": "bsp/loongson/ls1cdev",
160+
"elf": "bsp/loongson/ls1cdev/rtthread.elf",
161+
"ld": "bsp/loongson/ls1cdev/ls1c_ram.lds",
162+
"map_file": "bsp/loongson/ls1cdev/rtthread.map",
163+
"linker_vars": ""
164+
},
165+
{
166+
"target_name": "x86",
167+
"toolchain": "i386-unknown-elf",
168+
"bsp_path": "bsp/x86",
169+
"elf": "bsp/x86/rtthread.elf",
170+
"ld": "bsp/x86/x86_ram.lds",
171+
"map_file": "bsp/x86/rtthread.map",
172+
"linker_vars": ""
173+
},
174+
{
175+
"target_name": "simulator",
176+
"toolchain": "gcc-host",
177+
"bsp_path": "bsp/simulator",
178+
"elf": "bsp/simulator/rtthread",
179+
"ld": "bsp/simulator/gcc_elf64.ld",
180+
"map_file": "bsp/simulator/rtthread-linux.map",
181+
"linker_vars": ""
182+
}
183+
]
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
name: MemBrowse PR Comment
2+
3+
on:
4+
workflow_run:
5+
workflows: [MemBrowse Memory Report]
6+
types:
7+
- completed
8+
9+
jobs:
10+
comment:
11+
runs-on: ubuntu-22.04
12+
if: >
13+
github.event.workflow_run.event == 'pull_request' &&
14+
github.event.workflow_run.conclusion != 'cancelled' &&
15+
github.event.workflow_run.conclusion != 'skipped'
16+
permissions:
17+
contents: read
18+
pull-requests: write
19+
steps:
20+
- name: Checkout repository
21+
uses: actions/checkout@v5
22+
23+
- name: Post combined PR comment
24+
if: ${{ env.MEMBROWSE_API_KEY != '' }}
25+
uses: membrowse/membrowse-action/comment-action@v1
26+
with:
27+
api_key: ${{ secrets.MEMBROWSE_API_KEY }}
28+
commit: ${{ github.event.workflow_run.head_sha }}
29+
env:
30+
MEMBROWSE_API_KEY: ${{ secrets.MEMBROWSE_API_KEY }}
31+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
name: Onboard to MemBrowse
2+
3+
on:
4+
workflow_dispatch:
5+
inputs:
6+
num_commits:
7+
description: 'Number of commits to process'
8+
required: true
9+
default: '100'
10+
type: string
11+
12+
jobs:
13+
load-targets:
14+
runs-on: ubuntu-22.04
15+
outputs:
16+
matrix: ${{ steps.set-matrix.outputs.matrix }}
17+
steps:
18+
- name: Checkout repository
19+
uses: actions/checkout@v5
20+
21+
- name: Load target matrix
22+
id: set-matrix
23+
run: echo "matrix=$(jq -c '.' .github/membrowse-targets.json)" >> $GITHUB_OUTPUT
24+
25+
onboard:
26+
needs: load-targets
27+
runs-on: ubuntu-22.04
28+
strategy:
29+
fail-fast: false
30+
matrix:
31+
include: ${{ fromJson(needs.load-targets.outputs.matrix) }}
32+
33+
steps:
34+
- name: Checkout repository
35+
uses: actions/checkout@v5
36+
with:
37+
fetch-depth: 0
38+
39+
- name: Install env tool and Python build deps
40+
run: |
41+
sudo apt-get update -qq
42+
sudo apt-get install -y -qq python3 python3-pip wget xz-utils build-essential
43+
wget -qO install_ubuntu.sh https://raw.githubusercontent.com/RT-Thread/env/master/install_ubuntu.sh
44+
bash install_ubuntu.sh
45+
46+
- name: Install toolchain
47+
run: |
48+
set -e
49+
case "${{ matrix.toolchain }}" in
50+
arm-none-eabi)
51+
sudo apt-get install -y -qq gcc-arm-none-eabi
52+
echo "TOOLCHAIN_PATH=/usr/bin" >> $GITHUB_ENV
53+
;;
54+
aarch64-none-elf)
55+
wget -q https://github.com/RT-Thread/toolchains-ci/releases/download/v1.6/gcc-arm-10.2-2020.11-x86_64-aarch64-none-elf.tar.xz
56+
sudo tar -xf gcc-arm-10.2-2020.11-x86_64-aarch64-none-elf.tar.xz -C /opt
57+
echo "TOOLCHAIN_PATH=/opt/gcc-arm-10.2-2020.11-x86_64-aarch64-none-elf/bin" >> $GITHUB_ENV
58+
;;
59+
llvm-arm)
60+
wget -q https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm/releases/download/release-16.0.0/LLVMEmbeddedToolchainForArm-16.0.0-Linux-x86_64.tar.gz
61+
sudo tar zxf LLVMEmbeddedToolchainForArm-16.0.0-Linux-x86_64.tar.gz -C /opt
62+
sudo apt-get install -y -qq libncurses5 libncurses5-dev libncursesw5-dev
63+
echo "TOOLCHAIN_PATH=/opt/LLVMEmbeddedToolchainForArm-16.0.0-Linux-x86_64/bin" >> $GITHUB_ENV
64+
;;
65+
mips-sde-elf)
66+
wget -q https://github.com/RT-Thread/toolchains-ci/releases/download/v1.1/mips-2016.05-7-mips-sde-elf-i686-pc-linux-gnu.tar.bz2
67+
sudo tar xjf mips-2016.05-7-mips-sde-elf-i686-pc-linux-gnu.tar.bz2 -C /opt
68+
echo "TOOLCHAIN_PATH=/opt/mips-2016.05/bin" >> $GITHUB_ENV
69+
;;
70+
i386-unknown-elf)
71+
wget -q https://github.com/zhkag/toolchains/releases/download/i386-unknown/i386-unknown-elf_for_x86_64-pc-linux-gnu_latest.tar.bz2
72+
sudo tar -jxf i386-unknown-elf_for_x86_64-pc-linux-gnu_latest.tar.bz2 -C /opt
73+
echo "TOOLCHAIN_PATH=/opt/i386-unknown-elf_for_x86_64-pc-linux-gnu/bin" >> $GITHUB_ENV
74+
;;
75+
riscv-none-embed)
76+
wget -q https://github.com/RT-Thread/toolchains-ci/releases/download/v1.5/xpack-riscv-none-embed-gcc-8.3.0-2.3-linux-x64.tar.gz
77+
sudo tar zxf xpack-riscv-none-embed-gcc-8.3.0-2.3-linux-x64.tar.gz -C /opt
78+
echo "TOOLCHAIN_PATH=/opt/xpack-riscv-none-embed-gcc-8.3.0-2.3/bin" >> $GITHUB_ENV
79+
;;
80+
riscv32-unknown-elf-multilib)
81+
wget -q https://github.com/hpmicro/riscv-gnu-toolchain/releases/download/2022.05.15/riscv32-unknown-elf-newlib-multilib_2022.05.15_linux.tar.gz
82+
sudo tar zxf riscv32-unknown-elf-newlib-multilib_2022.05.15_linux.tar.gz -C /opt
83+
echo "TOOLCHAIN_PATH=/opt/riscv32-unknown-elf-newlib-multilib/bin" >> $GITHUB_ENV
84+
;;
85+
xuantie-elf-newlib)
86+
wget -q https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource//1751370399722/Xuantie-900-gcc-elf-newlib-x86_64-V3.2.0-20250627.tar.gz
87+
sudo tar -zxf Xuantie-900-gcc-elf-newlib-x86_64-V3.2.0-20250627.tar.gz -C /opt
88+
echo "TOOLCHAIN_PATH=/opt/Xuantie-900-gcc-elf-newlib-x86_64-V3.2.0/bin" >> $GITHUB_ENV
89+
;;
90+
riscv32-esp-elf)
91+
wget -q https://github.com/espressif/crosstool-NG/releases/download/esp-2022r1-RC1/riscv32-esp-elf-gcc11_2_0-esp-2022r1-RC1-linux-amd64.tar.xz
92+
sudo tar xf riscv32-esp-elf-gcc11_2_0-esp-2022r1-RC1-linux-amd64.tar.xz -C /opt
93+
pip3 install --user esptool
94+
echo "TOOLCHAIN_PATH=/opt/riscv32-esp-elf/bin" >> $GITHUB_ENV
95+
;;
96+
riscv64-linux-musl-k230)
97+
wget -q https://download.rt-thread.org/rt-smart/riscv64/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_251248.tar.bz2
98+
sudo tar xjf riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_251248.tar.bz2 -C /opt
99+
echo "TOOLCHAIN_PATH=/opt/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin" >> $GITHUB_ENV
100+
;;
101+
gcc-host)
102+
sudo apt-get install -y -qq libsdl2-dev
103+
echo "TOOLCHAIN_PATH=/usr/bin" >> $GITHUB_ENV
104+
;;
105+
*)
106+
echo "Unknown toolchain: ${{ matrix.toolchain }}"; exit 1 ;;
107+
esac
108+
109+
- name: Run MemBrowse Onboard Action
110+
uses: membrowse/membrowse-action/onboard-action@v1
111+
with:
112+
target_name: ${{ matrix.target_name }}
113+
num_commits: ${{ github.event.inputs.num_commits }}
114+
build_script: |
115+
. $HOME/.env/env.sh
116+
pip install -r tools/requirements.txt
117+
export RTT_EXEC_PATH="$TOOLCHAIN_PATH"
118+
export RTT_ROOT="$PWD"
119+
export RTT_CC="${{ matrix.rtt_cc || 'gcc' }}"
120+
[ -n "${{ matrix.rtt_cc_prefix }}" ] && export RTT_CC_PREFIX="${{ matrix.rtt_cc_prefix }}"
121+
cd "${{ matrix.bsp_path }}"
122+
pkgs --update --force-update
123+
scons --pyconfig-silent
124+
scons -j$(nproc)
125+
build_status=$?
126+
# The build regenerates tracked files (rtconfig.h/.config), leaving a
127+
# dirty work tree. In binary-search mode onboard checks out another
128+
# commit next, which git aborts ("local changes would be overwritten").
129+
# git clean only removes untracked files, so restore tracked ones here.
130+
# Runs unconditionally but preserves the build's exit status.
131+
git -C "$RTT_ROOT" checkout -- . || true
132+
exit $build_status
133+
elf: ${{ matrix.elf }}
134+
ld: ${{ matrix.ld }}
135+
map_file: ${{ matrix.map_file }}
136+
linker_vars: ${{ matrix.linker_vars }}
137+
binary_search: 'true'
138+
api_key: ${{ secrets.MEMBROWSE_API_KEY }}
139+
api_url: ${{ vars.MEMBROWSE_API_URL }}

0 commit comments

Comments
 (0)