Gagner du temps sur le packaging des applications iOS avec Jenkins et Fastlane

De Steven Marie dans Technique

2 Sep 2019

Jenkins + fastlane une association qui fonctionne

Le développement d’applications pour iOS est passionnant mais il y a une étape du processus qui n’enchante pas complètement les développeurs… Cette étape, c’est celle du packaging. Il s’agit pourtant d’une étape essentielle ; la dernière avant la mise à disposition de l’application à l’utilisateur final.

Pour comprendre ce léger « paradoxe », il faut comprendre ce qu’implique la livraison d’une application iOS :

  • L’ouverture manuelle du projet dans l’environnement de développement (Xcode) ;
  • La configuration du projet pour l’export (numéro de version, environnement, certificats, etc.) ;
  • L’exportation / l’upload de l’archive (selon que l’on veuille mettre l’application à disposition sur l’App Store ou sur un magasin d’entreprise).

Si l’on doit réaliser ces étapes manuellement, pour peu que l’on ait plusieurs environnements par application et/ou un parc applicatif assez vaste. La génération et la livraison peut devenir très chronophage.

C’est là qu’entre en jeu le sujet du jour : l’automatisation du packaging grâce à l’association de Jenkins et de Fastlane ! A noter qu’au-delà du gain de temps dû à l’automatisation, il y a aussi un gain de qualité car en limitant autant que possible les interventions humaines dans les processus d’exportation et de publication, on limite aussi grandement les erreurs.

Rapide mise au point sur les outils utilisés

Jenkins 

Jenkins est un outil logiciel d’intégration continu. Il s’agit d’un logiciel open source, développé à l’aide du langage de programmation Java. Jenkins permet l’intégration de toutes les étapes du cycle de développement. L’objectif principal est d’accélérer le développement de logiciels par le biais de l’automatisation. 

Fastlane

Fastlane est un outil open source qui permet de faire du Continuous Delivery sous iOS et Android. Il permet d’automatiser un certain nombre d’étapes de notre build, comme, par exemple, la gestion des provisioning profiles, la compilation, la génération de captures d’écran et la publication sur les stores ou sur des plates-formes telles que Fabric.

Installer Jenkins et créer un agent MacOS

Dans le cadre de cet article, nous utiliserons le mode d’installation et d’utilisation le plus simple : l’utilisation du serveur intégré de Jenkins sur un poste local (mais les instructions pour autres modes d’installations possibles sont disponibles ici).
Pour cela il faut télécharger le dernier WAR stable, puis exécuter la commande suivante dans un terminal ouvert depuis le dossier contenant le fichier WAR : 

Dès lors il suffit d’accéder à l’URL : http://localhost:8080 pour entamer la configuration de Jenkins. 

Configurer Jenkins

Première étape : débloquer Jenkins. Pour cela rien de plus simple.
Vous devrez vous rendre à l’emplacement indiqué en rouge sur la capture ci-dessous, ouvrir le fichier et coller le mot de passe qui s’y trouve dans le champ “Administrator password

Ensuite, Jenkins propose de customiser son usage au travers de l’installation de plugins.
Toujours dans notre optique de simplicité, nous choisirons d’installer les plugins recommandés. Il sera toujours possible de faire le tri ou d’installer de nouveaux plugins plus tard en fonction du besoin.

Dernière étape : la création du compte administrateur. Une fois cette étape complétée, il suffit de valider l’URL d’accès à Jenkins (dans le cas présent http://localhost:8080) et voilà, on peut commencer à utiliser Jenkins !

Création d’un agent MacOS 

La création d’un agent MacOS est semblable à la création d’un agent “normal”.

Pour accéder à l’interface de création depuis l’accueil de Jenkins il faut donc :

  • Cliquer sur “Administrer Jenkins” dans le menu principal ;
  • Dans la liste, trouver et cliquer sur “Gérer les noeuds” ;
  • Dans le menu de la page de gestion des noeuds, cliquer sur “créer un noeud”.

Maintenant, il suffit de suivre le processus de création d’un agent permanent :

Quelques points à noter :

  • La plupart des jobs peuvent être exécutés indifféremment du système d’exploitation de l’agent (à condition que ce dernier soit configuré correctement) mais seul un appareil / serveur MacOS peut exécuter des opérations de builds iOS. Il peut s’avérer intéressant de limiter l’utilisation d’un agent MacOS au seul traitement des tâches iOS si on peut se le permettre.
  • Il est fortement recommandé de passer par une session administrateur créée spécifiquement pour l’exécution de jobs Jenkins plutôt que par une session utilisateur ou administrateur “normale” (c’est implicite quand on travaille avec un serveur mais il est bon de le rappeler si on est amené à travailler sur une machine « personnelle »).

Si la première connexion à l’agent échoue, c’est normal ! En effet, bien que SSH soit installé par défaut sur MacOS, les connexions extérieures ne sont pas autorisées. Exécuter la commande ci-dessous sur l’agent palliera ce problème.

Installer Fastlane

Avant même d’installer Fastlane, nous allons installer quelques outils qui nous faciliteront la vie. Il faudra aussi installer les outils de ligne de commande d’Xcode, sans quoi il sera impossible de builder une application via le terminal.

Installer Homebrew

Homebrew est un gestionnaire de package pour MacOS (au même titre que aptitude pour Ubuntu).
Pour cela il suffit de lancer la commande suivante :

Installer RVM (Ruby Version Manager)

Ruby est préinstallé sur MacOS, cependant il s’agit d’une installation principalement destinée à être utilisée par le système. Il est donc recommandé, afin de ne pas altérer l’installation système, d’installer une version indépendante et à jour de Ruby si l’on veut utiliser des gem (packages Ruby).

L’installation se sépare en deux étapes. D’abord, l’approbation des clés de sécurité :

Remarque : En cas de problème, n’hésitez pas à consulter l’aide fournie à cette adresse.

La seconde étape consiste à installer RVM ainsi que la dernière version stable de Ruby.

Installer les outils Xcode

Installer Fastlane

Enfin, le moment d’installer Fastlane est arrivé ! Pour cela rien de plus simple, on a même le luxe de choisir par quel biais faire l’installation :

Selon le moyen d’installation choisi, il est possible que la commande fastlane ne soit pas automatiquement ajoutée au path. Il faut alors éditer le fichier “.bash-profile” avec nano :

Enregistrez le fichier, quittez le terminal et lancez-en un nouveau : Fastlane devrait être opérationnel !

Configurer Fastlane

Maintenant que Fastlane est installé, il faut le configurer sur notre projet, pour cela il faut ouvrir un terminal à la racine de celui-ci et lancer la commande : 

Remarque : Dans le cas d’un projet Ionic et/ou Cordova, l’outil ne détectera pas qu’il s’agit d’un projet iOS, il demandera alors confirmation. Comme le fichier .xcodeproj se trouve dans un sous-dossier, Fastlane ne trouvera pas et il faudra lui fournir le path. 

Une fois le projet initialisé, nous sommes invités à choisir ce que l’on veut faire :

Dans notre cas, nous allons choisir la configuration manuelle car c’est celle qui offre le plus de liberté sur le long terme. Après avoir réalisé ce choix, un dossier “fastlane” contenant deux fichiers (Appfile et Fastfile) est généré à la racine du projet.

Appfile

L’Appfile est un fichier relativement simple dans lequel vont être stockées les données nécessaires à la signature automatique de l’application.
Il est à noter que ce fichier peut rester totalement vide si vous décidez de configurer la signature manuelle dans le Fastfile.

Plus de détails et d’options sont disponibles à cette adresse : https://docs.fastlane.tools/advanced/Appfile/#appfile

Fastfile

Fastfile est le fichier central de notre démarche : il va permettre de signer l’application, d’exporter un package et de le mettre à l’endroit souhaité.

Sur des cas d’utilisation plus poussés, c’est à partir de ce même fichier et de l’action deliver que l’on pourra pousser automatiquement un nouveau build d’une application sur TestFlight ou sur l’AppStore.

Ci-dessous un fichier type qui peut être utilisé pour une signature manuelle avec export de l’IPA (pour une distribution sur un store d’entreprise dans le cas présent).

Le bloc d’en-tête va permettre de définir les actions générales telle que la mise à jour de fastlane ou celle des certificats.

Le bloc platform va quant à lui permettre de définir des actions à effectuer uniquement pour la plateforme citée. Ce bloc sera surtout utilisé dans le cas de projets d’applications cross-platform (type Ionic/Cordova) qui peuvent être développés pour de multiples systèmes (le plus souvent Android et iOS).

Le bloc gym regroupe toutes les informations nécessaires à la signature et à l’exportation de l’archive IPA de notre application.
Ce bloc ne sera pas toujours aussi fourni, dans le cas de projets sur lesquels la signature automatique est utilisée, l’appel n’aura la plupart du temps que deux ou trois paramètres.

Fastlane est maintenant en mesure de signer et exporter l’IPA de notre application si l’on exécute la commande 

Automatiser le processus avec un job Jenkins

Maintenant que l’on est en mesure de générer et d’exporter un package via l’exécution manuelle d’une commande fastlane (ce qui représente déjà un gain de temps considérable). Il reste à mettre en place un job Jenkins pour automatiser l’exécution de cette commande.

Pour cela, sur la page d’accueil de Jenkins, il faut cliquer sur “Nouveau Item” dans le menu.

Il faut ensuite nommer le projet et définir son type (dans notre cas free-style).

Après quoi nous pouvons attaquer la configuration et là encore rien de bien sorcier, je vais cependant détailler les étapes nécessitant des configurations spécifiques :

Général et Build. 

Général

Notre application de test étant une application iOS, il faut impérativement restreindre l’exécution du job à notre agent MacOS, sans quoi tous les builds échoueront.

Build

Dans la section build nous allons ajouter une étape “Exécuter un script shell”.
Le script en question est le suivant :

Envie d’aller plus loin ? 

Cet article était long, vous y avez appris à automatiser le build de votre application mais vous voulez aller plus loin ? Voici quelques pistes et liens qui pourront vous aider à satisfaire votre curiosité : 

  • deliver, action fastlane qui vous permettra de pousser votre application sur l’AppStore et même de mettre à jour le contenu de sa page de présentation.
  • sigh et match, deux actions pour gérer plus simplement les provisionning profiles : création, récupération, renouvellement automatique, synchronisation entre tous les membres d’une équipe de développement, etc.
  • gérer plusieurs environnements plus simplement. 

Les possibilités sont nombreuses, à vous de les explorer ! 

iMDEO recrute !

A la recherche de nouveaux talents (développeurs web et mobile, chefs de projet,...)

REJOIGNEZ-NOUS

A la recherche de nouveaux talents (développeurs web et mobile, chefs de projet,...)

Voir les annonces