| CI状态 |
|---|
CCWS是ROS的开发环境,它整合了传统的catkin工作区和CI管道的功能,以促进(交叉)编译,测试,刺激,文档仪和二进制包装生成。它旨在将其用作CI/CD骨干和开发人员的工作环境。请注意, CCWS并非打算是一个完整的解决方案,而是开发特定于供应商的工作流程的基础。
CCWS是ROS版本不可知的,在大多数情况下,对于ROS1和ROS2都应该使用。
构建配置文件 - 用于构建过程的配置集,例如,CMAKE工具链,COLCON配置,环境变量等。配置文件不会相互冲突,并且可以在不使用工作区和软件包的单独克隆的情况下并行使用。
执行配置文件 - 旨在修改运行时间环境的简单外壳混合物,例如,在valgrind ,Alter Node crash anterling等中执行节点等。
通过构建配置文件实现的许多功能:
交叉编译到几个通用平台。
使用doxygen整个工作区或选定软件包的文档生成,类似于https://github.com/mikepurvis/catkin_tools_document。
用clang-tidy和scan_build覆盖。
如https://github.com/sscpac/statick中的各种静态检查,特别是:
cppcheckcatkin_lint https://github.com/fkie/catkin_lintyamllintshellcheck二进制Debian软件包生成。
包装模板演示了如何使用某些功能。
可以根据可用RAM而不是CPU内核来选择并行作业的数量,因为RAM可能是限制因素。
完全基于make和外壳脚本。所有脚本和配置都保存在工作空间中,并易于调整特定需求。
配置文件配置位于ccws/profiles/build中, common子目录包含默认参数,可以通过特定的配置文件超越:
reldebug默认编译器,cmake build类型是RelWithDebInfoscan_build使用scan_build和clang-tidy进行静态检查。 clang-tidy参数是在CMake工具链中定义的,必须在软件包中启用,如软件包模板CMakeLists所示。此配置文件还使用clang编译器。thread_sanitizer汇编带有线程消毒剂。addr_undef_sanitizers编译与地址和未定义的行为消毒器。static_checks静态检查器及其配置。doxygen doxygen及其配置。cross_raspberry_pi PI的交叉兼容。cross_jetson_xavier杰森·泽维尔(Jetson Xavier)的交叉补偿。cross_jetson_nano杰森·纳米(Jetson Nano)的交叉补偿。clangd收集给定BASE_BUILD_PROFILE的编译命令,并在工作区root中生成clangd配置文件。deb Debian软件包生成(见下文)。 执行配置文件设置环境变量,可在启动脚本中使用以更改运行时间行为,如ccws/pkg_template/catkin/launch/bringup.launch中所示,当前可用的配置文件是:
common - 一组常见的ROS参数,例如, ROS_HOME ,它自动包含在二进制软件包中。test - 设置CCWS_NODE_CRASH_ACTION变量,以便尊重其required的节点,即终止此类节点将导致测试脚本崩溃,因此可以轻松地检测到。valgrind将CCWS_NODE_LAUNCH_PREFIX设置为valgrind ,以及一些控制valgrind行为的变量。core_pattern设置核心模式以将核心文件保存在伪像目录中。address_sanitizer addr_undef_sanitizers配置文件的帮助人。执行配置文件对构建过程没有影响,并且在*test*目标或Debian软件包中被考虑。 test执行配置文件始终在测试中使用,并且可以使用EXEC_PROFILE="<profile1> <profile2>"提供其他配置文件。这些目标使用setup.bash脚本加载位于CCWS的根文件夹中的BASH脚本,例如,也可以手动使用,例如, source setup.bash [<build_profile> [<exec_profile1> ...]] 。请注意,设置脚本始终包含common文件,并且如果未指定其他执行配置文件,则使用test执行配置文件。
可以使用make bp_install_build BUILD_PROFILE=<profile>安装依赖项,该= <profile = <profile>将安装以下工具和配置文件特定的依赖项:
colconyq https://github.com/asherikov/wshandler依赖cmakeccache可以在CMAKE工具链中禁用wget有关命令用法提示,请参见.ccws/test_main.mk 。
make/config.mk中,可以在Makefile的顶部找到可用的参数,从而将其添加到make/config.mk中。make bp_install_build BUILD_PROFILE=<profile>目标安装依赖项,交叉编译配置文件将需要一些额外的步骤,如下所述。在某些简约的环境中,您可能需要在使用bp_install_build TARGET之前,可能需要运行./ccws/scripts/bootstrap.sh ,才能安装make和其他UTIL。src子目录中的克隆软件包,或使用make new PKG=<pkg>创建新的。 make build PKG="<pkg>"其中<pkg>是一个或多个空间分离的软件包名称。make <pkg> - make build的快捷方式,但<pkg>可以是包装名称的子字符串。将构建与给定子字符串相匹配的所有软件包。JOBS=X参数覆盖。make build PKG=<pkg> BUILD_PROFILE=scan_build覆盖默认配置文件。 setup.bash <profile>能够使用软件包。 colcon生成的设置脚本也可以直接使用,例如, install/<profile>/local_setup.sh ,但是在这种情况下,某些CCWS功能将不可用。 colcon make test PKG=<pkg>测试,或者make wstest进行测试。make ctest PKG=<pkg>旁路colcon并直接运行ctest或make wsctest测试全部。 make BUILD_PROFILE=doxygen , firefox artifacts/doxygen/index.html CCWS采用了一种罕见的方法来生成二进制包装,这是传统ROS(1包= 1 Deb)和Docker容器之间的中间立场:工作空间内置的所有软件包都包装在一个Debian“ SuperPakeAge”中。与bloom CCWS不同,CCWS直接生成二进制软件包,而不是首先生成源软件包。
二进制软件包的生成被实现为可以覆盖在任意构建配置文件的构建配置文件中: make <pkg> BUILD_PROFILE=deb BASE_BUILD_PROFILE=reldebug 。
CCWS方法具有许多优势:
与传统的ROS方法相比,二元兼容性问题被最小化:
无需担心多个独立的二进制软件包和执行ABI检查之间的兼容性;
如果包括基本ROS包装,也可以避免在同一ROS释放的同步之间二进制不兼容(实际上发生)。
在标签,版本,git subsodules等方面,软件包存储库管理与ROS相比,可以是sloppp的,例如,无需维护所有软件包的发布存储库。
与独立的软件包和Docker容器相比,Debian的“ SuperPackages”更容易处理,例如,开发人员可以从其工作分支机构中生成它们,并且可以轻松地复制和安装在目标上。
总体而言,Debian软件包比Docker容器具有一些优势:
执行过程中的零开销。
直接访问硬件。
轻松安装系统服务,UDEV规则,配置等。
如果使用不同VERSION的参数构建,则可以同时安装不同版本的二进制软件包。
通常,必须在编译过程中将软件包安装到文件系统根部,以便在catkin cmake文件中正确地将所有路径安装到所有路径中并正确安装系统文件。 CCWS避免使用proot与交叉兼容曲线相似。
这里<profile>代表cross_raspberry_pi , cross_jetson_xavier , cross_jetson_nano 。交叉兼容制造目标可以在ccws/make/cross.mk和ccws/profiles/<profile>/targets.mk中找到
请注意cross_jetson_xavier和cross_jetson_nano :这些配置文件需要Ubuntu 18.04 / ros Melodic并安装nvcc ,您可能需要在容器中进行此操作。
一般工作流程如下记录,有关更多技术详细信息,请参见.ccws/test_cross.mk中的ccws/doc/cross-compilation.md和CCWS CI测试:
make bp_install_build BUILD_PROFILE=<profile>安装配置文件依赖项cross_raspberry_pi bp_install_build目标自动下载标准图像;cross_jetson_xavier , cross_jetson_nano CCWS不会自动获取这些图像,您必须手动复制系统分区映像到ccws/profiles/cross_jetson_xavier/system.img 。make wsinit REPOS="https://github.com/asherikov/staticoma.git"make dep_to_repolist ROS_DISTRO=melodic或特定的软件包make dep_to_repolist PKG=<pkg> ROS_DISTRO=melodic ;make wsupdate 。make cross_install PKG=staticoma BUILD_PROFILE=<profile> ROS_DISTRO=<distro>make cross_mount BUILD_PROFILE=<profile>安装sysrootmake staticoma BUILD_PROFILE=<profile>或构建和生成deb package make deb PKG=staticoma BUILD_PROFILE=<profile>make cross_umount BUILD_PROFILE=<profile>CCWS Docker具有预装的CCWS和依赖项的Docker映像可用于测试,但建议使用ccws/examples/Dockerfile构建量身定制的图像。
该图像可以通过以下方式使用:
docker pull asherikov/ccwsmkdir tmp_ws #源,构建,安装,缓存将转到此处docker run --rm -ti -v ./tmp_ws:/ccws/workspace asherikov/ccws bashmake wsinit REPOS="https://github.com/asherikov/qpmad.git"...CCWS CCWS功能可以通过多种方式扩展:
make bp_new BUILD_PROFILE=vendor_static_checks BASE_BUILD_PROFILE=static_checks ,git忽略了所有以vendor前缀开头的配置文件;ccws/profiles/build/vendor/<filename>.mk文件来添加make目标;cmake工具链后缀可以添加到ccws/profiles/build/vendor/toolchain_suffix.cmake中。跨编译或Debian软件包生成Indside Docker容器(都需要proot )期间的分割故障:大概是由于seccomp Linux功能,可以通过--security-opt seccomp:unconfined Docker参数。使用PROOT_NO_SECCOMP=1禁用proot的seccomp似乎是不必要的。
使用SaniTizer( addr_undef_sanitizers或thread_sanitizer构建配置文件)编译的程序2: AddressSanitizer:DEADLYSIGNAL或FATAL: ThreadSanitizer: unexpected memory mapping执行时的意外记忆映射:原因是在现代Linux Kernels中使用ASLR(地址空间随机化)加强了内存安全性,请参见现代Linux Kernels,请参阅Google/Google/Sanitizers#1614141414141414。可以通过设置sudo sysctl vm.mmap_rnd_bits=28来缓解问题。
由于CMake滥用,例如,某些ROS2 Core软件包无法使用CCWS构建,例如,请参见AMENT/GOOGLE_BENCHMARC__VENDOR#17。
proot Segfault在Ubuntu 22的ARM64上建造时,例如,在构建Debian套餐时。必须使用较新版本的proot ,请参阅proot-me/proot#312。
CCWS功能的github操作。ccache 。clang-tidy运行。scan_build的潜在替换https://github.com/ericsson/codechecker,并带有额外的检查和缓存。dpkg-deb的潜在替换。catkin_make构建环境中存在问题。guestfs太慢而无法实用。valgrind的替代方案, gcc当前不支持它。valgrind执行配置文件的替代方案 - 不过,总体而言是过分的。CodeQL配置文件(https://github.com/github/codeql)。