0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT-Thread中的Github Actions

RTThread物联网操作系统 来源:未知 2023-06-01 03:10 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

RT-Thread中一共有五个Github Action(rt-thread/.github/workflow)

分别是:

  • RT-Thread BSP build check(.github/workflows/action.yml)

  • ToolsCI(.github/workflows/action_tools.yml)

  • AutoTestCI(.github/workflows/action_utest.yml)

  • Check File Format and License(.github/workflows/file_check.yml)

  • Static code analysis(.github/workflows/static_code_analysis.yml)

下面分别讲解这五个Github Action。

RT-Thread BSP build check

总的来说,这个Action会通过matrix尝试编译多个BSP,并记录编译成功和失败的信息。执行脚本中的每个BSP编译步骤都在日志中创建了一个分组,以便在编译成功或失败时可以更好地显示和记录相关信息。

matrix列表中每个元素有三个属性,分别是

  • RTT_BSP:这组BSP的名字,后续输出日志时会用到

  • RTT_TOOL_CHAIN:编译这组BSP使用的工具链

  • SUB_RTT_BSP:各个BSP的目录

RT-Thread BSP build check的第一步:

  • 首先先安装gcc和menuconfig依赖的包

  • 调用tools目录下的menuconfig的touch_env

  • 这个函数主要是创建一系列后续会使用到的文件夹,并且拉取远程的packages

  • 以及修改Kconfig

  • 设置一些RT-Thread自己的环境遍历,供后续使用

 1name:InstallTools
 2shell:bash
 3run:|
 4sudoapt-getupdate
 5sudoapt-get-qqinstallgcc-multiliblibncurses5libncurses5-devlibncursesw5-devscons
 6sudopython-mpipinstall--upgradepip-qq
 7pipinstallrequests-qq
 8gitconfig--globalhttp.postBuffer524288000
 9python-c"importtools.menuconfig;tools.menuconfig.touch_env()"
10echo"RTT_ROOT=${{github.workspace}}">>$GITHUB_ENV
11echo"RTT_CC=gcc">>$GITHUB_ENV

RT-Thread BSP build check的第二步:

  • 会根据matrix.legs.RTT_TOOL_CHAIN判断需要安装什么工具链

RT-Thread BSP build check的第三步:

第三步是这次BSP编译测试的核心

  • 首先会遍历所有的SUB_RTT_BSP

  • 根据scons命令执行的成功与否(||前一个命令执行失败、&&前一个命令执行成功)来判断执行成功还是失败的逻辑

  • 输出的时候会在GitHub Actions日志中创建一个分组,用于显示BSP编译的信息

  • 计算总共花费的时间,输出BSP编译成功或者失败的信息,输出至$GITHUB_STEP_SUMMARY

 1name:BspSconsCompile
 2if:${{success()}}
 3shell:bash
 4env:
 5RTT_BSP:${{matrix.legs.RTT_BSP}}
 6RTT_TOOL_CHAIN:${{matrix.legs.RTT_TOOL_CHAIN}}
 7SRTT_BSP:${{join(matrix.legs.SUB_RTT_BSP,',')}}
 8run:|
 9source~/.env/env.sh
10failed=0
11count=0
12forbspin$(echo$SRTT_BSP|tr',''
');do
13count=$((count+1))
14echo"::CompilingBSP:==$count===$bsp===="
15echobsp/$bsp
16pushdbsp/$bsp&&pkgs--update&&popd
17scons-Cbsp/$bsp-j$(nproc)--debug=time|teeoutput.log||
18{total_time=$(grep"Totalcommandexecutiontime"output.log|awk'{print$5}');
19failed=$((failed+1));echo"::";echo"::build$bspfailed";
20echo"-build$bspfailedin$total_timeseconds">>$GITHUB_STEP_SUMMARY;}&&
21{total_time=$(grep"Totalcommandexecutiontime"output.log|awk'{print$5}');
22echo"-build$bspsuccessin$total_timeseconds">>$GITHUB_STEP_SUMMARY;echo"::";}
23done
24exit$failed
ToolsCI

总的来说,ToolsCI这个Action比较简单,会去尝试Build一个BSP、生成其它工程文件等等,用来测试使用。

关于scons一些参数的使用可以参考:SCons (rt-thread.org)

 1name:ToolsCI
 2#Controlswhentheactionwillrun.Triggerstheworkflowonpushorpullrequest
 3#eventsbutonlyforthemasterbranch
 4on:
 5#Runsat16:00UTC(BeiJing00:00)onthe1stofeverymonth
 6schedule:
 7-cron:'0161**'
 8push:
 9branches:
10-master
11paths-ignore:
12-documentation/**
13-'**/README.md'
14-'**/README_zh.md'
15-'**/*.c'
16-'**/*.h'
17-'**/*.cpp'
18pull_request:
19branches:
20-master
21paths-ignore:
22-documentation/**
23-'**/README.md'
24-'**/README_zh.md'
25-'**/*.c'
26-'**/*.h'
27-'**/*.cpp'
28permissions:
29contents:read#tofetchcode(actions/checkout)
30jobs:
31test:
32runs-on:ubuntu-latest
33name:Tools
34strategy:
35fail-fast:false
36env:
37TEST_BSP_ROOT:bsp/stm32/stm32f407-atk-explorer
38steps:
39-uses:actions/checkout@v3
40-name:InstallTools
41shell:bash
42run:|
43sudoapt-getupdate
44sudoapt-get-yqqinstallscons
45-name:InstallArmToolChains
46if:${{success()}}
47shell:bash
48run:|
49wget-qhttps://github.com/RT-Thread/toolchains-ci/releases/download/v1.3/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2
50sudotarxjfgcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2-C/opt
51/opt/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-gcc--version
52echo"RTT_EXEC_PATH=/opt/gcc-arm-none-eabi-10-2020-q4-major/bin">>$GITHUB_ENV
53-name:BuildTools
54run:|
55scons--pyconfig-silent-C$TEST_BSP_ROOT
56scons-j$(nproc)-C$TEST_BSP_ROOT
57-name:ProjectgenerateTools
58if:${{success()}}
59run:|
60echo"Testtogenerateeclipseproject"
61scons--target=eclipse-s-C$TEST_BSP_ROOT
62echo"Testtogeneratecmakeproject"
63scons--target=cmake-s-C$TEST_BSP_ROOT
64echo"Testtogeneratemakefileproject"
65scons--target=makefile-s-C$TEST_BSP_ROOT
66-name:ProjectdistTools
67if:${{success()}}
68run:|
69echo"Testtodistproject"
70scons--dist-C$TEST_BSP_ROOT
71scons--dist-ide-C$TEST_BSP_ROOT
72ls$TEST_BSP_ROOT
73ls$TEST_BSP_ROOT/dist
74scons-C$TEST_BSP_ROOT/dist/project
75scons-C$TEST_BSP_ROOT/rt-studio-project
AutoTestCI

总的来说,这个Action的主要目标是根据matrix中的不同参数组合,安装必要的工具链、构建和测试代码。具体的步骤包括检出代码、安装所需工具、设置环境变量、构建代码,然后在qemu中运行测试并输出日志。根据参数的不同,这个工作流可以自动处理多个平台和架构的测试。

matrix列表中每个元素有五个属性,分别是

  • UTEST:这组BSP的名字,后续输出日志时会用到

  • RTT_BSP:测试使用的BSP

  • QEMU_ARCH:QEMU使用的平台架构

  • QEMU_MACHINE:选择QEMU的板级支持包

  • CONFIG_FILE:RT-Thread条件编译使用的CONFIG

  • SD_FILE:使用的sd.bin

  • RUN:是否启动

AutoTestCI的第一步:

安装必要的工具:scons、qemu、git

AutoTestCI的第二步:

根据matrix的属性选择安装相应的编译工具链

比如要测试arm架构和rtsmart/arm时,我们就选择安装arm-linux-musleabi_for_x86_64-pc-linux-g工具链

1name:InstallArmMuslToolChains
2if:${{matrix.legs.QEMU_ARCH=='arm'&&matrix.legs.UTEST=='rtsmart/arm'&&success()}}
3shell:bash
4run:|
5wget-qhttps://github.com/RT-Thread/toolchains-ci/releases/download/v1.7/arm-linux-musleabi_for_x86_64-pc-linux-g
6sudotarxjfarm-linux-musleabi_for_x86_64-pc-linux-gnu_stable.tar.bz2-C/opt
7/opt/arm-linux-musleabi_for_x86_64-pc-linux-gnu/bin/arm-linux-musleabi-gcc--version
8echo"RTT_EXEC_PATH=/opt/arm-linux-musleabi_for_x86_64-pc-linux-gnu/bin">>$GITHUB_ENV
9echo"RTT_CC_PREFIX=arm-linux-musleabi-">>$GITHUB_ENV

AutoTestCI的第三步:

第三步主要完成$TEST_BSP_ROOT下BSP的编译,以供后续在qemu上使用

1name:BuildBSP
2run:|
3echoCONFIG_RT_USING_UTESTCASES=y>>$TEST_BSP_ROOT/.config
4catexamples/utest/configs/$TEST_CONFIG_FILE>>$TEST_BSP_ROOT/.config
5scons--pyconfig-silent-C$TEST_BSP_ROOT
6scons-j$(nproc)--strict-C$TEST_BSP_ROOT

AutoTestCI的第四步:

第四步也是最重要的一步,开始测试相关用例

 1name:StartrunTest
 2if:${{matrix.legs.RUN=='yes'&&success()}}
 3run:|
 4gitclonehttps://github.com/armink/UtestRunner.git
 5pushd$TEST_BSP_ROOT
 6ddif=/dev/zeroof=sd.binbs=1024count=65536
 7popd
 8pushdUtestRunner
 9if[$TEST_SD_FILE!="None"];then
10python3qemu_runner.py--system$TEST_QEMU_ARCH--machine$TEST_QEMU_MACHINE--elf../$TEST_BSP_ROOT/rtthread
11else
12python3qemu_runner.py--system$TEST_QEMU_ARCH--machine$TEST_QEMU_MACHINE--elf../$TEST_BSP_ROOT/rtthread
13fi
14catrtt_console.log
15popd

  • 拉取RT-Thread自动化测试机器人

  • 制作sd.bin

  • 使用需要测试的BSP启动qemu

  • 最后输出相关日志

Check File Format and License

这个Action主要是用来检查文件的格式化和版权信息的,主要工作都由tools/ci/file_check.py完成,在此之前主要先检出当前仓库的代码和安装Python脚本依赖的包。

 1name:CheckFileFormatandLicense
 2on:[pull_request]
 3jobs:
 4scancode_job:
 5runs-on:ubuntu-latest
 6name:Scancodeformatandlicense
 7steps:
 8-uses:actions/checkout@v3
 9-name:SetupPython
10uses:actions/setup-python@v3
11with:
12python-version:3.8
13-name:CheckFormatandLicense
14shell:bash
15run:|
16pipinstallclickchardetPyYaml
17pythontools/ci/file_check.pycheck'https://github.com/RT-Thread/rt-thread''master'

file_check.py

我们可以先忽略使用的click命令行库,或者也可以从命名和使用方式猜测出它们的功能。

因为这个文件比较简单,所以我们可以猜测函数的入口就是check()。主函数里的逻辑是十分简单的,可以看到通过checkout.get_new_file()获得了一个文件列表,然后传递给了FormatCheckLicenseCheck,它们又分别调用了自身的check函数,最后根据它们返回值判断是否检查出错误。

 1defcheck(check_license,repo,branch):
 2"""
 3checkfileslicenseandformat.
 4"""
 5init_logger()
 6#getmodifiedfileslist
 7checkout=CheckOut(repo,branch)
 8file_list=checkout.get_new_file()
 9iffile_listisNone:
10logging.error("checkoutfilesfail")
11sys.exit(1)
12#checkmodifiedfilesformat
13format_check=FormatCheck(file_list)
14format_check_result=format_check.check()
15license_check_result=True
16ifcheck_license:
17license_check=LicenseCheck(file_list)
18license_check_result=license_check.check()
19ifnotformat_check_resultornotlicense_check_result:
20logging.error("fileformatcheckorlicensecheckfail.")
21sys.exit(1)
22logging.info("checksuccess.")
23sys.exit(0)

checkout.get_new_file()获得的文件列表是需要检查的文件列表,而FormatCheckLicenseCheck执行各自的检查逻辑。

首先是get_new_file,具体的逻辑也比较简单:

1. 通过git命令获得新增和修改的文件列表

2. 然后遍历这个文件列表

3. 遍历这个文件列表中的文件路径的每一层目录,看是否存在.ignore_format.yml文件

4. 然后根据.ignore_format.yml的属性来判断当前文件是否需要被检查

FormatCheck主要完成的工作是:

1. 搜索所有.c和.h文件

2. 然后检查行首、行尾以及tab

LicenseCheck的逻辑也比较简单,主要就是判断当前的Copyright的年份是否正确。

 1if'Copyright'infile[1]and'SPDX-License-Identifier:Apache-2.0'infile[3]:
 2try:
 3license_year=re.search(r'2006-d{4}',file[1]).group()
 4true_year='2006-{}'.format(current_year)
 5iflicense_year!=true_year:
 6logging.warning("[{0}]:licenseyear:{}isnottrue:{},pleaseupdate.".fo
 7else:
 8logging.info("[{0}]:licensechecksuccess.".format(file_path))
 9exceptExceptionase:
10logging.error(e)
11else:
12logging.error("[{0}]:licensecheckfail.".format(file_path))
13check_result=False
Static code analysis 这个Action和Check File Format and License是很类似的,主要流程都是相同的。 最重要的就是利用cppcheck完成静态代码检查的功能: 1. 从文件列表中再一次过滤出C/C++相关文件2. 然后使用cppcheck逐个检查文件列表,并且捕获标准错误流
 1classCPPCheck:
 2def__init__(self,file_list):
 3self.file_list=file_list
 4defcheck(self):
 5file_list_filtered=[fileforfileinself.file_listiffile.endswith(('.c','.cpp','.cc','.cxx'))]
 6logging.info("Starttostaticcodeanalysis.")
 7check_result=True
 8forfileinfile_list_filtered:
 9result=subprocess.run(['cppcheck','--enable=warning','performance','portability','--inline-suppr','--error-exitcode=1','--force',file],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
10logging.info(result.stdout.decode())
11logging.info(result.stderr.decode())
12ifresult.stderr:
13check_result=False
14returncheck_result
15@click.group()
16@click.pass_context
17defcli(ctx):
18pass
19@cli.command()
20defcheck():
21"""
22staticcodeanalysis(cppcheck).
23"""
24format_ignore.init_logger()
25#getmodifiedfileslist
26checkout=format_ignore.CheckOut()
27file_list=checkout.get_new_file()
28iffile_listisNone:
29logging.error("checkoutfilesfail")
30sys.exit(1)
31#usecppcheck
32cpp_check=CPPCheck(file_list)
33cpp_check_result=cpp_check.check()
34ifnotcpp_check_result:
35logging.error("staticcodeanalysis(cppcheck)fail.")
36sys.exit(1)
37logging.info("checksuccess.")
38sys.exit(0)
39if__name__=='__main__':
40cli()

原文:https://club.rt-thread.org/ask/article/102cc126ad4dbfd8.html

———————End———————

RT-Thread线下入门培训

6月 - 郑州、杭州、深圳

1.免费2.动手实验+理论3.主办方免费提供开发板4.自行携带电脑,及插线板用于笔记本电脑充电5.参与者需要有C语言单片机(ARM Cortex-M核)基础,请提前安装好RT-Thread Studio 开发环境

0da86a84-ffe4-11ed-90ce-dac502259ad0.png

立即扫码报名

报名链接

https://jinshuju.net/f/UYxS2k

巡回城市:青岛、北京、西安、成都、武汉、郑州、杭州、深圳、上海、南京

你可以添加微信:rtthread2020 为好友,注明:公司+姓名,拉进RT-Thread官方微信交流群!

点击阅读原文,进入RT-Thread 官网


原文标题:RT-Thread中的Github Actions

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RT-Thread
    +关注

    关注

    32

    文章

    1542

    浏览量

    44294

原文标题:RT-Thread中的Github Actions

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    首搭RT-Thread程翧车控平台| RT-Thread程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    在智能汽车迈向高集成与高安全的时代,VCU/ECU开发正面临效率与可靠性的双重考验。依赖单一硬件或拼凑软件方案的传统模式,已成为制约创新的瓶颈。为此,RT-Thread带来里程碑式的解决方案
    的头像 发表于 10-31 11:53 505次阅读
    首搭<b class='flag-5'>RT-Thread</b>程翧车控平台| <b class='flag-5'>RT-Thread</b>程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    【CPKCOR-RA8D1】5、运行RT-THREAD的适应性调整

    /env-windows-v2.0.0.7z 下载后解压到c:\\\\env-windows备用。 二、复制rt-thread源码 github地址: [github.com/RT-Threa
    发表于 10-27 14:49

    2025年RT-Thread开发者巡回培训报名正式启动!

    亲爱的RT-Thread社区成员们:新程再启,共赴热爱!2025年RT-Thread开发者巡回培训正式启动报名!今年,我们选择了西安、武汉、北京、杭州、深圳、上海、成都这7座城市,为大家带来
    的头像 发表于 09-27 10:39 1146次阅读
    2025年<b class='flag-5'>RT-Thread</b>开发者巡回培训报名正式启动!

    如何使用rt-thread studio,使用 定制化的SDK建立工程?

    --target=eclipse生成 rt-thread studio 工程 在rt-thread studio,使用sdk Manager 导入配置成功。 配置成功了, 问题: 我如何使用在
    发表于 09-26 06:16

    rt-thread studio v2.2.7 SDK管理器无法下载怎么解决?

    使用rt-thread studio v2.2.7sdk管理器下载包时,资源下载源已切换到gitee,但是下载时仍使用github源。 rt-thread 包还不支持导入功能,哎
    发表于 09-16 08:08

    rt-thread studio 2.2.9如何使用最新的RT-Thread v5.2.0 released?

    ,目前也无法使用 Cannot found RT-Thread root directory, please check RTT_ROOT; 新建版本,如使用lastet,rt-thread为空; 最好使用的
    发表于 09-16 06:06

    【好书推荐】RT-Thread第20本相关书籍!《嵌入式实时操作系统RT-Thread原理与应用》| 技术集结

    01内容简介ContentSummary本书为读者提供了一个全面、系统的RT-Thread学习指南,旨在帮助初学者及有经验的开发者掌握RT-Thread实时操作系统和STM32嵌入式微控制器的核心
    的头像 发表于 08-24 10:05 693次阅读
    【好书推荐】<b class='flag-5'>RT-Thread</b>第20本相关书籍!《嵌入式实时操作系统<b class='flag-5'>RT-Thread</b>原理与应用》| 技术集结

    RT-Thread 遇上 Rust:安全内核 RusT-Thread 的诞生

    大家好,我们是中国科学技术大学操作系统原理与设计(H)课oooooS小组。这个项目是我们的课程大作业:参考RT-Thread架构,使用Rust搭建一个原生的嵌入式操作系统内核。初识Rust是因为xk
    的头像 发表于 08-02 11:03 3211次阅读
    <b class='flag-5'>RT-Thread</b> 遇上 Rust:安全内核 RusT-<b class='flag-5'>Thread</b> 的诞生

    RT-Thread荣获2025优秀开源项目 | 新闻速递

    6月底,RT-Thread睿赛德受邀参与由上海开源信息技术协会主办的2025上海开源创新精英荟。上海市商委副主任张杰出席会议并致辞。RT-Thread嵌入式操作系统项目凭借其卓越的技术创新与开源生态
    的头像 发表于 07-04 09:04 2439次阅读
    <b class='flag-5'>RT-Thread</b>荣获2025优秀开源项目 | 新闻速递

    深度剖析 RT-Thread 线程调度流程

    RT-Thread调度第一个线程的主要流程分如下:rtthread_startup:RTT的启动函数,主要负责板级驱动,调度器,系统线程初始化,启动调度的工作
    的头像 发表于 06-25 18:24 1450次阅读
    深度剖析 <b class='flag-5'>RT-Thread</b> 线程调度流程

    揭秘RT-Thread上的AUTOSAR CP系统

    本文探讨了RT-Thread与AUTOSARCP的融合,解决车载ECU开发实时性、安全性与灵活性的平衡问题。通过分层安全内核(rt-safetyos/autoos)和工具链整合,兼容AUTOSAR
    的头像 发表于 06-23 20:22 2955次阅读
    揭秘<b class='flag-5'>RT-Thread</b>上的AUTOSAR CP系统

    2025 RT-Thread全球技术大会议程正式发布!

    RT-ThreadGlobalTechConference(RT-ThreadGTC,RT-Thread全球技术大会)是聚焦基础软件技术创新与实践的嵌入式技术盛会,持续推动技术价值转化
    的头像 发表于 05-27 19:28 1078次阅读
    2025 <b class='flag-5'>RT-Thread</b>全球技术大会议程正式发布!

    【直播预告】《实时操作系统应用技术—基于RT-Thread与ARM的编程实践》教学脉络及资源简介

    :“RT-Thread”视频号支持媒体:江苏省计算机学会、苏州大学、RT-Thread电网合作媒体:中国工控网、与非网、蔻享学术、Newmaking直播入口讲师介绍
    的头像 发表于 05-26 17:50 1107次阅读
    【直播预告】《实时操作系统应用技术—基于<b class='flag-5'>RT-Thread</b>与ARM的编程实践》教学脉络及资源简介

    RT-Thread审核团招募: 深度参与开源RTOS社区治理与演进

    全球开发者招募:RT-Thread审核团(ReviewTeam)正式开放申请!在开源的世界里,代码审查(CodeReview)是保证软件质量、促进技术交流的关键环节。RT-Thread作为全球领先
    的头像 发表于 05-21 18:02 1069次阅读
    <b class='flag-5'>RT-Thread</b>审核团招募: 深度参与开源RTOS社区治理与演进

    如何将RT-Thread移植到NXP MCUXPressoIDE上

    RT-Thread默认支持的IDE只有IAR 和 Keil, 那如何将RT-Thread移植到NXP MCUXPressoIDE上呢?本文内容比较简单但稍有琐碎,希望对有需要的小伙伴有所帮助。
    的头像 发表于 02-13 10:37 2443次阅读
    如何将<b class='flag-5'>RT-Thread</b>移植到NXP MCUXPressoIDE上