web-dev-qa-db-ja.com

CMake、C ++、Jenkins /継続的インテグレーション

Ubuntu 15.10で実行されているJenkins上に構築したいCMakeサンプルプロジェクトがあります。インストールしました:

https://wiki.jenkins-ci.org/display/JENKINS/CMake+Plugin

そして、2つのビルドステップを作成しました。

  1. CMakeを実行してメイクファイルを生成する
  2. ビルドディレクトリからmake allを実行します

enter image description here

それはうまくいきます:

[build] $ cmake -G "Unix Makefiles" -D CMAKE_BUILD_TYPE=Debug /var/lib/jenkins/workspace/cmake-test/cmake-gtest/src
-- Configuring done
-- Generating done
-- Build files have been written to: /var/lib/jenkins/workspace/cmake-test/cmake-gtest/build
[build] $ /usr/bin/make
[  4%] Built target libfoo
[  9%] Built target libbar
[ 14%] Built target myApp
[ 52%] Built target gmock
[ 90%] Built target gtest
[100%] Built target testfoo
[cmake-test] $ /bin/sh -xe /tmp/hudson1792271459427590561.sh
+ cd cmake-gtest/build
+ make all
[  4%] Built target libfoo
[  9%] Built target libbar
[ 14%] Built target myApp
[ 52%] Built target gmock
[ 90%] Built target gtest
[100%] Built target testfoo
Finished: SUCCESS

しかし、これはCI/JenkinsセットアップでCMakeを使用するための推奨アプローチですか?

現在、CMake/Jenkinsビルドはプッシュごとに作成されます。 1)メイクファイルを生成し、2)プロジェクトをビルドします。

最初のステップ1)makefileの生成がビルド時間を消費することを少し心配していますが、各プッシュでこのステップを実行することは実際には最適ではないようです。特に、CMakeLists.txtファイルを頻繁に変更することは期待していませんが、新しく生成されたファイルを変更する場合は、もちろん使用する必要があります。

上記のアプローチは、慣れる必要がある一般的な方法ですか、それとも見逃したものですか?

11
u123

はい、1つのステップで実行できます。

たとえば、私のJenkins環境では、Ubuntuジョブをビルドするときに、コンパイル全体でCMakeプラグインを使用します。これにより、複数のビルドツールを呼び出すことができます。

この投稿の下部にある私のスクリーンショットは、ジョブのCMakeステップです(私はUnix Makefileの代わりにNinjaを使用していますが、効果は同じです)。

私は2つのビルド呼び出しを使用します。

  • 空白-シェルでninjaまたはmakeを呼び出すのと同じです。
  • Install-DESTDIR=. ninja installを呼び出すのと同じです。

メイクファイルから追加のターゲットを構築したい場合は、このステップに呼び出しを追加するだけで済みます。

スクリーンショットでは、構成に空白の呼び出しがあることに注意してください。これはすでにmakeを呼び出しており、ログ出力で確認されているように、次の手順でmake allを手動で呼び出しているため、実際にはプロジェクトを2回コンパイルしています。

シェルステップを削除しても、プロジェクトは引き続きビルドされます。


ベストプラクティスとCMakeの再生成に関する質問については、 Jenkinsのベストプラクティス に関するこの記事を参照してください。

ビルドを再現可能にするには、ビルドがクリーンなビルドである必要があります。クリーンビルドは、完全にソースコード管理からビルドされます。このプラクティスは、サードパーティのjar、ビルドスクリプト、リリースノートなどを含むすべてのコードをソースコード管理にチェックインする必要があることも意味します。

CMakeステップで「Clean Build」もチェックしているので、CMakeワークスペース全体が消去され、プロジェクトがビルドごとにゼロから生成されることに注意してください。これにより、古いキャッシュ変数などによって引き起こされる問題がなくなります。

私の仕事の1つにおけるCMakeステップのスクリーンショット: Jenkins/CMake config

6
badgerr

このプラグインが必要かどうかさえわかりません。プラグインWebページのAFAIRは、Jenkinsに特定のCMakeバージョンを使用させたい場合、またはCMake変数を設定したいGUIが必要な場合にのみ役立ちます。コマンドラインからCMakeを実行するだけです。

質問の2番目の部分であるCMakeLists.txtを変更すると、Makefileが自動的にCMakeを再実行するため、厳密に言えば、毎回CMakeを実行する必要はありません。しかし、反対に、CMakeの構成は非常に高速であり、コンパイルよりも時間がかかりません。

0
arved