Difference between revisions of "Jenkins/fr"

From Lazarus wiki
(Created page with "{{Jenkins}} = Généralités = Jenkins est un serveur d'intégration continue qui peut être utilisé pour construire automatiquement et tester des projets basé sur des comm...")
 
m (Tests FPCUnit/DBTestframework avec une sortie en base de données)
 
(16 intermediate revisions by the same user not shown)
Line 2: Line 2:
  
 
= Généralités =
 
= Généralités =
Jenkins est un serveur d'intégration continue qui peut être utilisé pour construire automatiquement et tester des projets basé sur des commits vers votre gestionnaire de version.
+
[https://fr.wikipedia.org/wiki/Jenkins_(logiciel) Jenkins] est un serveur d'intégration continue qui peut être utilisé pour construire automatiquement et tester des projets basé sur des commits vers votre gestionnaire de version.
  
 
Cet article décrit comment installer/régler Jenkins pour construire automatiquement FPC quand un commit survient dans SVN. Vous pouvez bien sûr adapter des instructions à vos propres projets.
 
Cet article décrit comment installer/régler Jenkins pour construire automatiquement FPC quand un commit survient dans SVN. Vous pouvez bien sûr adapter des instructions à vos propres projets.
Line 12: Line 12:
  
 
= Réglage du compilateur de ressource =
 
= Réglage du compilateur de ressource =
* * * A FINIR  * * *
+
Au moins les paquets Debian FPC n'installent pas un [[Lazarus_Resources/fr#FPC_resources|compilateur de ressource]], qui est demandé dans la section ci-dessous.
At least the Debian FPC packages don't install a [[Lazarus_Resources#FPC_resources|resource compiler]], which is needed in sections below:
 
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
# Get resource compiler, not provided by fpc 2.6 packages:
 
# Get resource compiler, not provided by fpc 2.6 packages:
Line 21: Line 20:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
= Database driver setup =
+
= Réglage du pilote de base de données =
For testing database connections/writing results to databases, make sure the relevant operating system database drivers/client connection libraries are installed, e.g.:
+
Pour tester les connections de base de données/l'écriture des résultats dans les base de données, assurez-vous que les pilotes de base de données du système d'exploitation/pilotes de connexion pertinents sont installés, p.ex. :
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
apt-get install libfbembed2.5 firebird2.5-super firebird2.5-dev \
 
apt-get install libfbembed2.5 firebird2.5-super firebird2.5-dev \
Line 35: Line 34:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
= Setting up jobs =
+
= Réglages des travaux =
Use the job screen to set the svn source to the FPC trunk or branch you want to use (e.g. http://svn.freepascal.org/svn/fpc/trunk)
+
Utilisez l'écran de travail par lot pour définir la source svn du tronc FPC ou la branche que vous voulez utiliser (p.ex. http://svn.freepascal.org/svn/fpc/trunk).
  
Set 'use svn update as much as possible'
+
Définissez 'Use svn update as much as possible'.
  
Polling every 5 minutes could be a good setup. Alternatively, you can set up your own SVN server and write a commit hook script for that. This would result in this entry:
+
La scrutation (''polling'') toutes les 5 minutes pourrait être un bon réglage. De manière alternative, vous pouvez définir votre propre serveur SVN et écrire un ''commit hook script'' pour cela. Cela amènera à cette entrée :
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
# every 20 minutes
 
# every 20 minutes
Line 46: Line 45:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
= Background: the regular build & problems =
+
= Tâche de fond : la construction normale & problèmes =
{{Note|This section is included for completeness; problems with system wide fpc.cfg and current FPC trunk (October 2012) may make using fpcup much easier. See below for that.}}
+
{{Note|Cette section est incluse pour la complétude ; les problèmes avec le fpc.cfg global au système et le tronc courant FPC (oct. 2012) peut rendre l'utilisation de fpcup plus facile. Voir plus bas pour cela.}}
  
== Stable FPC setup ==
+
== Réglage de FPC stable ==
Install binutils+resource compiler+stable FPC - for some reason the debian packages don't pull in the required dependencies:
+
Installez les binutils + le compilateur de ressource + FPC stable - pour quelques raison, les paquets debian ne tirent pas les dépendances requises :
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
apt-get install build-essential mingw32-binutils
 
apt-get install build-essential mingw32-binutils
Line 89: Line 88:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Jenkins build commands ==
+
== Commandes de construction de Jenkins ==
As build commands in Jenkins, you could use the shell commnds
+
Comme commandes de construction dans Jenkins, vous pourriez utiliser les commandes shell :
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
make all
 
make all
 
</syntaxhighlight>
 
</syntaxhighlight>
and, to install inside the "workspace" or top of the build directory environment:
+
et, pour installer dans l'"espace de travail" ou au sommet de l'environnement du répertoire de construction (''build directory environment'') :
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
make install PREFIX=$WORKSPACE
 
make install PREFIX=$WORKSPACE
 
</syntaxhighlight>
 
</syntaxhighlight>
Note: installing somewhere else may be a good idea, please refer to the Build FAQ.
+
Note : l'installation quelque part ailleurs pourrait être une bonne idée, veuillez vous reporter à FAQ de construction.
  
Make install does not generate an fpc.cfg for you; you have to do that yourself:
+
Make install ne génére pas un  does fpc.cfg pour vous ; vous devez le faire vous-mêmes :
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
$WORKSPACE/bin/fpcmkcfg -o $WORKSPACE/bin/fpc.cfg
 
$WORKSPACE/bin/fpcmkcfg -o $WORKSPACE/bin/fpc.cfg
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== A problem: /etc/fpc.cfg ==
+
== Un problème : /etc/fpc.cfg ==
The stable we compiled using packages works, but puts an fpc.cfg into the /etc directory. This fpc.cfg is picked up by default and there is no way to disable that unless you e.g. call a script fpc.sh as your compiler instead of the fpc executable. This script passes options to the real compiler so it ignores /etc/fpc.cfg
+
La version stable que nous compilons en utilisant des paquets fonctionne, mais elle pose un fpc.cfg dans le répertoire /etc. Ce fpc.cfg est ramassé par défaut et il n'y a aucun moyen de le désactiver à moins que vous par exemple n'appeliez un script fpc.sh en tant que votre compilateur au lieu de l'exécutable fpc. Ce script passe les options au compilateur réel ainsi il ignore /etc/fpc.cfg.
  
This will give problems with running e.g. the compiler test suite. These problems may be solved by:
+
Cela donnera des problèmes à l'exécution p.ex. la suite de test du compilateur. Ces problèmes pourront être résolus en :
* use an PPC_CONFIG_PATH environment variable or fpc.cfg in home dir, which may work.
+
* utilisant une variable d'environnement PPC_CONFIG_PATH ou un fpc.cfg dans le répertoire d'accueil, ce qui pourrait marcher.
* perhaps a simpler solution is just not to install FPC/FPC sources, but only download a bootstrap compiler. Therefore no fpc.cfg, and no problem. Bonus is that we build it closer to the "official way". (which is a full install of the previous release)
+
* peut-être qu'une solution plus simple est de ne pas installer FPC/les sources de FPC, mais de télécharger un compilateur bootstrap. Ainsi aucun fpc.cfg et pas de problème. Le bonus est que nous le construisons de manière plus proche de la "version officielle" (qui est toujours une installation complète de la précédente version).
  
To work around is, you can also use fpcup; see the next section.
+
Pour contourner cela, vous pouvez utiliser fpcup ; voir la prochaine section.
  
== A problem: make clean ==
+
== Un problème : make clean ==
Current (October 2012) FPC trunk does not clean all relevant files when running make clean/make distclean.
+
Le tronc actuel de FPC (octobre 2012) ne nettoie pas tous les fichiers significatifs en exécutant make clean/make distclean.
  
= Solution: getting FPC using fpcup =
+
= Solution : obtenir un FPC utilisant fpcup =
The [[Projects_using_Lazarus#fpcup|fpcup]] tool can download and install FPC and Lazarus from scratch (no starting compiler needed), so a solution could be:
+
L'outil [[Projects_using_Lazarus#fpcup|fpcup]] peut télécharger et installer FPC et Lazarus à partir de rien (ne demande pas de compilateur de départ), aussi une solution pourrait être de :
* get fpcup into your workspace
+
* placer fpcup dans votre espace de travail
* change build steps to call fpcup with --only=fpc --fpcrevision=$SVN_REVISION
+
* modifier les étapes de construction pour appeler fpcup avec --only=fpc --fpcrevision=$SVN_REVISION
We could have run fpcup so it downloads the latest SVN version, but then we lose the integration with subversion.
 
  
Make sure you have a resource compiler (see installation section above).
+
Nous aurions pu lancer fpcup pour qu'il télécharge la dernière version de SVN, mais nous perdons l'intégration avec subversion.
Download fpcup (bitness should match your Jenkins machine). Put e.g. fpcup_linux_x86 in your /usr/local/bin directory, then:
+
 
 +
Assurez-vous que vous avez un compilateur de ressource (vois la section d'installation du dessus).
 +
Téléchargez fpcup (la largeur, 32bit/64bit doit correspondre avec celle de la machine jenkins). Posez p.ex. fpcup_linux_x86 dans votre répertoire /usr/local/bin, ensuite :  
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
chmod ugo+rx /usr/local/bin/fpcpup_linux_x86
 
chmod ugo+rx /usr/local/bin/fpcpup_linux_x86
 
</syntaxhighlight>
 
</syntaxhighlight>
(If using an x64 Linux, naming will obviously differ)
+
(Si utilisation d'un Linux x64, le nommage peut évidemment différer)
  
Then set your build steps like this. Note: we could have used one big shell script, but the advantage of putting the commands in execute shell commands is that the build will stop on the first error (non-zero exit status) encountered; you'd have to build that error detection into a script.
+
Ensuite configurez vos étapes de construction comme ceci. Note : Nous pourrions avoir utilisé un gros script shell, mais l'avantage de mettre les commandes dans les commandes d'exécution shell est que la construction s'arrêtera sur la première erreur (statut de sortie non nul) rencontrée ; vous auriez à détecter les erreurs dans un script.
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
Line 137: Line 137:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Download/install using fpcup. Note it gets the SVN URL and desired revision ID from environment variables set by the Jenkins SVN plugin. Once again, adjust if you don't use x86 Linux.
+
Téléchargez/installer en utilisant fpcup. Note : il obtient l'URL SVN et l'ID révision désirée depuis des variables d'environnement définies par le plugin SVN de Jenkins. Une fois de plus, ajustez si vous n'utilisez pas un Linux x86.
 +
 
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
/usr/local/bin/fpcup_linux_x86 --fpcbootstrapdir=$WORKSPACE/fpcbootstrap --fpcdir=$WORKSPACE --fpcuplinkname= --fpcURL=$SVN_URL --fpcrevision=$SVN_REVISION --keeplocalchanges --lazdir=$WORKSPACE/lazarus --lazlinkname= --logfilename=$WORKSPACE/fpcup.log --noconfirm --primary-config-path=$WORKSPACE/lazarusconfig --only=fpc
 
/usr/local/bin/fpcup_linux_x86 --fpcbootstrapdir=$WORKSPACE/fpcbootstrap --fpcdir=$WORKSPACE --fpcuplinkname= --fpcURL=$SVN_URL --fpcrevision=$SVN_REVISION --keeplocalchanges --lazdir=$WORKSPACE/lazarus --lazlinkname= --logfilename=$WORKSPACE/fpcup.log --noconfirm --primary-config-path=$WORKSPACE/lazarusconfig --only=fpc
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Now check the fpc output in another build step. Note that fpcup uses a custom fpc.sh script to avoid problems with systemwide fpc.cfg. Once again, adjust if not on Linux x86.
+
Maintenant vérifiez la sortie FPC dans une autre étape de construction. Remarquez que fpcup utilise un script fpc.sh personnalisé pour éviter des problèmes avec un fpc.cfg global au système. Une fois de plus, ajustez si vous n'utilisez pas un Linux x86.
 +
 
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
$WORKSPACE/bin/i386-linux/fpc.sh -iD; $WORKSPACE/bin/i386-linux/fpc.sh -iW #get FPC version output to check if it was built correctly
 
$WORKSPACE/bin/i386-linux/fpc.sh -iD; $WORKSPACE/bin/i386-linux/fpc.sh -iW #get FPC version output to check if it was built correctly
 
</syntaxhighlight>
 
</syntaxhighlight>
  
The last build step runs the "compiler test suite".
+
La dernière étape de construction fait exécuter la "suite de test du compilateur".
 +
 
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
cd $WORKSPACE/tests; make all TEST_FPC=$WORKSPACE/bin/i386-linux/fpc.sh #make full doesn't work, can't delete file
 
cd $WORKSPACE/tests; make all TEST_FPC=$WORKSPACE/bin/i386-linux/fpc.sh #make full doesn't work, can't delete file
 
</syntaxhighlight>
 
</syntaxhighlight>
You could archive the test suite results using a Jenkins post-build step.
+
Vous pourrez archiver les résultats de la suite de test en utilisant une étape post-construction de Jenkins.
  
= FPCUnit/DBTestframework tests with database output =
+
= Tests FPCUnit/DBTestframework avec une sortie en base de données =
If you want to run the [[Databases#Running_FPC_database_tests|dbtestframework]] tests and output the results to a separated database server, you can use the testdbwriter programs. This lets you compare runs from various revisions - which are automatically built by Jenkins.
+
Si vous voulez exécuter les tests de [[Databases/fr#Ex.C3.A9cution_de_tests_de_bases_de_donn.C3.A9es_de_FPC|dbtestframework]] et sortir les résultats vers un serveur de base de données séparé, vous pouvez utiliser les programmes testdbwriter. Il vous laisse comparer les exécutions de diverses révisions - qui sont automatiquement construites par Jenkins.
  
This method of outputting test results to databases can also be used by other projects that use fpcunit tests - you'd have to use the testdbwriter listener and adjust the console runner to include that.
+
Cette méthode de sortie des résultats de test vers des bases de données peut aussi être utilisée par d'autres projets qui utilisent les tests fpcunit - vous auriez à utiliser l'écouteur testdbwriter et à ajuster le console runner pour inclure cela.
  
Though this section contains a fair amount of setup, fortunately it is once only; each job will reuse the existing configuration.
+
Bien que cette section contienne une bonne quantité de réglages, c'est heureusement fait une fois pour toutes ; chaque tâche réutilisera la configuration existante.
  
You could of course also run the normal dbtestframework code with output to plain text or XML.  
+
Vous pourrez bien sûr aussi exécuter le code normal de dbtestframework avec une sortie en texte brut ou en XML.
 +
Vérifiez si Mercurial/hg est installé :
  
Check if mercurial/hg is installed:
 
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
hg --help
 
hg --help
 
</syntaxhighlight>
 
</syntaxhighlight>
if not install it, e.g. <syntaxhighlight lang="bash">apt-get install mercurial</syntaxhighlight>
+
Sinon, installez-le, p.ex.  
 
+
<syntaxhighlight lang="bash">
Get the repository version into a fixed directory:
+
apt-get install mercurial
 +
</syntaxhighlight>
 +
Obtenez la version du référentiel dans un répertoire défini :
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
mkdir -p /opt/testdbwriter
 
mkdir -p /opt/testdbwriter
Line 179: Line 184:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Database setup ==
+
== Réglage de la base de données ==
Now the files in this directory can be used to compile the test program with the FPC in each build. We will also need to setup our database connections.
+
Maintenant les fichiers dans ce répertoire peuvent être utilisés pour compiler le programme de tests avec le FPC dans chaque construction. Nous aurons aussi besoin de configurer notre connexion de base de données.
 +
 
 +
=== Bases de données testées ===
 +
D'abord, considérons les bases de données sur lesquelles les tests tourneront. Veuillez créer une base de données vide (ou au moins une dans laquelle le test utilisateur peut se débattre (''thrash'')) sur chaque serveur de base de données que vous voulez tester et avoir un nom d'utilisateur et un mot de passe prêts.
  
=== Tested databases ===
+
Ensuite, éditez le database.ini, utilisé par les test du framework db test (voir l'[[Databases/fr#Ex.C3.A9cution_de_tests_de_bases_de_donn.C3.A9es_de_FPC|exécution de tests de bases de données de FPC]].
First the databases where the tests will run on. Please create an empty database (or at least one that the test user can thrash) on each db server that you want to test, and have a username and password ready.
 
  
Then edit database.ini, used by the db test framework tests (see [[Databases#Running_FPC_database_tests]]
 
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
cd /opt/testdbwriter/dbtests2db
 
cd /opt/testdbwriter/dbtests2db
Line 193: Line 199:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== Test results database ===
+
=== Résultats de test de la base de données ===
Now the database where the results should go to.  
+
Maintenant la base de données où les résultats pourraient aller.
  
Set up a database with the instructions pointed to in the readme.txt file (e.g. use the ''testdbwriter.sql'' for Firebird/Interbase databases and ''testdbwriter_postgresql.sql'' for PostgreSQL databases).
+
Configurez une base de données avec les instructions soulignées dans le fichier readme.txt (p.ex. utilisez le ''testdbwriter.sql'' pour les bases de données Firebird/Interbase et ''testdbwriter_postgresql.sql'' pour les bases de données PostgreSQL).
  
Now edit the ini file:
+
Maintenant éditez le fichier ini :
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
cd /opt/testdbwriter/dbtests2db
 
cd /opt/testdbwriter/dbtests2db
Line 206: Line 212:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Adding the tests to your Jenkins job ==
+
== Ajout des tests à votre lot de travail Jenkin ==
 +
* * * A FINIR  * * *
 
We'll put the dbtests2db.lpr console runner and the db output writer code it needs (testdbwriter.pas) into the directory where the dbtestframework tests live so dbtests2db can pick up those tests.
 
We'll put the dbtests2db.lpr console runner and the db output writer code it needs (testdbwriter.pas) into the directory where the dbtestframework tests live so dbtests2db can pick up those tests.
 
Then we'll compile the test suite, and run it for each database you want to test.
 
Then we'll compile the test suite, and run it for each database you want to test.
Line 271: Line 278:
 
If this works, you can see the test results on your database server, analyze regressions, test succcess percentages, etc.
 
If this works, you can see the test results on your database server, analyze regressions, test succcess percentages, etc.
  
= Windows/Linux... build slave =
+
= Windows/Linux... construire l'esclave =
You can set up other machines apart from the Jenkins server to act as "slaves": they are controlled from Jenkins and used to run jobs.
+
Vous pouvez configurer d'autres machines en dehors du serveur Jenkins pour agir comme des "esclaves" : elles sont contrôlées par Jenkins et utilisées pour exécuter des tâches.
 +
 
 +
Ceci peut être utile lors de l'exécution d'un construction/test Windows depuis un serveur Linux.
  
This can be useful when running a Windows build/test run from a Linux server.
+
Voir [https://wiki.jenkins-ci.org/display/JENKINS/Windows+slaves+fail+to+start+via+DCOM] pour des détails sur comment configurer des esclaves de construction Windows via DCOM (note : il y a d'autres façons pour configurer des esclaves de construction (Windows) ; veuillez vous référer à la documentation Jenkins).
  
See [https://wiki.jenkins-ci.org/display/JENKINS/Windows+slaves+fail+to+start+via+DCOM] for details on how to set up Windows build slaves via DCOM (note: there are other ways to set up (Windows) build slaves; please refer to the Jenkins documentation)
+
= Améliorations =
 +
Améliorations possibles :
 +
* exécuter make install dans un préfixe différent
 +
* exécuter une compilation Lazarus
 +
* enregistrer les résultats dbtests2db en XML, voir si Jenkins prend en charge cela.
 +
* ajouter un installateur de constructeurs
  
= Enhancements =
+
= Dépannage =
Possible enhancements:
 
* run make install into a different prefix
 
* run Lazarus compile
 
* save dbtests2db results to XML, see if Jenkins supports that
 
* add installer builders
 
  
= Troubleshooting =
+
== Echecs de construction ==
 +
Vos constructions peuvent échouer parce que l'utilisateur Jenkins exécute un shell différent sous un utilisateur différent avec un chemin d'accès différent de celui que vous attendiez.
  
== Build fails ==
+
== Découvrez quel utilisateur travaille sous Jenkins ==
Your builds may fail because the user Jenkins runs under runs a different shell under a different user with a different path than you might expect.
+
Si vous rencontrez des problèmes avec les scripts/commandes shell dans les travaux ne disposant pas d'autorisations, il est utile de connaître l'utilisateur sous lequel Jenkins s'exécute.
  
== Find out which user Jenkins runs under ==
+
Essayez cette commande (ou bien sûr la documentation) :
If you have problems with scripts/shell commands in jobs not having permissions, it helps if you know which user Jenkins runs under.
 
Try this command (or of course the documentation):
 
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
ps aux |grep jenkins | grep -v grep | cut -d" " -f1 | uniq #perhaps only works if jenkins is running a job
 
ps aux |grep jenkins | grep -v grep | cut -d" " -f1 | uniq #perhaps only works if jenkins is running a job
 
</syntaxhighlight>
 
</syntaxhighlight>
On Debian, it gives the tomcat6 user.
+
Sur Debian, il donne l'utilisateur tomcat6.

Latest revision as of 06:46, 27 October 2017

English (en) français (fr)

Généralités

Jenkins est un serveur d'intégration continue qui peut être utilisé pour construire automatiquement et tester des projets basé sur des commits vers votre gestionnaire de version.

Cet article décrit comment installer/régler Jenkins pour construire automatiquement FPC quand un commit survient dans SVN. Vous pouvez bien sûr adapter des instructions à vos propres projets.

Réglage de Jenkins

Une version possible à utiliser est Turnkey Linux Jenkins sur Debian 6.0.5 (Squeeze) ; cette article est testé avec Jenkins 1.464.

De quelques façon que vous installiez Jenkins, assurez-vous que le plugin SVN est activé.

Réglage du compilateur de ressource

Au moins les paquets Debian FPC n'installent pas un compilateur de ressource, qui est demandé dans la section ci-dessous.

# Get resource compiler, not provided by fpc 2.6 packages:
apt-get install mingw32-binutils
# symlink:
ln -s /usr/bin/i586-mingw32msvc-windres /usr/bin/windres

Réglage du pilote de base de données

Pour tester les connections de base de données/l'écriture des résultats dans les base de données, assurez-vous que les pilotes de base de données du système d'exploitation/pilotes de connexion pertinents sont installés, p.ex. :

apt-get install libfbembed2.5 firebird2.5-super firebird2.5-dev \
postgresql-client libpq-dev \
freetds-bin freetds-dev \
mysql-client libmysqlclient-dev \
libsqlite3-0 libsqlite3-dev \
unixodbc unixodbc-dev tdsodbc #adjust to taste/distribution
# we install the -dev packages so we get the correct driver names for older FPC versions (e.g. libfbclient.so.2.5 instead of libfbclient). Alternatively: symlink these or specify explicit .so names in any code using databases
#freetds should pull in unixodbc, but we specify it explicitly.
#Strangely, on Debian, we need to explicilty specify tdsodbc to get the actual FreeTDS ODBC driver!?

Réglages des travaux

Utilisez l'écran de travail par lot pour définir la source svn du tronc FPC ou la branche que vous voulez utiliser (p.ex. http://svn.freepascal.org/svn/fpc/trunk).

Définissez 'Use svn update as much as possible'.

La scrutation (polling) toutes les 5 minutes pourrait être un bon réglage. De manière alternative, vous pouvez définir votre propre serveur SVN et écrire un commit hook script pour cela. Cela amènera à cette entrée :

# every 20 minutes
*/20 * * * *

Tâche de fond : la construction normale & problèmes

Note-icon.png

Remarque: Cette section est incluse pour la complétude ; les problèmes avec le fpc.cfg global au système et le tronc courant FPC (oct. 2012) peut rendre l'utilisation de fpcup plus facile. Voir plus bas pour cela.

Réglage de FPC stable

Installez les binutils + le compilateur de ressource + FPC stable - pour quelques raison, les paquets debian ne tirent pas les dépendances requises :

apt-get install build-essential mingw32-binutils
# now make an easier name for the resource compiler; adjust to your specific version
# you could also adjust -FC<resourcecompilername> in /etc/fpc.cfg
ln -s /usr/bin/i586-mingw32msvc-windres /usr/bin/windres

#fpc would get old FPC 2.4 on this Debian Squeeze=> symptom in Jenkins build log: 
#generic.inc(2505,13) Fatal: Internal error 8
#Fatal: Compilation aborted
#make[7]: *** [system.ppu] Error 1

#get stable compiler (2.6 at time of writing); we're on a 32 bit system:
cd /root
wget http://sourceforge.net/projects/freepascal/files/Linux/2.6.0/deb/fp-compiler-2.6.0_2.6.0-0_i386.deb/download
mv download fp-compiler-2.6.0_2.6.0-0_i386.deb
wget http://sourceforge.net/projects/freepascal/files/Linux/2.6.0/deb/fp-compiler_2.6.0-0_i386.deb/download
mv download fp-compiler_2.6.0-0_i386.deb
wget http://sourceforge.net/projects/freepascal/files/Linux/2.6.0/deb/fp-units-rtl_2.6.0-0_i386.deb/download
mv download fp-units-rtl_2.6.0-0_i386.deb
wget http://sourceforge.net/projects/freepascal/files/Linux/2.6.0/deb/fp-units-rtl-2.6.0_2.6.0-0_i386.deb/download
mv download fp-units-rtl-2.6.0_2.6.0-0_i386.deb
wget http://sourceforge.net/projects/freepascal/files/Linux/2.6.0/deb/fp-units-i386-2.6.0_2.6.0-0_i386.deb/download
mv download fp-units-i386-2.6.0_2.6.0-0_i386.deb
wget http://sourceforge.net/projects/freepascal/files/Linux/2.6.0/deb/fp-units-i386_2.6.0-0_i386.deb/download
mv download fp-units-i386_2.6.0-0_i386.deb
wget http://sourceforge.net/projects/freepascal/files/Linux/2.6.0/deb/fp-utils-2.6.0_2.6.0-0_i386.deb/download
mv download fp-utils-2.6.0_2.6.0-0_i386.deb
wget http://sourceforge.net/projects/freepascal/files/Linux/2.6.0/deb/fp-utils_2.6.0-0_i386.deb/download
mv download fp-utils_2.6.0-0_i386.deb

dpkg -i fp-units-rtl-2.6.0_2.6.0-0_i386.deb
dpkg -i fp-units-rtl_2.6.0-0_i386.deb
dpkg -i fp-compiler-2.6.0_2.6.0-0_i386.deb
dpkg -i fp-utils-2.6.0_2.6.0-0_i386.deb
#no idea what the other .debs are for that we downloaded
#todo: this could be trimmed down a bit, but this seems to work

Commandes de construction de Jenkins

Comme commandes de construction dans Jenkins, vous pourriez utiliser les commandes shell :

make all

et, pour installer dans l'"espace de travail" ou au sommet de l'environnement du répertoire de construction (build directory environment) :

make install PREFIX=$WORKSPACE

Note : l'installation quelque part ailleurs pourrait être une bonne idée, veuillez vous reporter à FAQ de construction.

Make install ne génére pas un does fpc.cfg pour vous ; vous devez le faire vous-mêmes :

$WORKSPACE/bin/fpcmkcfg -o $WORKSPACE/bin/fpc.cfg

Un problème : /etc/fpc.cfg

La version stable que nous compilons en utilisant des paquets fonctionne, mais elle pose un fpc.cfg dans le répertoire /etc. Ce fpc.cfg est ramassé par défaut et il n'y a aucun moyen de le désactiver à moins que vous par exemple n'appeliez un script fpc.sh en tant que votre compilateur au lieu de l'exécutable fpc. Ce script passe les options au compilateur réel ainsi il ignore /etc/fpc.cfg.

Cela donnera des problèmes à l'exécution p.ex. la suite de test du compilateur. Ces problèmes pourront être résolus en :

  • utilisant une variable d'environnement PPC_CONFIG_PATH ou un fpc.cfg dans le répertoire d'accueil, ce qui pourrait marcher.
  • peut-être qu'une solution plus simple est de ne pas installer FPC/les sources de FPC, mais de télécharger un compilateur bootstrap. Ainsi aucun fpc.cfg et pas de problème. Le bonus est que nous le construisons de manière plus proche de la "version officielle" (qui est toujours une installation complète de la précédente version).

Pour contourner cela, vous pouvez utiliser fpcup ; voir la prochaine section.

Un problème : make clean

Le tronc actuel de FPC (octobre 2012) ne nettoie pas tous les fichiers significatifs en exécutant make clean/make distclean.

Solution : obtenir un FPC utilisant fpcup

L'outil fpcup peut télécharger et installer FPC et Lazarus à partir de rien (ne demande pas de compilateur de départ), aussi une solution pourrait être de :

  • placer fpcup dans votre espace de travail
  • modifier les étapes de construction pour appeler fpcup avec --only=fpc --fpcrevision=$SVN_REVISION

Nous aurions pu lancer fpcup pour qu'il télécharge la dernière version de SVN, mais nous perdons l'intégration avec subversion.

Assurez-vous que vous avez un compilateur de ressource (vois la section d'installation du dessus). Téléchargez fpcup (la largeur, 32bit/64bit doit correspondre avec celle de la machine jenkins). Posez p.ex. fpcup_linux_x86 dans votre répertoire /usr/local/bin, ensuite :

chmod ugo+rx /usr/local/bin/fpcpup_linux_x86

(Si utilisation d'un Linux x64, le nommage peut évidemment différer)

Ensuite configurez vos étapes de construction comme ceci. Note : Nous pourrions avoir utilisé un gros script shell, mais l'avantage de mettre les commandes dans les commandes d'exécution shell est que la construction s'arrêtera sur la première erreur (statut de sortie non nul) rencontrée ; vous auriez à détecter les erreurs dans un script.

rm --force $WORKSPACE/fpcup.log #remove any existing logs; use force to not generate error message if log does not exist

Téléchargez/installer en utilisant fpcup. Note : il obtient l'URL SVN et l'ID révision désirée depuis des variables d'environnement définies par le plugin SVN de Jenkins. Une fois de plus, ajustez si vous n'utilisez pas un Linux x86.

/usr/local/bin/fpcup_linux_x86 --fpcbootstrapdir=$WORKSPACE/fpcbootstrap --fpcdir=$WORKSPACE --fpcuplinkname= --fpcURL=$SVN_URL --fpcrevision=$SVN_REVISION --keeplocalchanges --lazdir=$WORKSPACE/lazarus --lazlinkname= --logfilename=$WORKSPACE/fpcup.log --noconfirm --primary-config-path=$WORKSPACE/lazarusconfig --only=fpc

Maintenant vérifiez la sortie FPC dans une autre étape de construction. Remarquez que fpcup utilise un script fpc.sh personnalisé pour éviter des problèmes avec un fpc.cfg global au système. Une fois de plus, ajustez si vous n'utilisez pas un Linux x86.

$WORKSPACE/bin/i386-linux/fpc.sh -iD; $WORKSPACE/bin/i386-linux/fpc.sh -iW #get FPC version output to check if it was built correctly

La dernière étape de construction fait exécuter la "suite de test du compilateur".

cd $WORKSPACE/tests; make all TEST_FPC=$WORKSPACE/bin/i386-linux/fpc.sh #make full doesn't work, can't delete file

Vous pourrez archiver les résultats de la suite de test en utilisant une étape post-construction de Jenkins.

Tests FPCUnit/DBTestframework avec une sortie en base de données

Si vous voulez exécuter les tests de dbtestframework et sortir les résultats vers un serveur de base de données séparé, vous pouvez utiliser les programmes testdbwriter. Il vous laisse comparer les exécutions de diverses révisions - qui sont automatiquement construites par Jenkins.

Cette méthode de sortie des résultats de test vers des bases de données peut aussi être utilisée par d'autres projets qui utilisent les tests fpcunit - vous auriez à utiliser l'écouteur testdbwriter et à ajuster le console runner pour inclure cela.

Bien que cette section contienne une bonne quantité de réglages, c'est heureusement fait une fois pour toutes ; chaque tâche réutilisera la configuration existante.

Vous pourrez bien sûr aussi exécuter le code normal de dbtestframework avec une sortie en texte brut ou en XML. Vérifiez si Mercurial/hg est installé :

hg --help

Sinon, installez-le, p.ex.

apt-get install mercurial

Obtenez la version du référentiel dans un répertoire défini :

mkdir -p /opt/testdbwriter
cd /opt
hg clone https://bitbucket.org/reiniero/testdbwriter #will create /opt/testdbwriter
cd /opt/testdbwriter
# the following 2 steps are not necessary but show you how you can update with newest changes in the repository if needed:
hg pull #get newest changes from remote repo
hg up #adapt local version to newest changes we just downloaded

Réglage de la base de données

Maintenant les fichiers dans ce répertoire peuvent être utilisés pour compiler le programme de tests avec le FPC dans chaque construction. Nous aurons aussi besoin de configurer notre connexion de base de données.

Bases de données testées

D'abord, considérons les bases de données sur lesquelles les tests tourneront. Veuillez créer une base de données vide (ou au moins une dans laquelle le test utilisateur peut se débattre (thrash)) sur chaque serveur de base de données que vous voulez tester et avoir un nom d'utilisateur et un mot de passe prêts.

Ensuite, éditez le database.ini, utilisé par les test du framework db test (voir l'exécution de tests de bases de données de FPC.

cd /opt/testdbwriter/dbtests2db
cp database.ini.txt database.ini #copy over template to config file
nano database.ini # or another editor.
# now set up your credentials in each section

Résultats de test de la base de données

Maintenant la base de données où les résultats pourraient aller.

Configurez une base de données avec les instructions soulignées dans le fichier readme.txt (p.ex. utilisez le testdbwriter.sql pour les bases de données Firebird/Interbase et testdbwriter_postgresql.sql pour les bases de données PostgreSQL).

Maintenant éditez le fichier ini :

cd /opt/testdbwriter/dbtests2db
cp ../testdbwriter.ini.txt testdbwriter.ini #copy over template to config file
nano testdbwriter.ini #or another editor
# now set up your credentials in the right section, and choose your profile/database in the [Database] section

Ajout des tests à votre lot de travail Jenkin

* * * A FINIR  * * * 

We'll put the dbtests2db.lpr console runner and the db output writer code it needs (testdbwriter.pas) into the directory where the dbtestframework tests live so dbtests2db can pick up those tests. Then we'll compile the test suite, and run it for each database you want to test.

In your Jenkins job configuration, add an Execute shell build step to set up the test environment. Note: we copy forcing overwrites to avoid the script aborting the Jenkins job if the target exists:

cp -f /opt/testdbwriter/testdb* \
/opt/testdbwriter/dbtests2db/database.ini \
/opt/testdbwriter/dbtests2db/dbtests2db.lpr \
-t $WORKSPACE/packages/fcl-db/tests/; \
cd $WORKSPACE/packages/fcl-db/tests; \
$WORKSPACE/bin/i386-linux/fpc.sh $WORKSPACE/packages/fcl-db/tests/dbtests2db.lpr \
#copy & compile db test program using the fpc dbtestframework tests

Then for each database you want to test, add test runs. The names of the database connectors you specify as arguments must match the section names in database.ini, e.g. postgresql, mysql40, mysql41, mysql50, oracle, interbase etc.

Note-icon.png

Remarque: The dbtests2db program requires that the database connector is the first parameter; we also pick up the subversion revision number from the Jenkins subversion module we use. The examples below show how you can add more information to the test results database.

If you are testing multiple branches/versions of FPC (e.g. 2.6 and trunk) at the same time, you have a problem: the SVN revision number does not apply to branches but to the whole repository.

This means that the code in the FPC fixes26 branch commit 2500 may be older than the code in the FPC trunk branch 2300. Fortunately, there is a solution: we prepend the revision number passed to the executable with a value (e.g. 020701 for FPC 2.7.1, 020600 for FPC 2.6.0). This serves to preserve the relative "newness" of the various branches... and permits running regression queries on the database to show e.g. that FPC trunk has a failing test where 2.6.0 succeeded.

Note-icon.png

Remarque: Older versions of this instruction proposed using

--svnbranch="trunk"
which can also be done, but then you separate your testsuite hierarchies into different trees in the database. This does not allow running regression queries so easily.

Examples:

cd $WORKSPACE/packages/fcl-db/tests; \
$WORKSPACE/packages/fcl-db/tests/dbtests2db interbase --revisionid=020701$SVN_REVISION --comment="Jenkins trunk interbase"

With MySQL, as usual, the client version you installed on the Jenkins server has to match the version you specify here - in the example version 5.1:

cd $WORKSPACE/packages/fcl-db/tests; \
$WORKSPACE/packages/fcl-db/tests/dbtests2db mysql51 --revisionid=020701$SVN_REVISION --comment="Jenkins trunk mysql51"
cd $WORKSPACE/packages/fcl-db/tests; \
$WORKSPACE/packages/fcl-db/tests/dbtests2db postgresql --revisionid=020701$SVN_REVISION --comment="Jenkins trunk postgresql"
cd $WORKSPACE/packages/fcl-db/tests; \
$WORKSPACE/packages/fcl-db/tests/dbtests2db sqlite --revisionid=020701$SVN_REVISION --comment="Jenkins trunk sqlite"
cd $WORKSPACE/packages/fcl-db/tests; \
$WORKSPACE/packages/fcl-db/tests/dbtests2db bufdataset --revisionid=020701$SVN_REVISION --comment="Jenkins trunk bufdataset"
cd $WORKSPACE/packages/fcl-db/tests; \
$WORKSPACE/packages/fcl-db/tests/dbtests2db dbase4 --revisionid=020701$SVN_REVISION --comment="Jenkins trunk dbase4"

Note: with all this building and testing, your job running time may extend a bit. Please make sure you set the SVN polling interval to a big enough value to avoid building all the time.

If this works, you can see the test results on your database server, analyze regressions, test succcess percentages, etc.

Windows/Linux... construire l'esclave

Vous pouvez configurer d'autres machines en dehors du serveur Jenkins pour agir comme des "esclaves" : elles sont contrôlées par Jenkins et utilisées pour exécuter des tâches.

Ceci peut être utile lors de l'exécution d'un construction/test Windows depuis un serveur Linux.

Voir [1] pour des détails sur comment configurer des esclaves de construction Windows via DCOM (note : il y a d'autres façons pour configurer des esclaves de construction (Windows) ; veuillez vous référer à la documentation Jenkins).

Améliorations

Améliorations possibles :

  • exécuter make install dans un préfixe différent
  • exécuter une compilation Lazarus
  • enregistrer les résultats dbtests2db en XML, voir si Jenkins prend en charge cela.
  • ajouter un installateur de constructeurs

Dépannage

Echecs de construction

Vos constructions peuvent échouer parce que l'utilisateur Jenkins exécute un shell différent sous un utilisateur différent avec un chemin d'accès différent de celui que vous attendiez.

Découvrez quel utilisateur travaille sous Jenkins

Si vous rencontrez des problèmes avec les scripts/commandes shell dans les travaux ne disposant pas d'autorisations, il est utile de connaître l'utilisateur sous lequel Jenkins s'exécute.

Essayez cette commande (ou bien sûr la documentation) :

ps aux |grep jenkins | grep -v grep | cut -d" " -f1 | uniq #perhaps only works if jenkins is running a job

Sur Debian, il donne l'utilisateur tomcat6.