Mise en place d’un plateforme d’intégration IOS avec Jenkins sous Mac OSX 10.8 / XCode 5

Ce post de blog détaille :

  • Comment installer les outils coté serveur
  • Comment configurer un projet pour qu'il soit correctement pris en charge

1. Installation de X-Code 5 sur votre serveur sous Mac OS X

1.1. X-Code

L’installation de X-Code 5 se fait à partir du Mac App Store sur OSX :

Installer XCode avec le Mac App Store

L’installation nécessite un compte iTunes Store

X-Code 5 ne peut être installé que sur OSX 10.8 ou supérieur

1.2. IOS 6.1

Si l’on souhaite compiler des projets sous IOS 6.1, il faut intégrer le SDK fourni dans une précédente version de XCode : 4.5. Pour télécharger une version plus ancienne de X-Code, le site d’Apple permet de le faire, avec un compte développeur : https://developer.apple.com/downloads/index.action?name=Xcode Le SDK 6.1 est à récupérer dans l’application X-Code :

Ouvrir la packet XCode -> IOS6.1

Il faut récupérer le dossier « iPhoneOS6.1.sdk » de l’application en version 4.5 et le coller au même endroit dans l’application en version 5 : Dossier de copie du SDK IOS 6.1

1.3. Comptes développeur

Pour permettre la signature des applications, il faut ajouter dans X-Code les données des comptes développeur associés : Le compte Netapsys ainsi que les comptes client :

  • Dans X-Code > Préférences > Accounts :

Compte Apple dans XCode

1.4. Command Line Tools et Simulateurs

Les outils de développements en ligne de commande sont également à installer / mettre à jour, ainsi que les simulateurs plus anciens :

  • Dans X-Code > Préférences > Download :
 Onglet Downloads XCode

En fonction des besoins, télécharger les simulateurs associés. IOS 6.1 Simulator (En plus du 7 installé par défaut) est suffisant pour la plupart des projets. La documentation n’est pas nécessaire pour une poste serveur d’intégration continue.

2. Jenkins et outils associés

2.1. Home Brew

Jenkins s’installe en ligne de commande (Outil « Terminal ») avec Home Brew, un gestionnaire de packets :

ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"

2.2. Jenkins

Avec HomeBrew les installations sont facilitées :

brew install jenkins

Pour démarrer/arrêter Jenkins les commandes sont :

launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist

Vous pouvez tester que Jenkins fonctionne en ouvrant votre navigateur préféré (Safari) avec l’adresse suivante :

http://localhost:8080

2.3. Outillage Jenkins

Différents outils sont à installer pour Jenkins, la plupart dans le dossier :

usr/local/bin

2.3.1. OCUnit2JUnit

Il s’agit d’un script Ruby qui converti les résultats des tests OCUnit en tests JUnit :

cd ~ git clone https://github.com/ciryon/OCUnit2JUnit sudo cp ./OCUnit2JUnit/bin/ocunit2junit /usr/local/bin sudo chown root:wheel /usr/local/bin/ocunit2junit sudo chmod 755 /usr/local/bin/ocunit2junit

2.3.2. Gcovr

GCovr permet de vérifier la couverture du code et de sortir des données au format Cobertura :

cd ~ git clone https://github.com/gcovr/gcovr sudo cp ./gcovr /usr/local/bin sudo chown root:wheel /usr/local/bin/gcovr sudo chmod 755 /usr/local/bin/gcovr

2.3.3. Clang static analyzer

CLang est l’outil qui permet d’analyser le code source à la recherche d’erreurs :

cd ~ curl http://clang-analyzer.llvm.org/downloads/checker-275.tar.bz2 -o checker-275.tar.bz2 tar xzf checker-275.tar.bz2 sudo mv checker-275 /usr/local/bin/ sudo chown -R root:wheel /usr/local/bin/checker-275 sudo chmod -R 755 /usr/local/bin/checker-275 sudo ln -s /usr/local/bin/checker-272 /usr/local/bin/checker-current

2.3.4. ios-sim

Cette librairie permet de lancer les tests dans le simulateur en ligne de commande :

brew install ios-sim sudo cp $(brew list ios-sim | grep bin/ios-sim) /usr/local/bin sudo chown -R root:wheel /usr/local/bin/ios-sim sudo chmod -R 755 /usr/local/bin/ios-sim

2.4. Plugins Jenkins

En plus des outils, il faut installer les plug-in Jenkins associés qui pemettrons de les utiliser. Dans Jenkins, aller à :

  • Administrer Jenkins > Gestion des Plug-ins > Onglet « Disponibles » > Rechercher :
  • Git : pour les repo GIT
  • locks-and-latches : pour lancer le simulateur
  • clang-scanbuild-plugin et analysis-core : pour l’outil d’analyse de code
  • cobertura : pour afficher sous forme de graphiques la couverture de code

2.5. Configuration globale de Jenkins

La configuration de Jenkins doit être modifiée pour lui indiquer divers chemins d’accès :

  • Dans Administrer Jenkins > Configurer le système :

2.5.1. Locks & IOS-SIM

Saisir le nom de ios-sim dans la variable du gestionnaire Locks : Lock And SIM

2.5.2. Clang static analyzer

Indiquer le chemin d’installation de CLang : Static CLang Analyzer

3. Configurer un Job pour un projet IOS

Pour configurer un nouveau job :

3.1. Création du job

A l’accueil de Jenkins : « Nouveau Job », sélectionner « Construire un projet FreeStyle » et lui donner un nom.

Nouveau Job Jenkins

3.2. Configuration GIT

Indiquer l’adresse du repo GIT concerné : Dépot GIT

3.3. Configurer Locks & IOS-SIM

Sélectionner IOS-sim dans Environnement de build > Locks : Config Lock And SIM

3.4. Build du projet

  • Dans « Build », « Ajouter une étape de build » sélectionner « Exécuter un script shell » et définir la commande suivante :

# Définition du dossier des outils de developpement XCode set DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer" export DEVELOPER_DIR

# Nettoyage du workspace cd "${WORKSPACE}" xcodebuild clean

# Lancement de l’analyseur de code source /usr/local/bin/checker-current/scan-build -k -v -v --keep-empty -o ./clangScanBuildReports xcodebuild -scheme poc-pic-ios -configuration Debug ONLY_ACTIVE_ARCH=NO clean build

# Suppression du précédent dossier de compilation temporaire rm -rf "${WORKSPACE}"/tmp/objs

# On lance la construction du projet avec le target désiré # et on envoi les résulats au script ocunit2junit xcodebuild -target poc-pic-iosTests -configuration Debug -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO WANT_IOS_SIM=YES OBJROOT="${WORKSPACE}"/tmp/objs clean build | /usr/local/bin/ocunit2junit

# Génération du rapport Cobertura cd "${WORKSPACE}" /usr/local/bin/gcovr --root="${WORKSPACE}" --exclude='(.*./Developer/SDKs/.*)|(.*Tests\.m)' --object-directory /Users/bdesnos/.jenkins/jobs/TestPIC/workspace/tmp/objs/poc-pic-ios.build/Debug-iphonesimulator/poc-pic-iosTests.build/Objects-normal/i386 -x > ./coverage.xml

Les données en gras sont à modifier en fonction du projet.

Pour la génération du rapport Cobertura, il faut être certain que le build a bien généré dans le dossier Objects-normal/i386 les objets .gcda et .gcno, dans le cas contraire aucun fichier ne sera analysé par Cobertura

3.4.1. Génération IPA

En plus de l’exécution des tests unitaires il est possible de générer un IPA distribuable sur tout appareil IOS. Pour cela, on peut ajouter le script Shell suivant : /usr/bin/xcrun -sdk iphoneos PackageApplication -v "${WORKSPACE}"/build/Release-iphoneos/poc-pic-ios.app -o "${WORKSPACE}"/build/Release-iphoneos/poc-pic-ios.ipa --sign "iPhone Developer: Prenom NOM (U8XXXXXXXX8)" --embed "/Users/bdesnos/Library/MobileDevice/Provisioning Profiles/F4DC96CC-3BC8-4C54-A98B-305446B4E168.mobileprovision"

Ici le fichier IPA généré servira à tester l’application sur des iPhone d’intégration : la signature utilisée est « Developer», pour la production, il faudra utiliser une signature « Distribution »

3.5. Rapport de test

Le rapport de test doit être configuré de telle façon :

  • Dans « Actions à la suite du build », « Add post Build Action », sélectionner « Publier le rapport des résulats des tests JUnit » et définir le dossier suivant :

test-reports/*.xml

Rapport JUnit

3.6. Résultats Scan Build

Il faut également configurer les résultats des vérifications de code sources :

  • Dans « Actions à la suite du build », « Add post Build Action », sélectionner « Publish Clang Scan-build Results » :

Scan build

3.7. Résultats de couverture de tests unitaires

Il faut également configurer les résultats de couverture de code produits pour Cobertura :

  • Dans « Actions à la suite du build », « Add post Build Action », sélectionner « Publish Cobertura Coverage Report » et saisir le nom du rapport :

coverage.xml

Config Cobertura

4. Résultats

Résultats1 Résultats2 Si un IPA a été généré il est dans le répertoire de travail, on pourra configurer un script pour le pousser vers un Artifactory : Résultats3

5. Projet XCode : Configuration pour Cobertura & GCOV

L’utilisation de Cobertura dans la PIC nécessite une configuration particulière du projet et l’utilisation de GCOV, l’objectif étant de produire des fichiers d’extension .gcda et .gcno dans le dossier suivant (Qui est généré lors du build) :

  • Library > Developper > Xcode > DerivedData > « NOMPROJET »+CARACTERESALEATOIRES > Build > Intermediates > « NOMPROJET » + .build > Debug-iphonesimulator > « NOMPROJET »> Objects-normal > i386

Tant que ces fichiers .gcda et .gcno n’ont pas été générés dans ce dossier, la configuration n’est pas bonne pour gérer la couverture de code.

5.1. Modification « Project »

Dans la partie Project, Build Settings, Apple LLVM 5.0 – preprocessing, pre-processor macros, ajouter le paramètre suivant :

GCOV_ENABLED=1

GCOV Enabled

Faire de même avec le paramètre Apple LLVM 5.0 – Code Generation, « Generate Test coverage files » et « Instrument Programme Flow » et « Generate Profiling Code » en les passant à « YES» :

GCOV Values

Dans Other C Flags, ajouter les commandes suivantes :

-fprofile-arcs -ftest-coverage

GCOV OTHER C FLAG

5.2. Modification comportement de GCOV à la fermeture de l’application

Dans AppDelegate.m, ajouter le code suivant :

extern void __gcov_flush(void);

- (void)applicationWillTerminate:(UIApplication *)application{ __gcov_flush();}

Et voilà pour la configuration d'un projet avec Jenkins. La prochaine fois, nous parlerons de la nouvelle plateforme d'intégration continue proposée par Apple dans la déclinaison server de MAC OS X 10.9 Maverick.

Un commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.