| CIステータス |
|---|
CCWSはROSの開発環境であり、従来のcatkinワークスペースとCIパイプラインの機能を統合して、(クロス)コンピレーション、テスト、糸くず、ドキュメット、バイナリパッケージの生成を促進します。これは、開発者向けのCI/CDバックボーンと作業環境の両方として使用することを目的としています。 CCWS完全なソリューションではなく、ベンダー固有のワークフローの開発の基礎であることに注意してください。
CCWSはROSバージョンの不可知論者であり、ほとんどの場合、ROS1とROS2の両方で機能するはずです。
ビルドプロファイル - ビルドプロセスの構成のセットなど、Cmakeツールチェーン、Colcon構成、環境変数など。プロファイルは互いに競合せず、ワークスペースとパッケージの個別のクローンを使用せずに並行して使用できます。
実行プロファイル - 実行時間環境を変更することを目的としたシンプルなシェルミキシン、例えば、 valgrindでノードを実行したり、ノードクラッシュハンドリングを変更したりします。
ビルドプロファイルを介して実装された多くの機能:
いくつかの一般的なプラットフォームに相互編集。
https://github.com/mikepurvis/catkin_tools_documentと同様に、 doxygenを使用したワークスペース全体または選択したパッケージ全体のドキュメント生成。
clang-tidyとscan_buildで糸くず。
特にhttps://github.com/sscpac/statickのようなさまざまな静的チェック:
cppcheckcatkin_lint https://github.com/fkie/catkin_lintyamllintshellcheckバイナリデビアンパッケージ生成。
いくつかの機能を使用する方法を示すパッケージテンプレート。
RAMが制限要因である可能性が高いため、並列ジョブの数は、CPUコアの代わりに利用可能なRAMに基づいて選択できます。
makeとシェルスクリプトに完全に基づいています。すべてのスクリプトと構成はワークスペースに保持され、特定のニーズに合わせて簡単に調整できます。
プロファイル構成はccws/profiles/buildにあります。 commonサブディレクトリにはデフォルトパラメーターが含まれています。
reldebugデフォルトのコンパイラ、cmakeビルドタイプはRelWithDebInfoですscan_build scan_buildおよびclang-tidyを使用した静的チェック。 clang-tidyパラメーターはcmakeツールチェーンで定義されており、パッケージテンプレートCMakeListsに示すようにパッケージで有効にする必要があります。このプロファイルは、 clangコンパイラも使用します。thread_sanitizerスレッド消毒剤による編集。addr_undef_sanitizers住所と未定義の動作サニタイザーを使用した編集。static_checks静的チェッカーとその構成。doxygen -doxygenとその構成。cross_raspberry_pi Raspberry Piの相互コンパイル。cross_jetson_xavierジェットソンザビエルの相互コンパイル。cross_jetson_nanoジェットソンナノの相互コンパイル。clangd特定のBASE_BUILD_PROFILEのコンパイルコマンドを収集し、ワークスペースルートで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 -artifactsディレクトリにコアファイルを保存するコアパターンを設定します。address_sanitizer addr_undef_sanitizersプロファイルのヘルパー。実行プロファイルはビルドプロセスに影響を与えず、 *test*ターゲットまたはDebianパッケージで考慮されます。 test実行プロファイルは常にテストで使用され、追加のプロファイルはEXEC_PROFILE="<profile1> <profile2>"で提供できます。これらのターゲットはsource setup.bash [<build_profile> [<exec_profile1> ...]] CCWSのルートフォルダーにあるsetup.bashスクリプトを使用してプロファイルをロードします。これは、手動で使用することもできます。セットアップスクリプトには常にcommonプロファイルが含まれており、他の実行プロファイルが指定されていない場合はtest実行プロファイルを使用することに注意してください。
依存関係はmake bp_install_build BUILD_PROFILE=<profile>を使用してインストールできます。これは、次のツールをインストールし、特定の依存関係をプロファイルします。
colconyq -https://github.com/asherikov/wshandler依存関係cmakeccache -Cmakeツールチェーンで無効にすることができますwgetコマンド使用のヒントについては.ccws/test_main.mkを参照してください。
make/config.mkにそれらを追加することにより、開発者とベンダーの固有のパラメーターをオーバーライドすると、利用可能なパラメーターはMakefileの上部セクションにあります。make bp_install_build BUILD_PROFILE=<profile>ターゲットを使用して依存関係をインストールすると、クロスコンパイルプロファイルには、以下に説明する追加の手順が必要です。いくつかのミニマルな環境では、 bp_install_build makeを使用する前に./ccws/scripts/bootstrap.sh scripts/bootstrap.shを実行する必要がある場合があります。src Subdirectoryのクローンパッケージ、またはmake new PKG=<pkg>を使用して新しい作成。 make build PKG="<pkg>" 。ここで、 <pkg>は1つ以上のスペース分離パッケージ名です。make <pkg> -make 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> bypass colcon直接ctestするか、すべてをテストするためにmake wsctest 。 make BUILD_PROFILE=doxygen 、 firefox artifacts/doxygen/index.html CCWS 、従来のROS(1パッケージ= 1 Deb)とDockerコンテナの間の中間点であるバイナリパッケージ生成に対するやや珍しいアプローチを取ります。ワークスペースに構築されたすべてのパッケージは、単一のDebianの「スーパーパッケージ」にまとめられています。 bloomとは異なり、 CCWS最初にソースパッケージを生成するのではなく、バイナリパッケージを直接生成します。
バイナリパッケージ生成は、任意のビルドプロファイルでオーバーレイできるビルドプロファイルミックスとして実装されます: make <pkg> BUILD_PROFILE=deb BASE_BUILD_PROFILE=reldebug 。
CCWSアプローチには多くの利点があります。
バイナリの互換性の問題は、従来のROSアプローチと比較して最小化されます。
複数のスタンドアロンバイナリパッケージ間の互換性を心配し、ABIチェックを実行する必要はありません。
ベースROSパッケージが含まれている場合、同じROSリリースの同期間のバイナリの互換性を回避することもできます(実際に発生します)。
パッケージリポジトリ管理は、タグ、バージョン、gitサブモジュールなどに関しては、ROSと比較してスロップがあります。
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メロディックが必要で、 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 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>を使用してsysrootをマウントしますmake staticoma BUILD_PROFILE=<profile>か、debパッケージを作成して生成しますmake deb PKG=staticoma BUILD_PROFILE=<profile>make cross_umount BUILD_PROFILE=<profile>で行われた場合のsysrootをアンマウントします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 、 vendorプレフィックスから始まるすべてのプロファイルはGitで無視されます。ccws/profiles/build/vendor/<filename>.mk FILEを作成して、 makeを追加できます。cmakeツールチェーン接尾辞はccws/profiles/build/vendor/toolchain_suffix.cmakeに追加できます。クロスコンパイルまたはDebianパッケージ生成中のセグメンテーション障害Indside Dockerコンテナ(どちらもprootが必要です):おそらく、 --security-opt seccomp:unconfined Dockerパラメーターで無効にすることができるseccomp Linux機能のためです。 PROOT_NO_SECCOMP=1使用してprootのseccompを無効にすることは不要であるようです。
サニタイザー( addr_undef_sanitizersまたはthread_sanitizerビルドプロファイル)で編集されたプログラム出力2: AddressSanitizer:DEADLYSIGNALまたはFATAL: ThreadSanitizer: unexpected memory mapping :理由はASLR(アドレススペースレイアウトランダム化)でメモリセキュリティを強化します。この問題はsudo sysctl vm.mmap_rnd_bits=28設定することで軽減できます。
ROS2コアパッケージの一部は、CMAKE誤用のためにCCWSで構築することはできません。
debianパッケージを構築しながら、Ubuntu 22のARM64を構築しながらproot SEGFAULT。 prootの新しいバージョンを使用する必要があります。Prot-Me/Proet#312を参照してください。
CCWSの一部をカバーするgithubアクション。ccache https://github.com/mbitsnbites/buildcacheに置き換えます。clang-tidy Runをキャッシュできます。scan_build https://github.com/ericsson/codecheckerの潜在的な交換は、追加のチェックとキャッシュを備えています。dpkg-debの潜在的な代替品。catkin_makeのビルド環境に問題がある可能性があります。guestfsは遅すぎて実用的ではありません。valgrindの代替としてメモリ消毒剤プロファイルを追加すると、 gcc現在それをサポートしていません。valgrind実行プロファイルの代替として - 一般的な場合は過剰です。CodeQLプロファイル(https://github.com/github/codeql)を追加します。