Jacques Foucry bio photo

Jacques Foucry

IT, râleur et faiseur de pain

Email Twitter



Bon d’accord le titre est super accrocheur, mais c’est de la triche. Je me sers de mon Linux pour écrire du code, mais j’ai besoin d’un Mac pour faire la compilation. Toutefois nous allons utiliser la ligne de commande au maximum.

Nous allons aussi faire de l’intégration continue. À chaque commit notre Mac OS X va récupérer les sources, les compiler et rendre le résultat disponible pour une installation sur un iDevice.

Maintes commandes de cette installation réclament des droits d’administration. Il est donc nécessaire de faire ces manipulations avec un utilisateur ayant les droits d’administration sur le Mac cible.

Java

Jenkins utilise Java. Par défaut Java n’est pas installé sur Lion. Nous devons donc l’installer par nous même. Heureusement Apple nous propose une [image][^1].

Une fois le téléchargement terminé nous allons monter l’image disque téléchargée

$ cd /Volumes/Java For Mac OS X 10.7
$ ls JavaForMacOSX10.7.pkg

Il faut utiliser la commande installer pour réaliser l’installation

$ sudo installer -pkg JavaForMacOSX10.7.pkg -target /

L’intégration continue

Au même titre que le développement Agile, l’intégration continue est achement à la mode. Le principe est simple. Un robot (en l’occurrence jenkins) tourne sur une machine d’intégration. Il récupère les sources depuis un gestionnaire de source, réalise les compilations du produit. Le but est de vérifier que le dernier commit n’a pas cassé la compilation. En cas de problème le développeur responsable de l’erreur est alerté du problème.

Il est donc nécessaire d’avoir un système de gestion de source, un mac, un accès SSH sur ce mac et les outils développeurs installés sur ce mac. Nous auront aussi besoin d’Apache, le serveur Web. Ce dernier est installé par défaut sur Mac OS X, nous n’aurons que la configuration du produit à faire.

Installation de Jenkins

L’installation de Jenkins est plus que simple. Il suffit de récupérer sur le site le paquet conçu pour Mac OS X…

$ curl -O http://jenkins.mirror.isppower.de/osx/jenkins-1.451.pkg

et de l’installer avec la commande éponyme :

$ sudo installer -pkg jenkins-1.451.pkg -target /

Création de l’utilisateur Jenkins

Pour amoindrir le risque de trou de sécurité, Jenkins ne doit pas tourner avec un utilisateur ayant de trop grands privilèges. C’est pourquoi nous devons créer un utilisateur spécifique pour cette tâche.

$ sudo dscl . create /Users/jenkins  
$ sudo dscl . create /Users/jenkins PrimaryGroupID 1  
$ sudo dscl . create /Users/jenkins UniqueID 300  
$ sudo dscl . create /Users/jenkins UserShell /bin/bash  
$ sudo dscl . create /Users/jenkins home /Users/Shared/Jenkins/Home/  
$ sudo dscl . create /Users/jenkins NFSHomeDirectory /Users/Shared/Jenkins/Home/  
$ sudo dscl . passwd /Users/jenkins  

Il faut prévenir jenkins qu’il possède maintenant un utilisateur pour fonctionner. Cela se fait dans le fichier /Library/LauchDaemons/org/jenkins-ci.plist. Ce fichier provient du paquet que nous avons installé.
À la fin du fichier se trouve la définition de l’utilisateur responsable de jenkins :

<UserName>
<daemon>

Changez simplement daemon par jenkins avec votre éditeur de texte préféré.

Changeons également le propriétaire du répertoire Jenkins :

$ sudo chown -R jenkins /Users/Shared/Jenkins

Il est temps de relancer le service avec les nouveaux paramètres.

Nous allons utiliser les mécanismes prévus par Apple et configurés par Jenkins (et nous), launchd

$ sudo launchctl unload -w /Library/LaunchDaemons/org.jenkins-ci.plist
$ sudo launchctl load -w /Library/LaunchDaemons/org.jenkins-ci.plist

Si tout va bien, vous devriez trouver dans /var/log/system.log la ligne suivante :

Feb 27 11:53:32 macmini org.jenkins-ci[37647]: INFO: Jenkins is fully up and running

Signifiant ainsi que votre jenkins est opérationnel.

Reste à tester la connexion vers la console Jenkins. Pointez votre navigateur vers l’adresse IP de votre serveur, sur le port 8080. Vous devriez obtenir quelque chose qui ressemble à cela :

Jenkins, la page d'accueil

Jenkins, la page d’accueil

Jenkins, SSH et Git

Pour utiliser git avec jenkins, il est nécessaire d’avoir une clef SSH. Il faut donc générer une clef SSH (en fait une paire de clefs, un privée que vous devez garder secrète et une publique qui sera envoyée sur le serveur git).

SSH

Cette clef doit appartenir à jenkins, il faut donc être jenkins pour générer cette paire de clefs :

$ su - jenkins
$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/Users/Shared/Jenkins/Home//.ssh/id_dsa):
Created directory &#39;/Users/Shared/Jenkins/Home//.ssh&#39;.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/Shared/Jenkins/Home//.ssh/id_dsa.
Your public key has been saved in /Users/Shared/Jenkins/Home//.ssh/id_dsa.pub.
The key fingerprint is:
48:e0:09:7a:da:9e:67:e0:8c:25:fe:bd:9c:de:2f:e4 jenkins@macmini.local
The key&#39;s randomart image is:
+--[ DSA 1024]----+
| . . |
| . o o |
|. . o . |
| + . . |
|o + . S |
|.B o . |
|..= o o |
| .oo oE |
| ..*..o. |
+-----------------+

Il n’est pas prudent du tout d’avoir une clef sans passphrase. Toutefois, dans le cas d’un service qui doit tourner indépendamment, c’est le seul moyen de faire.

Pour que plus tard nous puissions récupérer les sources via ssh et git il est nécessaire de préparer le terrain.

Toujours en étant jenkins, il faut que nous tentions de nous connecter à la machine qui contient nos sources.

Pour des raisons de sécurité, il est préférable d’avoir un utilisateur dédié sur la machine qui contient les sources. En fonction de sa nature la commande pour créer cet utilisateur peut être différente. Sur un linux il y a de grande chose que ce soit useradd.

$ sudo useradd -m jenkins

Donnez un mot de passe à cet utilisateur :

$ sudo passwd jenkins
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Tant que vous êtes connectés sur la machine Linux, profitez-en pour devenir Jenkins afin de créer dans le répertoire de cet utilisateur le dossier .ssh

$ su - jenkins
Password:
$ pwd
/home/jenkins
$ mkdir .ssh
$ exit
logout

Il faut maintenant mettre la clef publique de jenkins dans les fichiers de configuration SSH de l’utilisateur jenkins SUR LA MACHINE cible :

$ cat .ssh/id_dsa.pub | ssh jenkins@source.example.com 

Vous devez connaitre le mot de passe de l’utilisateur sur cette machine.

Ensuite vous devriez pouvoir vous connecter directement sur cette machine

$ ssh jenkins@source.example.com

Git

Nous devons installer un greffon pour utiliser git avec jenkins.
Depuis l’écran d’accueil, sélectionnez Manage Jenkins > Manage Plugins et choisissez l’onglet Available.

La liste est très longue (vous pourrez explorer la liste des greffons une fois que votre installation de départ fonctionnera). Dans rubrique Source Code Management vous devriez trouver Git Plugin. Cochez la case et cliquez sur Download now and install after restart.

Fastoche non ?

Créer un flux pour XCode

Notre but est de créer un flux de compilation pour XCode. C’est donc ce que nous allons faire maintenant en commençant par préciser d’où viennnent les sources.

Depuis l’écran d’accueil, sélectionnez New Job. Nous allons donner un nom à notre flux et choisir de faire un free-style software project

Jenkins, création d'un flux

Mettez une description si vous le désirez (cela peut être utile quand vous avez beaucoup de flux de compilation).

Commençons par indiquer à Jenkins où trouver les sources nécessaire à la compilation du projet. Dans la rubrique SCM, choisissez Git et donnez l’url de votre dépôt. Pensez à mettre le nom de l’utilisateur sur la machine cible, vers lequel vous avez installé la clef ssh de jenkins.

Passons maintenant à la rubrique Build qui, comme son nom l’Indique, va nous permettre de décrire comment doit être construit notre projet.

Dans le menu déroulant sélectionnez Execute Shell. Cela fait apparaitre un champ de saisie. Nous allons y mettre les lignes de commande a exécuter pour contruire notre projet xcode. Il s’agit de la commande xcodebuild.

Sauvez votre flux. Cela vous fait retourner à la page d’accueil.

Celle-ci vous indique que n’avez pas de workspace (espace de travail), il sera créé avec le premier lancement d’un flux.

Il est donc temps de lancer la première compilation automatique en cliquant sur Run a build.

Mise au point

Forcément votre premier lancement devrait échouer. Il y a des nombreuses explications possibles. Voyons ce qu’il m’est arrivé pour que vous puissiez avoir quelques pistes.

En cliquant sur le numéro de build dans le cadre build history, vous aurez accès au fichier de trace.

Impossible de cloner le projet.
→ En étant jenkins (su – jenkins) essayer de faire ce clone à la main :

git clone ssh://jacques@source.example.com/data/repositories/monprojet

Error performing command: git tag -a -f -m Jenkins Build #6 jenkins-Test_XCode-6
→ Votre git n’est pas complèment configuré sur la machine qui fait tourner jenkins, il faut au moins donner un nom et une adresse email

$ git config --global user.email "you@example.com"
$ git config --global user.name "Your Name"

You have not agreed to the Xcode license agreements, please run xcodebuild standalone from within a Terminal window to review and agree to the Xcode license agreements.
→ Toujours en étant jenkins, lancez xcodebuild sans argument et lisez le contrat xcode. Suivez les instructions pour accepter la licence.

Si tout se passe bien, vous devriez voir une pastille bleue dans le cadre build history


Billet Suivant


Laisser un commentaire

Les commentaires sont soumis à modération.