Sign in Join
Wiki copytemporary

Jenkins/fr: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11# Généralités
22
33[Jenkins](https://fr.wikipedia.org/wiki/Jenkins_(logiciel)) 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.
44
55Cet 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.
66
77# Réglage de Jenkins
88
99Une version possible à utiliser est Turnkey Linux Jenkins sur Debian 6.0.5 (Squeeze) ; cette article est testé avec Jenkins 1.464.
1010
1111De quelques façon que vous installiez Jenkins, assurez-vous que le plugin SVN est activé.
1212
1313# Réglage du compilateur de ressource
1414
1515Au moins les paquets Debian FPC n'installent pas un [[Lazarus Resources/fr|compilateur de ressource]], qui est demandé dans la section ci-dessous.
1616
1717``` bash
1818# Get resource compiler, not provided by fpc 2.6 packages:
1919apt-get install mingw32-binutils
2020# symlink:
2121ln -s /usr/bin/i586-mingw32msvc-windres /usr/bin/windres
2222```
2323
2424# Réglage du pilote de base de données
2525
2626Pour 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. :
2727
2828``` bash
2929apt-get install libfbembed2.5 firebird2.5-super firebird2.5-dev \
3030postgresql-client libpq-dev \
3131freetds-bin freetds-dev \
3232mysql-client libmysqlclient-dev \
3333libsqlite3-0 libsqlite3-dev \
3434unixodbc unixodbc-dev tdsodbc #adjust to taste/distribution
3535# 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
3636#freetds should pull in unixodbc, but we specify it explicitly.
3737#Strangely, on Debian, we need to explicilty specify tdsodbc to get the actual FreeTDS ODBC driver!?
3838```
3939
4040# Réglages des travaux
4141
4242Utilisez 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>).
4343
4444Définissez 'Use svn update as much as possible'.
4545
4646La 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 :
4747
4848``` bash
4949# every 20 minutes
5050*/20 * * * *
5151```
5252
5353# Tâche de fond : la construction normale & problèmes
5454
5555> **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.
5656
5757## Réglage de FPC stable
5858
5959Installez les binutils + le compilateur de ressource + FPC stable - pour quelques raison, les paquets debian ne tirent pas les dépendances requises :
6060
6161``` bash
6262apt-get install build-essential mingw32-binutils
6363# now make an easier name for the resource compiler; adjust to your specific version
6464# you could also adjust -FC<resourcecompilername> in /etc/fpc.cfg
6565ln -s /usr/bin/i586-mingw32msvc-windres /usr/bin/windres
6666
6767#fpc would get old FPC 2.4 on this Debian Squeeze=> symptom in Jenkins build log:
6868#generic.inc(2505,13) Fatal: Internal error 8
6969#Fatal: Compilation aborted
7070#make[7]: *** [system.ppu] Error 1
7171
7272#get stable compiler (2.6 at time of writing); we're on a 32 bit system:
7373cd /root
7474wget http://sourceforge.net/projects/freepascal/files/Linux/2.6.0/deb/fp-compiler-2.6.0_2.6.0-0_i386.deb/download
7575mv download fp-compiler-2.6.0_2.6.0-0_i386.deb
7676wget http://sourceforge.net/projects/freepascal/files/Linux/2.6.0/deb/fp-compiler_2.6.0-0_i386.deb/download
7777mv download fp-compiler_2.6.0-0_i386.deb
7878wget http://sourceforge.net/projects/freepascal/files/Linux/2.6.0/deb/fp-units-rtl_2.6.0-0_i386.deb/download
7979mv download fp-units-rtl_2.6.0-0_i386.deb
8080wget http://sourceforge.net/projects/freepascal/files/Linux/2.6.0/deb/fp-units-rtl-2.6.0_2.6.0-0_i386.deb/download
8181mv download fp-units-rtl-2.6.0_2.6.0-0_i386.deb
8282wget http://sourceforge.net/projects/freepascal/files/Linux/2.6.0/deb/fp-units-i386-2.6.0_2.6.0-0_i386.deb/download
8383mv download fp-units-i386-2.6.0_2.6.0-0_i386.deb
8484wget http://sourceforge.net/projects/freepascal/files/Linux/2.6.0/deb/fp-units-i386_2.6.0-0_i386.deb/download
8585mv download fp-units-i386_2.6.0-0_i386.deb
8686wget http://sourceforge.net/projects/freepascal/files/Linux/2.6.0/deb/fp-utils-2.6.0_2.6.0-0_i386.deb/download
8787mv download fp-utils-2.6.0_2.6.0-0_i386.deb
8888wget http://sourceforge.net/projects/freepascal/files/Linux/2.6.0/deb/fp-utils_2.6.0-0_i386.deb/download
8989mv download fp-utils_2.6.0-0_i386.deb
9090
9191dpkg -i fp-units-rtl-2.6.0_2.6.0-0_i386.deb
9292dpkg -i fp-units-rtl_2.6.0-0_i386.deb
9393dpkg -i fp-compiler-2.6.0_2.6.0-0_i386.deb
9494dpkg -i fp-utils-2.6.0_2.6.0-0_i386.deb
9595#no idea what the other .debs are for that we downloaded
9696#todo: this could be trimmed down a bit, but this seems to work
9797```
9898
9999## Commandes de construction de Jenkins
100100
101101Comme commandes de construction dans Jenkins, vous pourriez utiliser les commandes shell :
102102
103103``` bash
104104make all
105105```
106106
107107et, pour installer dans l'"espace de travail" ou au sommet de l'environnement du répertoire de construction (*build directory environment*) :
108108
109109``` bash
110110make install PREFIX=$WORKSPACE
111111```
112112
113113Note : l'installation quelque part ailleurs pourrait être une bonne idée, veuillez vous reporter à FAQ de construction.
114114
115115Make install ne génére pas un does fpc.cfg pour vous ; vous devez le faire vous-mêmes :
116116
117117``` bash
118118$WORKSPACE/bin/fpcmkcfg -o $WORKSPACE/bin/fpc.cfg
119119```
120120
121121## Un problème : /etc/fpc.cfg
122122
123123La 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.
124124
125125Cela donnera des problèmes à l'exécution p.ex. la suite de test du compilateur. Ces problèmes pourront être résolus en :
126126
127127- utilisant une variable d'environnement PPC_CONFIG_PATH ou un fpc.cfg dans le répertoire d'accueil, ce qui pourrait marcher.
128128- 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).
129129
130130Pour contourner cela, vous pouvez utiliser fpcup ; voir la prochaine section.
131131
132132## Un problème : make clean
133133
134134Le tronc actuel de FPC (octobre 2012) ne nettoie pas tous les fichiers significatifs en exécutant make clean/make distclean.
135135
136136# Solution : obtenir un FPC utilisant fpcup
137137
138138L'outil [[Projects using Lazarus|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 :
139139
140140- placer fpcup dans votre espace de travail
141141- modifier les étapes de construction pour appeler fpcup avec --only=fpc --fpcrevision=\$SVN_REVISION
142142
143143Nous aurions pu lancer fpcup pour qu'il télécharge la dernière version de SVN, mais nous perdons l'intégration avec subversion.
144144
145145Assurez-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 :
146146
147147``` bash
148148chmod ugo+rx /usr/local/bin/fpcpup_linux_x86
149149```
150150
151151(Si utilisation d'un Linux x64, le nommage peut évidemment différer)
152152
153153Ensuite 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.
154154
155155``` bash
156156rm --force $WORKSPACE/fpcup.log #remove any existing logs; use force to not generate error message if log does not exist
157157```
158158
159159Té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.
160160
161161``` bash
162162/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
163163```
164164
165165Maintenant 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.
166166
167167``` bash
168168$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
169169```
170170
171171La dernière étape de construction fait exécuter la "suite de test du compilateur".
172172
173173``` bash
174174cd $WORKSPACE/tests; make all TEST_FPC=$WORKSPACE/bin/i386-linux/fpc.sh #make full doesn't work, can't delete file
175175```
176176
177177Vous pourrez archiver les résultats de la suite de test en utilisant une étape post-construction de Jenkins.
178178
179179# Tests FPCUnit/DBTestframework avec une sortie en base de données
180180
181181Si vous voulez exécuter les tests de [[Databases/fr|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.
182182
183183Cette 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.
184184
185185Bien 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.
186186
187187Vous 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é :
188188
189189``` bash
190190hg --help
191191```
192192
193193Sinon, installez-le, p.ex.
194194
195195``` bash
196196apt-get install mercurial
197197```
198198
199199Obtenez la version du référentiel dans un répertoire défini :
200200
201201``` bash
202202mkdir -p /opt/testdbwriter
203203cd /opt
204204hg clone https://bitbucket.org/reiniero/testdbwriter #will create /opt/testdbwriter
205205cd /opt/testdbwriter
206206# the following 2 steps are not necessary but show you how you can update with newest changes in the repository if needed:
207207hg pull #get newest changes from remote repo
208208hg up #adapt local version to newest changes we just downloaded
209209```
210210
211211## Réglage de la base de données
212212
213213Maintenant 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.
214214
215215### Bases de données testées
216216
217217D'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.
218218
219219Ensuite, éditez le database.ini, utilisé par les test du framework db test (voir l'[[Databases/fr|exécution de tests de bases de données de FPC]].
220220
221221``` bash
222222cd /opt/testdbwriter/dbtests2db
223223cp database.ini.txt database.ini #copy over template to config file
224224nano database.ini # or another editor.
225225# now set up your credentials in each section
226226```
227227
228228### Résultats de test de la base de données
229229
230230Maintenant la base de données où les résultats pourraient aller.
231231
232232Configurez 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).
233233
234234Maintenant éditez le fichier ini :
235235
236236``` bash
237237cd /opt/testdbwriter/dbtests2db
238238cp ../testdbwriter.ini.txt testdbwriter.ini #copy over template to config file
239239nano testdbwriter.ini #or another editor
240240# now set up your credentials in the right section, and choose your profile/database in the [Database] section
241241```
242242
243243## Ajout des tests à votre lot de travail Jenkin
244244
245-`* * * A FINIR  * * * `
245+```text
246+* * * A FINIR * * *
247+```
246248
247249We'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.
248250
249251In 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:
250252
251253``` bash
252254cp -f /opt/testdbwriter/testdb* \
253255/opt/testdbwriter/dbtests2db/database.ini \
254256/opt/testdbwriter/dbtests2db/dbtests2db.lpr \
255257-t $WORKSPACE/packages/fcl-db/tests/; \
256258cd $WORKSPACE/packages/fcl-db/tests; \
257259$WORKSPACE/bin/i386-linux/fpc.sh $WORKSPACE/packages/fcl-db/tests/dbtests2db.lpr \
258260#copy & compile db test program using the fpc dbtestframework tests
259261```
260262
261263Then 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.
262264
263265> **Note:** 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.
264266
265267If 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.
266268
267269This 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.
268270
269271> **Note:** Older versions of this instruction proposed using
270272>
271273> ``` bash
272274> --svnbranch="trunk"
273275> ```
274276>
275277> 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.
276278
277279Examples:
278280
279281``` bash
280282cd $WORKSPACE/packages/fcl-db/tests; \
281283$WORKSPACE/packages/fcl-db/tests/dbtests2db interbase --revisionid=020701$SVN_REVISION --comment="Jenkins trunk interbase"
282284```
283285
284286With 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:
285287
286288``` bash
287289cd $WORKSPACE/packages/fcl-db/tests; \
288290$WORKSPACE/packages/fcl-db/tests/dbtests2db mysql51 --revisionid=020701$SVN_REVISION --comment="Jenkins trunk mysql51"
289291```
290292
291293``` bash
292294cd $WORKSPACE/packages/fcl-db/tests; \
293295$WORKSPACE/packages/fcl-db/tests/dbtests2db postgresql --revisionid=020701$SVN_REVISION --comment="Jenkins trunk postgresql"
294296```
295297
296298``` bash
297299cd $WORKSPACE/packages/fcl-db/tests; \
298300$WORKSPACE/packages/fcl-db/tests/dbtests2db sqlite --revisionid=020701$SVN_REVISION --comment="Jenkins trunk sqlite"
299301```
300302
301303``` bash
302304cd $WORKSPACE/packages/fcl-db/tests; \
303305$WORKSPACE/packages/fcl-db/tests/dbtests2db bufdataset --revisionid=020701$SVN_REVISION --comment="Jenkins trunk bufdataset"
304306```
305307
306308``` bash
307309cd $WORKSPACE/packages/fcl-db/tests; \
308310$WORKSPACE/packages/fcl-db/tests/dbtests2db dbase4 --revisionid=020701$SVN_REVISION --comment="Jenkins trunk dbase4"
309311```
310312
311313Note: 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.
312314
313315If this works, you can see the test results on your database server, analyze regressions, test succcess percentages, etc.
314316
315317# Windows/Linux... construire l'esclave
316318
317319Vous 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.
318320
319321Ceci peut être utile lors de l'exécution d'un construction/test Windows depuis un serveur Linux.
320322
321323Voir [1](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).
322324
323325# Améliorations
324326
325327Améliorations possibles :
326328
327329- exécuter make install dans un préfixe différent
328330- exécuter une compilation Lazarus
329331- enregistrer les résultats dbtests2db en XML, voir si Jenkins prend en charge cela.
330332- ajouter un installateur de constructeurs
331333
332334# Dépannage
333335
334336## Echecs de construction
335337
336338Vos 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.
337339
338340## Découvrez quel utilisateur travaille sous Jenkins
339341
340342Si 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.
341343
342344Essayez cette commande (ou bien sûr la documentation) :
343345
344346``` bash
345347ps aux |grep jenkins | grep -v grep | cut -d" " -f1 | uniq #perhaps only works if jenkins is running a job
346348```
347349
348350Sur Debian, il donne l'utilisateur tomcat6.
349351
350352---
351353*From the Free Pascal wiki, page "Jenkins/fr", as it stood on 2017-10-27 after a change by E-ric, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history