CMake, C++ et Jenkins/intégration Continue
J'ai un cmake exemple de projet que je voudrais construire sur Jenkins en cours d'exécution sur Ubuntu 15.10. J'ai installé:
https://wiki.jenkins-ci.org/display/JENKINS/CMake+Plugin
Et créé deux étapes de génération:
- Lancer cmake pour générer des makefiles
- Exécuter faire tous les à partir de la génération dir
Je fonctionne:
[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
Mais est-ce l'approche recommandée pour l'utilisation de cmake dans un IC/Jenkins installation?
Actuellement mon cmake/Jenkins build sur chaque push; 1) générer des makefiles, 2) construire le projet.
Je suis un peu inquiet que la première étape 1) générer des makefiles mange moment de la construction et il ne semble pas vraiment optimal pour faire de cette étape sur chaque poussée. Surtout depuis que je ne prévois pas de changer CMakeLists.txt fichiers souvent, mais quand ils changent de nouveaux fichiers générés doivent bien sûr être utilisé.
Est l'approche ci-dessus commun des pratiques que je viens de vous habituer ou ai-je raté quelque chose?
Oui c'est aussi mon problème, mieux vaut prévenir que guérir, une solution serait de faire en sorte de briser ma demande dans les plus petites parties rapides quand il grandit. Regading les deux construire les étapes ci-dessus, 1) cmake/générer, 2) faire tout il y a une certaine manière de le faire que dans le cadre de la génération de code à l'étape? Ou sont-ils complètement indépendants et doivent être traités comme tels?
Je ne suis pas tout à fait sûr de ce que vous demandez. Mon attitude en général, est "d'aller avec la solution la plus simple qui suffit à résoudre le problème actuel", et de ne pas compliquer quelque chose jusqu'à ce que vous avez réellement une bonne raison. - Je exécuter trois emplois différents sur mon Jenkins système (à la maison): "Construire + exécuter tous les tests avec clang++", "Build + exécuter tous les tests avec g++" - ces de vérifier toutes les 15 minutes pour les nouveaux commits dans le repo git, et la troisième est de télécharger la version de LLVM et mon code, et de le construire, tous ensemble, basé sur un script de compilation dans le projet - une fois la nuit.
À partir de l'écran ci-dessus, j'ai deux etapes de construction: 1: générer des makefiles, 1: exécuter la commande make. Je me demandais juste si cela peut être fait en une seule étape et si cmake a quelques postes de commande de l'étape pour faire le construire après les fichiers ont été générés.
Semble, de ce que vous devez faire à la fois de toute façon. Le seul avantage d'avoir deux parties est de savoir si elle prend assez longtemps que, à partir d'une autre génération de code avant la fin du test, ou quelque chose du genre.
OriginalL'auteur u123 | 2016-02-27
Vous devez vous connecter pour publier un commentaire.
Oui, vous pouvez le faire en une seule étape.
Par exemple, dans mon Jenkins, de l'environnement, lors de la construction de l'Ubuntu emplois-je utiliser le CMake plugin pour l'ensemble de la compilation, il permet de multiples outils de construction des invocations.
Ma capture d'écran en bas de ce post est de CMake étape dans un travail (j'utilise Ninja au lieu de Unix Makefiles, mais l'effet est le même).
J'utilise deux construire des invocations:
ninja
oumake
dans un shell,DESTDIR=. ninja install
.Si je voulais construire des cibles supplémentaires à partir de la makefiles, je pourrais juste ajouter des invocations à cette étape.
Notez que votre capture d'écran, vous avez un vide invocation dans la configuration. Ce sera déjà l'appel de
make
, et comme l'a confirmé par votre journal de production, vous êtes en fait la compilation de votre projet à deux reprises, en raison de votre appel manuel demake all
dans l'étape suivante.Vous pouvez retirer votre coque étape et votre projet doit encore se construire.
Concernant votre question sur les meilleures pratiques et la régénération de CMake, je vous renvoie à cet article sur Jenkins Meilleures Pratiques, où il est dit:
Noter que j'ai aussi vérifier la "nouvelle génération" dans mon CMake étape, de sorte que l'ensemble de CMake espace de travail est effacé et le projet est généré à partir de zéro pour chaque génération. Ceci assure il n'y a pas les problèmes causés par rassis variables de cache, etc.
Capture d'écran d'une CMake étape dans l'un de mes travaux:
OriginalL'auteur badgerr
Je ne suis même pas sûr que vous besoin de ce plugin. AFAIR le plugin page web, il est utile uniquement si vous souhaitez jenkins spécifiques à utiliser cmake version, ou si vous voulez une interface graphique pour lesquels les variables cmake vous pouvez définir. Je viens d'exécuter cmake à partir de la ligne de commande.
Pour votre deuxième partie de la question, Si vous modifiez CMakeLists.txt le Makefile de nouveau automatiquement cmake, donc, à proprement parler, il n'est pas nécessaire de lancer cmake à chaque fois. Mais de l'autre côté de cmake, la configuration est assez rapide et le plus probable, prend moins de temps que la compilation.
make
ou que ce soit à partir de la ligne de commande? Ce serait bien si tu pouvais étoffer avec quelques références.OriginalL'auteur arved