diff --git a/.github/workflows/bsp_buildings.yml b/.github/workflows/bsp_buildings.yml index db6ba30f89..95346ae9cf 100644 --- a/.github/workflows/bsp_buildings.yml +++ b/.github/workflows/bsp_buildings.yml @@ -421,19 +421,4 @@ jobs: SRTT_BSP: ${{ join(matrix.legs.SUB_RTT_BSP, ',') }} run: | source ~/.env/env.sh - failed=0 - count=0 - for bsp in $(echo $SRTT_BSP | tr ',' '\n'); do - count=$((count+1)) - echo "::group::Compiling BSP: ==$count=== $bsp ====" - echo bsp/$bsp - ls bsp/$bsp/Kconfig && scons -C bsp/$bsp --pyconfig-silent - pushd bsp/$bsp && pkgs --update && popd - scons -C bsp/$bsp -j$(nproc) --debug=time | tee output.log || \ - { total_time=$(grep "Total command execution time" output.log | awk '{print $5}'); \ - failed=$((failed+1)) ; echo "::endgroup::" ; echo "::error::build $bsp failed" ; \ - echo "- ❌ build $bsp failed in $total_time seconds " >> $GITHUB_STEP_SUMMARY ; } && \ - { total_time=$(grep "Total command execution time" output.log | awk '{print $5}'); \ - echo "- ✅ build $bsp success in $total_time seconds " >> $GITHUB_STEP_SUMMARY ; echo "::endgroup::" ; } - done - exit $failed + python tools/ci/bsp_buildings.py diff --git a/bsp/stm32/stm32f411-st-nucleo/.ci/attachconfig/nano.attach b/bsp/stm32/stm32f411-st-nucleo/.ci/attachconfig/nano.attach index 3a1b6d0a03..fb58d11a59 100644 --- a/bsp/stm32/stm32f411-st-nucleo/.ci/attachconfig/nano.attach +++ b/bsp/stm32/stm32f411-st-nucleo/.ci/attachconfig/nano.attach @@ -1 +1 @@ -RT_USING_NANO=y +CONFIG_RT_USING_NANO=y diff --git a/bsp/stm32/stm32f411-st-nucleo/.ci/attachconfig/rtduino.attach b/bsp/stm32/stm32f411-st-nucleo/.ci/attachconfig/rtduino.attach deleted file mode 100644 index 6909b93257..0000000000 --- a/bsp/stm32/stm32f411-st-nucleo/.ci/attachconfig/rtduino.attach +++ /dev/null @@ -1 +0,0 @@ -BSP_USING_ARDUINO=y diff --git a/tools/ci/bsp_buildings.py b/tools/ci/bsp_buildings.py new file mode 100644 index 0000000000..c84237b9b4 --- /dev/null +++ b/tools/ci/bsp_buildings.py @@ -0,0 +1,161 @@ +import os +import re +import glob +import shutil +import multiprocessing + + +def add_summary(text): + """ + add summary to github action. + """ + os.system(f'echo "{text}" >> $GITHUB_STEP_SUMMARY ;') + + +def run_cmd(cmd): + """ + run command and return output and result. + """ + print('\033[1;32m' + cmd + '\033[0m') + res = os.system(cmd + " > output.txt 2>&1") + with open("output.txt", "r") as file: + output = file.readlines() + for line in output: + print(line, end='') + os.remove("output.txt") + return output, res + + +def build_bsp(bsp): + """ + build bsp. + + cd {rtt_root} + scons -C bsp/{bsp} --pyconfig-silent + + cd {rtt_root}/bsp/{bsp} + pkgs --upgrade-script-force + pkgs --update + pkgs --list + + cd {rtt_root} + scons -C bsp/{bsp} -j{nproc} --debug=time + + cd {rtt_root}/bsp/{bsp} + scons -c + rm -rf packages + + """ + success = True + os.chdir(rtt_root) + if os.path.exists(f"{rtt_root}/bsp/{bsp}/Kconfig"): + os.chdir(rtt_root) + run_cmd(f'scons -C bsp/{bsp} --pyconfig-silent') + + os.chdir(f'{rtt_root}/bsp/{bsp}') + run_cmd('pkgs --upgrade-script-force') + run_cmd('pkgs --update') + run_cmd('pkgs --list') + + nproc = multiprocessing.cpu_count() + os.chdir(rtt_root) + output, res = run_cmd(f'scons -C bsp/{bsp} -j{nproc} --debug=time') + + total_time = 0 + for line in output: + pattern = r"Total command execution time: (\d+\.\d+) seconds" + match = re.search(pattern, line) + if match: + total_time = match.group(1) + break + if res != 0: + success = False + + os.chdir(f'{rtt_root}/bsp/{bsp}') + run_cmd('scons -c') + + pkg_dir = os.path.join(rtt_root, 'bsp', bsp, 'packages') + shutil.rmtree(pkg_dir, ignore_errors=True) + + return success, total_time + + +def append_file(source_file, destination_file): + """ + append file to another file. + """ + with open(source_file, 'r') as source: + with open(destination_file, 'a') as destination: + for line in source: + destination.write(line) + + +def build_bsp_attachconfig(bsp, attach_file): + """ + build bsp with attach config. + + cp bsp/{bsp}/.config bsp/{bsp}/.config.origin + cat .ci/attachconfig/{attach_file} >> bsp/{bsp}/.config + + build_bsp() + + cp bsp/{bsp}/.config.origin bsp/{bsp}/.config + rm bsp/{bsp}/.config.origin + + """ + config_file = os.path.join(rtt_root, 'bsp', bsp, '.config') + config_bacakup = config_file+'.origin' + shutil.copyfile(config_file, config_bacakup) + + append_file(attach_file, config_file) + + res, total_time = build_bsp(bsp) + + shutil.copyfile(config_bacakup, config_file) + os.remove(config_bacakup) + + return res, total_time + + +if __name__ == "__main__": + """ + build all bsp and attach config. + + 1. build all bsp. + 2. build all bsp with attach config. + + """ + failed = 0 + count = 0 + + rtt_root = os.getcwd() + srtt_bsp = os.getenv('SRTT_BSP').split(',') + + for bsp in srtt_bsp: + count += 1 + print(f"::group::Compiling BSP: =={count}=== {bsp} ====") + res, total_time = build_bsp(bsp) + if not res: + print(f"::error::build {bsp} failed") + add_summary(f"- ❌ build {bsp} failed in {total_time} s.") + failed += 1 + else: + add_summary(f'- ✅ build {bsp} success in {total_time} s.') + print("::endgroup::") + + attach_dir = os.path.join(rtt_root, 'bsp', bsp, '.ci/attachconfig') + attach_files = glob.glob(os.path.join(attach_dir, '*.attach')) + for attach_file in attach_files: + count += 1 + attach = os.path.basename(attach_file) + print(f"::group::\tCompiling BSP: =={count}=== {bsp} {attach}===") + res, total_time = build_bsp_attachconfig(bsp, attach_file) + if not res: + print(f"::error::build {bsp} {attach} failed.") + add_summary(f'\t- ❌ build {attach} failed in {total_time} s.') + failed += 1 + else: + add_summary(f'\t- ✅ build {attach} success in {total_time} s.') + print("::endgroup::") + + exit(failed)