MoriKen's Journal

MoriKen's Journal

アラサー社会人博士による徒然日記。技術についてつらつら。だけだとコンテンツが貧弱なので、会社公認で大学院博士課程に進学した経緯や、独学でTOEICを475→910にしたノウハウを共有します。

Buildfarm+bloomで自作ROS pkg をaptやrosdepで取得可能にする!①前準備編

Sponsored Link

ある程度ROSでのアプリケーション開発に慣れてくると、aptでインストールしたり、rosdepで依存関係を解決したくなりますよね(なりません?なりますよね。)。

それを楽ちんにしてくれるのがbloomというツールです。

とはいえ、実際にやってみようと思うと、結構心理的障壁が高かったりします。

もちろんROS Wikiをみれば情報はあるし、ご丁寧に日本語訳まであります。

あとはこれに従えばいいのですが、それでも実際にやるにはどうにもハードルが高い気がして、手が伸びないというのが、多くの方にとっての本音ではないでしょうか。

かく言う私自身、本当に大丈夫だろうかとヒヤヒヤしながらbloomでリリース作業をしました。

自分がその時のヒヤヒヤ感をもう二度と味わいたくないのと笑、同じような思いを抱えてらっしゃるROSデベロッパの方と情報を共有できたらなと思いまして。

というわけで、その手順を記していこうと思います。

大枠の流れは、目次を参照下さい。作業順に沿って並んでいます。

ケーススタディのネタ

今回ケーススタディとする対象のネタは、小生が開発した timed_roslaunch というパッケージです。指定秒だけ launch ファイルの実行タイミングを遅らせることができるユーティリティです。

github.com

wiki.ros.org

概念図

私が実際に作業してみた経験を元に、このようになっているのだろうというイメージを作成してみました。(誤りがございましたらご指摘頂けましたら幸いです。)

f:id:MoriKen254:20190609204332j:plain


自作パッケージを完成させる

まずは、自作パッケージを作りましょう(当たり前笑)。

f:id:MoriKen254:20190609210459j:plain


そして、以下の点に注意しましょう。

依存関係を正確に記述する

パッケージには、マニフェスト情報であるpackage.xmlと、cmake用の設定ファイルであるCMakeLitst.txtが格納されており、これらに自作パッケージの依存関係を正確に記述する必要があります。

なぜなら、Buildfarmに登録された場合、CIによるビルドジョブが走るので、依存関係をしっかりかかないとビルドステータスがFailになってしまいます。

これは、配布先のユーザ側でも、せっかくインストールしたのに自分で依存関係を解決しなければならないという辛い状態になりますし、自分自身が使うときにも苦労するでしょう。

ここではその設定方法について細かく書くつもりはありませんが、最低限依存関係だけでも確認は必須です。駆け足ですが、概要だけ。

package.xml
  • 〈depend〉タグ

    • ビルド時、実行時、エクスポート時で必要なパッケージ。
  • 〈build_depend〉タグ

    • ビルド時に必要なパッケージ。でもエクスポートがいらないならこれだけでいいです。
  • 〈exec_depend〉タグ

    • 実行時に必要なパッケージ。
  • 〈test_depend〉タグ

    • テスト時に必要なパッケージ。
CMakeLists.txt
  • find_package

    • パッケージの存在確認をします。
    • catkin に含まれるパッケージを確認します。
    • find_package はされているけど、catkin_package内でCATKIN_DEPENDSされていないものは、エクスポートが不要なので、package.xmlで〈build_depend〉と〈exec_depend〉に加えます。
  • catkin_package

    • catkinでビルドする際の依存パッケージの設定をします。
    • CATKIN_DEPENDS されているパッケージはエクスポートが必要なので、〈depend〉 に入れます。
  • install

    • down_stream パッケージが利用する際に必要なファイルは全て install 指定します。
参考ドキュメント

詳細は公式をご参照下さい。

docs.ros.org

※正直依存関係周りは、このネタだけで記事が一本書けるくらいの話です。分からなくてもとにかく、ここではもう作業として割り切って、必要な依存関係を記述しきっちゃて下さい。最悪全部〈depend〉 にしちゃっても、ビルドは通ってしまうはずですので(気持ちは悪いですが笑)。

CHANGELOG.rstの登録

f:id:MoriKen254:20190609210523j:plain


作業がローカルなのに、なんで図でリモートを指しているのかと思われた方がいらっしゃったら、ちょっと待ってください。

Push するところまで含めてCHANGELOG.rstの登録とさせて下さい。(この作業におけるワークスペースまで図示すると、図全体の均衡が保てなくなるので、少々ご辛抱を ^^;)

generate

まずはCHANGELOG.rstを作成します。

$ catkin_generate_changelog --all
Found packages: timed_roslaunch
Querying all tags and commit information...
Generating changelog files with all versions...
- creating './CHANGELOG.rst'
Done.
Please review the extracted commit messages and consolidate the changelog entries before committing the files!

差分を確認してみましょう。

$ git status 
ブランチ kinetic-devel
追跡されていないファイル:
  (use "git add <file>..." to include in what will be committed)

    CHANGELOG.rst

nothing added to commit but untracked files present (use "git add" to track)

CHANGELOG.rst が作成されているのが分かります。中身も確認しておきます。

$ git diff
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 2b3320..7100568 100644
--- a/CHANGELOG.rst
--- b/CHANGELOG.rst
@@ -2,6 +2,13 @@
 Changelog for package timed_roslaunch
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
<br>
+Forthcoming
+-----------
+* Merge pull request
+  Modify CMakeLists for launch  and test dir install
+* Modify CMakeLists for launch  and test dir install
+* Contributors: MoriKen254
+
 0.1.2 (2018-11-09)
 ------------------
 * Fix install scripts in CMakeLists

コミットログが入ります。変なコミットメッセージを入れると、恥を晒すことに…(オイ)。

commit & push

上記の差分をコミットし、リモートにプッシュします。

$ git add --a

$ git commit -m "Add CHANGELOG.rst"
[kinetic-devel 45a9cf9] Add CHANGELOG.rst
 1 file changed, 75 insertions(+)
 create mode 100644 CHANGELOG.rst

$ git push origin kinetic-devel 
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 1.92 KiB | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/MoriKen254/timed_roslaunch
   57a995e..45a9cf9  kinetic-devel -> kinetic-devel

releaseの前準備

package.xml 内の ver. 番号をインクリします!

f:id:MoriKen254:20190609210908j:plain


以下のコマンドを打ちましょう。

$ catkin_prepare_release 

すると、現在のpackage.xmlを解析して、リリースバージョンをインクリするコミットが生成されます。

Prepare the source repository for a release.
Repository type: git
Found packages: timed_roslaunch
Prepare release of version '0.1.3' [Y/n]?y
Trying to push to remote repository (dry run)...
Everything up-to-date
Checking if working copy is clean (no staged changes, no modified files, no untracked files)...
Rename the forthcoming section of the following packages to version '0.1.3': timed_roslaunch
Bump version of all packages from '0.1.2' to '0.1.3'
Committing the package.xml files...
[kinetic-devel 46cfd23] 0.1.3
 2 files changed, 3 insertions(+), 3 deletions(-)

次に、インクリ後のリリースバージョンのタグも生成します。

Creating tag '0.1.3'...

先程のコミットとタグを両方リモートにプッシュしても良いかを尋ねられます。もちろんyes!

The following commands will be executed to push the changes and tag to the remote repository:
  /usr/bin/git push origin kinetic-devel
  /usr/bin/git push --tags
Execute commands to push the local commits and tags to the remote repository [Y/n]?y

まずはコミットをプッシュ。

Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 377 bytes | 0 bytes/s, done.
Total 4 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), completed with 3 local objects.
To https://github.com/MoriKen254/timed_roslaunch.git
   45a9cf9..46cfd23  kinetic-devel -> kinetic-devel
Total 0 (delta 0), reused 0 (delta 0)

次にタグをプッシュ。

To https://github.com/MoriKen254/timed_roslaunch.git
 * [new tag]         0.1.3 -> 0.1.3
The source repository has been released successfully. The next step will be 'bloom-release'.

おわりに

これにて、①前準備編は完了です。

実際のリリース作業は次回の記事で記述します。次回の方がちとややこしいのですが。ま、ぶっちゃけ bloom が勝手にやってくれるので、こっちは眺めているだけなのですが笑。便利なものです。

www.moriken254.com