| สถานะ CI |
|---|
CCWS เป็นสภาพแวดล้อมการพัฒนาสำหรับ ROS ซึ่งรวมการทำงานของพื้นที่ทำงาน catkin แบบดั้งเดิมและท่อส่ง CI เพื่ออำนวยความสะดวกในการรวบรวม (ข้าม) การรวบรวมการทดสอบการผ้าสำลี documetation และการสร้างแพ็คเกจไบนารี มันมีจุดประสงค์เพื่อใช้ทั้งสองเป็นกระดูกสันหลัง CI/CD และสภาพแวดล้อมการทำงานสำหรับนักพัฒนา โปรดทราบว่า CCWS ไม่ได้มีวัตถุประสงค์เพื่อเป็นทางออกที่สมบูรณ์ แต่เป็นพื้นฐานสำหรับการพัฒนาเวิร์กโฟลว์เฉพาะของผู้ขาย
CCWS เป็นผู้ไม่เชื่อเรื่องพระเจ้ารุ่น ROS และควรทำงานในกรณีส่วนใหญ่สำหรับทั้ง ROS1 และ ROS2
สร้างโปรไฟล์ - ชุดของการกำหนดค่าสำหรับกระบวนการสร้างเช่น CMake toolchain, การกำหนดค่า Colcon, ตัวแปรสภาพแวดล้อม ฯลฯ โปรไฟล์ไม่ขัดแย้งกันและสามารถใช้ในแบบคู่ขนานได้โดยไม่ต้องใช้โคลนแยกต่างหากของพื้นที่ทำงานและแพ็คเกจ
โปรไฟล์การดำเนินการ - Mixins เชลล์แบบง่ายที่มีวัตถุประสงค์เพื่อแก้ไขสภาพแวดล้อมเวลาทำงานเช่นดำเนินการโหนดใน valgrind , เปลี่ยนการจัดการความผิดพลาดโหนด ฯลฯ ฯลฯ
มีคุณสมบัติมากมายที่นำมาใช้ผ่านโปรไฟล์ Build:
การรวบรวมข้ามไปยังหลายแพลตฟอร์มทั่วไป
การสร้างเอกสารสำหรับพื้นที่ทำงานทั้งหมดหรือแพ็คเกจที่เลือกโดยใช้ 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 และ Shell ทั้งหมด สคริปต์และการกำหนดค่าทั้งหมดจะถูกเก็บไว้ในพื้นที่ทำงานและปรับได้ง่ายสำหรับความต้องการเฉพาะ
การกำหนดค่าโปรไฟล์อยู่ใน ccws/profiles/build ไดเรกทอรี common ประกอบด้วยพารามิเตอร์เริ่มต้นซึ่งสามารถแทนที่ได้โดยโปรไฟล์เฉพาะ:
reldebug - คอมไพเลอร์เริ่มต้นประเภท cmake build เป็น RelWithDebInfoscan_build การตรวจสอบแบบคงที่ด้วย scan_build และ clang-tidy พารามิเตอร์ clang-tidy ถูกกำหนดไว้ใน CMake Toolchain และจะต้องเปิดใช้งานในแพ็คเกจดังที่แสดงในเทมเพลตแพ็คเกจ CMakeLists โปรไฟล์นี้ยังใช้คอมไพเลอร์ clangthread_sanitizer - การรวบรวมด้วยเกล็ดสารฆ่าเชื้อaddr_undef_sanitizers - การรวบรวมด้วยที่อยู่และ sanitizers พฤติกรรมที่ไม่ได้กำหนดstatic_checks - หมากฮอสคงที่และการกำหนดค่าของพวกเขาdoxygen - Doxygen และการกำหนดค่าcross_raspberry_pi การรวบรวมข้ามสำหรับ Raspberry Picross_jetson_xavier การรวบรวมข้ามสำหรับ Jetson Xaviercross_jetson_nano การรวบรวมข้ามสำหรับ Jetson Nanoclangd - รวบรวมคำสั่งการรวบรวมสำหรับ BASE_BUILD_PROFILE ที่กำหนดและสร้างไฟล์การกำหนดค่า clangd ในรูทเวิร์กสเปซdeb - Debian Package Generation (ดูด้านล่าง) โปรไฟล์การดำเนินการตั้งค่าตัวแปรสภาพแวดล้อมที่สามารถใช้ในการเรียกใช้สคริปต์เพื่อเปลี่ยนพฤติกรรมเวลารันตามที่แสดงใน ccws/pkg_template/catkin/launch/bringup.launch ซึ่งเป็นโปรไฟล์ที่มีอยู่ในปัจจุบันคือ:
common - ชุดของพารามิเตอร์ ROS ทั่วไปเช่น ROS_HOME จะรวมอยู่ในแพ็คเกจไบนารีโดยอัตโนมัติtest - ตั้งค่าตัวแปร CCWS_NODE_CRASH_ACTION เพื่อให้โหนดที่เคารพได้กลายเป็น required เช่นการสิ้นสุดของโหนดดังกล่าวจะส่งผลให้เกิดความผิดพลาดของสคริปต์ทดสอบและสามารถตรวจพบได้ง่ายvalgrind - ตั้งค่า CCWS_NODE_LAUNCH_PREFIX เป็น valgrind และตัวแปรบางตัวที่ควบคุมพฤติกรรมของ valgrindcore_pattern - ตั้งค่ารูปแบบหลักเพื่อบันทึกไฟล์หลักในไดเรกทอรี Artifactsaddress_sanitizer - ผู้ช่วยสำหรับโปรไฟล์ addr_undef_sanitizers โปรไฟล์การดำเนินการไม่มีผลต่อกระบวนการสร้างและนำมาพิจารณาใน *test* เป้าหมายหรือแพ็คเกจ Debian โปรไฟล์การดำเนินการ test จะใช้ในการทดสอบเสมอและสามารถให้โปรไฟล์เพิ่มเติมได้ด้วย EXEC_PROFILE="<profile1> <profile2>" เป้าหมายเหล่านี้โหลดโปรไฟล์โดยใช้สคริปต์ setup.bash ที่อยู่ในโฟลเดอร์รูทของ CCWS ซึ่งสามารถใช้งานได้ด้วยตนเองเช่น source setup.bash [<build_profile> [<exec_profile1> ...]] โปรดทราบว่าสคริปต์การตั้งค่ามักจะมีโปรไฟล์ common และใช้โปรไฟล์การดำเนินการ test หากไม่มีการระบุโปรไฟล์การดำเนินการอื่น
การพึ่งพาสามารถติดตั้งได้โดยใช้ make bp_install_build BUILD_PROFILE=<profile> ซึ่งกำลังจะติดตั้งเครื่องมือต่อไปนี้และการอ้างอิงเฉพาะโปรไฟล์:
colconyq - https://github.com/asherikov/wshandler qualencycmakeccache - สามารถปิดใช้งานได้ใน CMAKE Toolchainswget ดู .ccws/test_main.mk สำหรับคำสั่งการใช้คำสั่ง
make/config.mk พารามิเตอร์ที่มีอยู่สามารถพบได้ในส่วนบนสุดของ Makefilemake bp_install_build BUILD_PROFILE=<profile> เป้าหมายโปรไฟล์การรวบรวมข้ามจะต้องใช้ขั้นตอนพิเศษตามที่อธิบายไว้ด้านล่าง ในสภาพแวดล้อมที่เรียบง่ายบางอย่างคุณอาจต้องเรียกใช้ ./ccws/scripts/bootstrap.sh ก่อนที่จะใช้เป้าหมาย bp_install_build เพื่อติดตั้ง make และ Utils อื่น ๆ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 บางส่วนจะไม่สามารถใช้ได้ make test PKG=<pkg> ทดสอบกับ colcon หรือ 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: แพ็คเกจทั้งหมดที่สร้างขึ้นในเวิร์กสเปซจะถูกรวมเข้าด้วยกันเป็น 'superpackage' เดเบียนเดียว แตกต่างจาก bloom CCWS สร้างแพ็คเกจไบนารีโดยตรงแทนที่จะสร้างแพ็คเกจต้นทางก่อน
การสร้างแพ็คเกจไบนารีถูกนำมาใช้เป็น mixin โปรไฟล์บิลด์ที่สามารถซ้อนทับผ่านโปรไฟล์การสร้างโดยพลการ: make <pkg> BUILD_PROFILE=deb BASE_BUILD_PROFILE=reldebug
วิธี CCWS มีข้อดีหลายประการ:
ปัญหาความเข้ากันได้ของไบนารีลดลงเมื่อเทียบกับวิธีการ ROS แบบดั้งเดิม:
ไม่จำเป็นต้องกังวลเกี่ยวกับความเข้ากันได้ระหว่างแพ็คเกจไบนารีหลายแบบสแตนด์อโลนและทำการตรวจสอบ ABI;
หากมีการรวมแพ็คเกจ ROS พื้นฐานก็เป็นไปได้ที่จะหลีกเลี่ยงความไม่ลงรอยกันแบบไบนารีระหว่างการซิงค์ของการเปิดตัว ROS เดียวกัน (ที่เกิดขึ้นจริง)
การจัดการที่เก็บแพ็คเกจสามารถเป็น sloppier เมื่อเทียบกับ ROS เมื่อพูดถึงแท็กเวอร์ชัน, git submodules, ฯลฯ , เช่นไม่จำเป็นต้องรักษา repos release สำหรับแพ็คเกจทั้งหมด
'superpackages' ของ Debian นั้นง่ายต่อการจัดการมากกว่าทั้งแพ็คเกจสแตนด์อโลนและคอนเทนเนอร์ Docker เช่นพวกเขาสามารถสร้างขึ้นได้โดยนักพัฒนาจากสาขาการทำงานของพวกเขาและคัดลอกและติดตั้งบนเป้าหมายได้อย่างง่ายดาย
แพ็คเกจ 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/doc/cross-compilation.md และ CCWS CI ใน .ccws/test_cross.mk :
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.imgmake 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 wsupdatemake cross_install PKG=staticoma BUILD_PROFILE=<profile> ROS_DISTRO=<distro>make cross_mount BUILD_PROFILE=<profile>make staticoma BUILD_PROFILE=<profile> หรือสร้างและสร้างแพ็คเกจ DEB make deb PKG=staticoma BUILD_PROFILE=<profile>make cross_umount BUILD_PROFILE=<profile>CCWS Docker อิมเมจนักเทียบท่าที่มี CCWS และการพึ่งพาก่อนติดตั้งไว้ล่วงหน้าสำหรับการทดสอบ แต่ขอแนะนำให้สร้างภาพที่ปรับแต่งโดยใช้ 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 โปรไฟล์ทั้งหมดเริ่มต้นด้วยคำนำหน้า vendor จะถูกละเว้นโดย GIT;make เป้าหมายสามารถเพิ่มได้โดยการสร้าง ccws/profiles/build/vendor/<filename>.mk ไฟล์;cmake Toolchain ต่อท้ายสามารถเพิ่มลงใน ccws/profiles/build/vendor/toolchain_suffix.cmake ความผิดพลาดในการแบ่งส่วนในระหว่างการรวบรวมข้ามหรือการสร้างแพ็คเกจ Debian Indside Docker Containers (ทั้งสองต้องการ proot ): น่าจะเป็นเพราะคุณสมบัติ seccomp Linux ซึ่งสามารถปิดใช้งานได้ด้วย --security-opt seccomp:unconfined การปิดใช้ seccomp สำหรับ proot ด้วย PROOT_NO_SECCOMP=1 ดูเหมือนจะไม่จำเป็น
โปรแกรมที่รวบรวมด้วย sanitizers ( addr_undef_sanitizers หรือ thread_sanitizer สร้างโปรไฟล์) เอาท์พุท 2: AddressSanitizer:DEADLYSIGNAL หรือ FATAL: ThreadSanitizer: unexpected memory mapping เมื่อดำเนินการ: เหตุผลคือความปลอดภัยของหน่วยความจำ ปัญหาสามารถบรรเทาได้โดยการตั้งค่า sudo sysctl vm.mmap_rnd_bits=28
แพ็คเกจหลัก ROS2 บางส่วนไม่สามารถสร้างด้วย CCWS เนื่องจากการใช้ CMAKE ในทางที่ผิดเช่นดู AMENT/google_benchmark_vendor#17
proot Segfault ในขณะที่สร้าง ARM64 ใน Ubuntu 22 เช่นในขณะที่สร้างแพ็คเกจ Debian ต้องใช้ proot เวอร์ชันใหม่กว่าดู Proot-Me/Proot#312
github ที่ครอบคลุมฟังก์ชั่น CCWS บางอย่างccache ด้วย https://github.com/mbitsnbites/buildcacheclang-tidyscan_build https://github.com/ericsson/codechecker พร้อมการตรวจสอบและแคชเพิ่มเติมdpkg-debcatkin_makeguestfs ช้าเกินไปที่จะใช้งานได้จริงvalgrind , gcc ไม่รองรับในปัจจุบันvalgrind -overkill ในกรณีทั่วไปแม้ว่าCodeQL (https://github.com/github/codeql)