gitlab CIのメモ [ C++ / cmake ]

前書き

gitlab.com

C++の環境構築?のためにgitlab CIとかcmakeとか少し触ったのだけど、しばらく触らないかもしれないし、 忘れないうちにメモしておこうと思う。
申し訳ないけれど何をやったのか気になる方はいっそリンク先の .gitlab-ci.yml を見てほしい。その方がはやい。
長い時間が空かない限りは自分は読めると思うし、それを細かく解説する気力はないです。。。
少なくとも自分は特殊な知識や技能でこれを成し遂げたわけではなくググって何とかしたのでググればできるはず。



とりあえず得た教訓

詳細

こんなところか?

  1. git push は取り消せる
  2. pushをトリガーにしてテスト回すのは割に合わない?
  3. cmakeのversionはどれにするかよく考えたほうがいいかもしれない
  4. BoostTestはBoostの一部

_1. について
addやcommitは消せるのは知っていた。pushを消すのは作業中には思いつかなかった。 一方でrebaseで問題が起きるケースがあるのは知っていた( Git - リベース )。
rebaseはほぼ使わないのだけどコミットログをきれいにする用途で使うのかなぁくらいに思っていた。
リモートのブランチのログをきれいにする(rebaseする)と問題が起きるならできないってことか、くらいに思ってた。
けどできるらしいので次回はもっときれいにしましょうね( git pushを取り消す2つの方法 - Reasonable Code )。

_2. について
gitlabにpushしてbuildやtestの成否を待つのは大変苦しい。 やってみて分かったけれど、今回のケースではそんなにメリットが感じられない。 ローカルのdockerでやるのが難しいとかなら良いのかもしれないけどどうなんだろう。 他の人にリポジトリが有効で、その有効の判断はどの環境/テストコードに基づいている、と明示できるというのは良いのかもしれないけどうーん。 小規模ならローカルでテスト回して通ったらpushで良いのでは?と思う。 分かんないけどbashなりbatなりでtestが通ったらmasterにcommit/push/merge&topic branchのdelete; 通らないならdev/hotfixのbranchにcommit/push みたいなことはできるんじゃなかろうか。いや分からんけど。



_3. について
gitlabにpushしてもbuildでコケる。ローカルでは上手くいく。 何度もpushするのは面倒だし、gitlab上のdockerで何が起きているのかを逐一echoしようかと思ったら上手くできなかったり。そもそもechoで色々知れてもpushを繰り返すことになりそう。 なのでローカルのdockerにgitを入れてgitlabからcloneしてbuildなりtestなりして調べることにした。

そしてcmakeのバージョンの差異が原因の1つだとわかった。 apt/apt-getでubuntu:18.04やdebianがインストールするcmakeはcmake 3.7 (?)で、ローカルのcmakeは3.15。
(今調べたら とりあえずubuntu18.04のcmakeは3.10.2みたいだ。
記憶違いかもしれない。debianubuntuとcmakeのバージョンは同じだった気がするので3.10.2かもしれない?)

cmakeにはいろんな書き方があるらしい。
そしてsetや謎の変数${...}を多用する比較的古い書き方を回避できるらしいのも調べるうちに分かったのでなるべく新しい書き方にすることにして作業を進めていた。
情報が少ないのでかなりしんどかったけれど、古い書き方よりもCMakeLists.txtを書くのは楽だった。すっきりしてるように感じる。

そして取り入れた新しい書き方の1つにCMP0076の使用があった。
( CMakeとIDEを連携させる - Qiita

CMP0076 — CMake 3.13.5 Documentation )

残念ながらubuntuでデフォルトで入るcmakeは3.13に満たないので落ちていたらしい。 curlでcmake 3.15をDLしてtar, make, configureして...これでbuildは通るようになった。 代わりにgitlab上でのbuild時間は一気に伸びてしまった。 新しいcmakeを使えるようにするこの工程は時間をかなり食うらしい。
もうこの時点でサクサク開発するのとはかけ離れている。 cacheとかで回避できるんだろうか。



_4. について
考えてみれば当たり前の話なのだろうけど、BoostTestリポジトリだけclone/submoduleしても動かない。 残念ながら”とりあえず試してみよう”というタイミングでこれに気づくことはできなかった。
ローカルにはBoostがあるから足りない分は多分そっちで解決されたのだろう。 確かにCMakeLists.txt書いているときにUITESTの設定と比べてなんかDirectoryの設定が少し雑でも許されるなぁ?とは思っていた。

BoostTestを使うならローカルに持っておいてそれを参照するようにする。 それでgitの管理に含めないのが想定された使用法なんだろうなぁと思った。 IUTESTもそうできるんだろうけど、今回はgitlabのCIでtestする+ヘッダオンリーの手軽さが重要だったので考えなかった。





次に似たようなことをやるならこれ参考にしたい。 カバレッジも出したい。 ローカルでtestしてその結果使ってgitlab/githubカバレッジ見るとかもできそう?

www.slideshare.net