logo_jenkins

Ce  billet va décrire l’installation d’un serveur Jenkins sur une boite Linux / Debian pour un projet PHP / Symfony 2 avec Git et NGinx.

Nous utiliserons PHP Mess detector (PMD), PHPLoc, PHPUnit, CloverPHP etc…

Nous supposons que Git est déjà installé sur le serveur, ainsi que NGinx et PHP5.

Installation

Nous allons utiliser Ant pour le build. Il nous faut également XDebug pour phploc.

Donc, l’installation de Jenkins et des librairies dépendantes se fait de la manière suivante:

sudo apt-get install graphviz  
sudo apt-get install ant  
sudo apt-get install openjdk-6-jdk  
sudo apt-get install php5-xdebug wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -  
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'  
sudo apt-get install jenkins  

Changer le Port par défaut de Jenkins

Le port par défaut est 8080. Si cela ne convient pas, on peut le modifier dans le fichier de configuration:

vi  /etc/default/jenkins  

Ensuite redémarrer le service Jenkins

sudo service jenkins restart  

Paramétrage de NGinx

NGinx va servir de proxy pour accéder au serveur, tout en renforçant le HTTPS. Il faut remplacer *monjenkins.domaine.com *par son propre domaine et modifier le port en fonction de ce que l’on a dans le fichier de configuration.

upstream jenkins {  
     server 127.0.0.1:<Port de Jenkins>
     fail_timeout=0;
  }
server {  
         listen 80;
         server_name monjenkins.domaine.com;
         return 301 https://$server_name$request_uri;  # enforce https
 }
 server {
   listen 443 ssl;
   server_name monjenkins.domaine.com;
   ssl_certificate      /chemin vers le certificat/certificat.crt;
   ssl_certificate_key  /chemin vers le certificat/certificat.key;
   location / {
         proxy_pass http://jenkins/;
         # Rewrite HTTPS requests from WAN to HTTP requests on LAN
         proxy_redirect http:// https://;
         # The following settings from https://wiki.jenkins-ci.org/display/JENKINS/Running+Hudson+behind+Nginx
         sendfile off;
         proxy_set_header   Host             $host;
         proxy_set_header   X-Real-IP        $remote_addr;
         proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
         proxy_max_temp_file_size 0;
         #this is the maximum upload size
         client_max_body_size       10m;
         client_body_buffer_size    128k;
         proxy_connect_timeout      90;
         proxy_send_timeout         90;
         proxy_read_timeout         90;
         proxy_buffer_size          4k;
         proxy_buffers              4 32k;
         proxy_busy_buffers_size    64k;
         proxy_temp_file_write_size 64k;
 }
 }

Maintenant, Jenkins doit être accessible, sans login/mot de passe à l’URL qui a été spécifiée.

Paramétrer la Sécurité

Le serveur est accessible par tout le monde, sans sécurité particulière et une alerte à ce sujet s’affiche dans le menu d’administration. Pour résoudre cela, cliquer sur le menu* Configurer la sécurité globale*, comme ci-dessous.

JenkinsSécurité

Créer un utilisateur admin et un utilisateur avec un accès en lecture comme dans l’exemple. Cliquer ensuite sur le bouton Enregistrer. Une page de login apparaît alors, il faut l’ignorer et aller sur l’URL du serveur, soit dans notre exemple https://monjenkins.domaine.com. Une page d’inscription apparait alors dans laquelle vous pouvez vous connecter avec le nom d’utilisateur admin choisi et entrer un mot de passe, email etc.

Installer les librairies PHP

Les plugins nécessaires vont utiliser les librairies PHP que nous devons installer sur la machine avec l’utilisateur root:

pear channel-discover  
pear.pdepend.org  
pear channel-discover  
pear.phpmd.org  
pear channel-discover  
pear.phpunit.de  
pear channel-discover  
pear.phpdoc.org  
pear channel-discover components.ez.no  
pear channel-discover  
pear.symfony-project.com  
pear channel-discover  
pear.symfony.com/Console  
pear channel-discover  
pear.symfony.com  
pear channel-discover  
pear.netpirates.net  
pear install pdepend/PHP_Depend  
pear install phpmd/PHP_PMD  
pear install phpunit/phpcpd  
pear install phpunit/phploc  
pear install --alldeps phpunit/PHP_CodeBrowser  
pear install --alldeps phpunit/PHPUnit  
pear install phpdoc/phpDocumentor-alpha  
pear install PHP_CodeSniffer  

Installer les PlugIns

Dans le menu Administrer Jenkins, cliquer sur Gestion des Plugins. Dans l’onglet Disponibles, une liste de plugins doit s’afficher comme ci-dessous

JenkinsPlugins

Sinon cliquer dans l’onglet Avancés et sur les boutons Soumettre et Vérifier Maintenant.

JenkinsMAJPlugins

De retour dans l’onglet Disponibles sélectionner les Plugins suivants, s’il ne sont pas déjà installés:

  • checkstyle
  • cloverphp
  • git
  • git-client
  • gitlab-plugin
  • htmlpublisher
  • javadoc
  • jdepend
  • jslint-checkstyle
  • plot
  • pmd
  • violations
  • xunit

Redémarrer le serveur.

Configuration d’un Projet

Pour configurer un projet, il suffit de se référer à l‘article suivant.

Problèmes

Résolution des problèmes liés aux certificats auto-signés

Si on accède à son répository Git au moyen d’un GitLab auto hébergé par exemple, avec un certificat SSL auto-signé, Jenkins génère une erreur et ne peut pas accéder au repo.

La meilleure méthode pour s’en sortir est d’ajouter ce certificat à la liste des certificats auto-signés de la manière suivante:

wget http://demos.erikzaadi.com/jenkins/JavaSSL.zip  
unzip JavaSSL.zip  
java InstallCert monserveurgit.com  
sudo cp jssecacerts /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/security/.  
sudo cp jssecacerts /root/.keystore  

Ensuite il faut vérifier que Git accepte également les certificat auto-signé:

sudo su - jenkins  
git config --global http.sslverify false```  

Message d’erreur crumb

s’il y a une message d’erreur du type ci-dessous, ou que la console ou certains affichages comme la liste des utilisateurs ne fonctionnent pas bien, il s’agit certainement d’un problème de paramétrage de la protection contre les exploits Cross Site Request Forgery.

 No valid crumb was included in the request

Il faut décocher l’option dans le menu Configurer la sécurité globale de l’administration:

JenkinsProtectionCrumb

Erreur PHPUnit

En cas d’erreur comme celle ci-dessous:

PHP Fatal error: Maximum function nesting level of '100' reached, aborting!  

Il faut augmenter le nombre de niveaux de nesting de xdebug dans le fichier /etc/php5/cli/php.ini.

[xdebug]
 xdebug.max_nesting_level=200

Sources

http://blog.lazycloud.net/utiliser-jenkins-pour-un-projet-symfony2/
http://erikzaadi.com/2011/09/09/connecting-jenkins-to-self-signed-certificated-servers/
http://stackoverflow.com/questions/21181231/server-certificate-verification-failed-cafile-etc-ssl-certs-ca-certificates-c
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-jenkins-on-ubuntu-12-04