| 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 melodic ;make wsupdate 。make cross_install PKG=staticoma BUILD_PROFILE=<profile> ROS_DISTRO=<distro>make cross_mount BUILD_PROFILE=<profile>安裝sysrootmake deb PKG=staticoma BUILD_PROFILE=<profile>軟件包,例如make 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)。