| حالة CI |
|---|
CCWS هي بيئة تطوير لـ ROS ، والتي تدمج وظائف مساحات عمل catkin التقليدية وخطوط أنابيب CI من أجل تسهيل التجميع (المتقاطع) ، والاختبار ، والبطانة ، وتوليد الحزمة الثنائية. يهدف إلى استخدام العمود الفقري CI/CD وبيئة عمل للمطورين. لاحظ أن CCWS ليس المقصود أن يكون حلاً كاملاً ، بل أساسًا لتطوير سير عمل محدد للبائع.
CCWS هو إصدار ROS Ad Attostic ، ويجب أن تعمل في معظم الحالات لكل من ROS1 و ROS2.
ملفات التعريف - مجموعات من التكوينات لعملية الإنشاء ، على سبيل المثال ، CMAKE Toolchain ، تكوين Colcon ، متغيرات البيئة ، إلخ. لا تتعارض ملفات التعريف مع بعضها البعض ويمكن استخدامها بالتوازي دون استخدام استنساخ منفصل من مساحة العمل والحزم.
ملفات تعريف التنفيذ - Mixins Simple Shell التي تهدف إلى تعديل بيئة وقت التشغيل ، على سبيل المثال ، تنفيذ العقد في valgrind ، ومعالجة تعطل العقدة ، وما إلى ذلك.
عدد من الميزات التي تم تنفيذها عبر ملفات تعريف البناء:
تجميع متقاطع للعديد من المنصات الشائعة.
توليد الوثائق لمساحة العمل بأكملها أو الحزم المحددة باستخدام 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جيل حزمة ديبيان الثنائية.
قالب الحزمة الذي يوضح كيفية استخدام بعض الميزات.
يمكن اختيار عدد الوظائف المتوازية بناءً على ذاكرة الوصول العشوائي المتاحة بدلاً من مراكز وحدة المعالجة المركزية ، حيث من المحتمل أن يكون ذاكرة الوصول العشوائي هو العامل المقيد.
استنادا تماما على البرامج النصية make والقذيفة. يتم الاحتفاظ بجميع البرامج النصية والتكوينات في مساحة العمل ويسهل ضبطها لتلبية الاحتياجات المحددة.
توجد تكوينات الملف الشخصي في ccws/profiles/build ، يحتوي الدليل الفرعي common على معلمات افتراضية ، والتي يمكن تجاوزها بواسطة ملفات تعريف محددة:
reldebug - برنامج التحويل البرمجي الافتراضي ، نوع بناء cmake هو RelWithDebInfoscan_build فحص ثابت مع scan_build و clang-tidy . يتم تعريف معلمات clang-tidy في CMake Toolchain ويجب تمكينها في الحزم كما هو موضح في قالب الحزمة CMakeLists . يستخدم هذا الملف الشخصي أيضًا برنامج التحويل البرمجي clang .thread_sanitizer - تجميع مع مطهر الموضوع.addr_undef_sanitizers - تجميع مع العنوان ومطهرات السلوك غير المحددة.static_checks - الداما الثابتة وتكوينها.doxygen - Doxygen وتكوينه.cross_raspberry_pi التوت المتبادل للتوت.cross_jetson_xavier -cross-compilation for Jetson Xavier.cross_jetson_nano -Cross-Compilation for Jetson Nano.clangd - يجمع أوامر التجميع لـ BASE_BUILD_PROFILE وإنشاء ملف تكوين clangd في جذر مساحة العمل.deb - جيل حزم دبيان (انظر أدناه). ملفات تعريف التنفيذ تعيين متغيرات البيئة التي يمكن استخدامها في البرامج النصية لإطلاق لتغيير سلوك وقت التشغيل كما هو موضح في 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 ، والذي يمكن أيضًا استخدامه يدويًا ، على سبيل المثال ، source setup.bash [<build_profile> [<exec_profile1> ...]] . لاحظ أن البرنامج النصي SETUP يتضمن دائمًا ملف تعريف common ، ويستخدم ملف تعريف تنفيذ test إذا لم يتم تحديد ملفات تعريف تنفيذ أخرى.
يمكن تثبيت التبعيات باستخدام make bp_install_build BUILD_PROFILE=<profile> ، والتي ستقوم بتثبيت الأدوات التالية وتبعيات الملف الشخصي:
colconyq - https://github.com/asherikov/wshandler التبعيةcmakeccache - يمكن تعطيلها في Cmake Toolsainswget انظر .ccws/test_main.mk للحصول على تلميحات استخدام الأوامر.
make/config.mk ، يمكن العثور على المعلمات المتاحة في القسم العلوي من Makefile .make bp_install_build BUILD_PROFILE=<profile> الأهداف ، تتطلب ملفات تعريف التجميع المتقاطعة بعض الخطوات الإضافية كما هو موضح أدناه. في make البيئات التي قد تحتاج bp_install_build تشغيلها ./ccws/scripts/bootstrap.shsrc الفرعي ، أو قم بإنشاء جديد باستخدام 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: يتم تعبئة جميع الحزم المدمجة في مساحة العمل معًا في "Packpackage" Debian واحد. على عكس bloom CCWS ، يولد حزم ثنائية مباشرة بدلاً من إنشاء حزم المصدر أولاً.
يتم تنفيذ توليد الحزمة الثنائية كخليط ملف تعريف البناء يمكن تراكبه على ملف تعريف البناء التعسفي: make <pkg> BUILD_PROFILE=deb BASE_BUILD_PROFILE=reldebug .
نهج CCWS له عدد من المزايا:
يتم تقليل قضايا التوافق الثنائي مقارنة بنهج ROS التقليدي:
لا داعي للقلق بشأن التوافق بين الحزم الثنائية المستقلة المتعددة وإجراء عمليات فحص ABI ؛
إذا تم تضمين حزم ROS الأساسية ، فمن الممكن أيضًا تجنب عدم التوافق الثنائي بين المزامنة من نفس إصدار ROS (تلك التي تحدث بالفعل).
يمكن أن تكون إدارة مستودعات الحزم أكثر سلطًا مقارنةً بـ ROS عندما يتعلق الأمر بالعلامات ، والإصدارات ، والفيروسات الفرعية GIT ، وما إلى ذلك ، على سبيل المثال ، ليست هناك حاجة للحفاظ على إعادة الإطلاق لجميع الحزم.
من السهل التعامل مع "الحلقات الفائقة" من كل من الحزم المستقلة وحاويات Docker ، على سبيل المثال ، يمكن إنشاءها من قبل المطورين من فروع عملهم ويتم نسخها بسهولة وتثبيتها على الهدف.
تحتوي حزم دبيان على بعض المزايا على حاويات 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.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>make staticoma BUILD_PROFILE=<profile> أو إنشاء وإنشاء حزمة make deb PKG=staticoma BUILD_PROFILE=<profile>make cross_umount BUILD_PROFILE=<profile>CCWS Docker تتوفر صورة 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 إلى ccws/profiles/build/vendor/toolchain_suffix.cmake . خطأ تجزئة أثناء الحاويات المتقاطعة أو حاوية حزم دبيان إنديس سايد (كلاهما يتطلب proot ): من المفترض أن يكون ذلك بسبب ميزة seccomp linux ، والتي يمكن تعطيلها-- --security-opt seccomp:unconfined . تعطيل seccomp لـ proot مع PROOT_NO_SECCOMP=1 يبدو أنه غير ضروري.
البرامج التي تم تجميعها باستخدام المرمى ( addr_undef_sanitizers أو thread_sanitizer ملفات تعريف) الإخراج 2: AddressSanitizer:DEADLYSIGNAL أو FATAL: ThreadSanitizer: unexpected memory mapping عند تنفيذها: السبب هو أمن الذاكرة مع ASLR (تخطيط مساحة العشوائية) في حلقات العشوائية الحديثة ، انظر Google#1614. يمكن تخفيف المشكلة عن طريق تعيين 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/buildcache.clang-tidy .scan_build https://github.com/ericsson/CODECHECKER مع فحوصات إضافية وتخزين مؤقت.dpkg-deb .catkin_make .guestfs بطيئة للغاية بحيث لا يمكن أن تكون عملية.valgrind ، لا يدعمه gcc حاليًا.valgrind وهو مبالغة في حالة عامة.CodeQL (https://github.com/github/codeql).