Publié par
Il y a 1 année · 7 minutes · iOS, Mobile

Automatiser signature, testing et déploiement avec Fastlane

fastlane et iOsDans l’écosystème iOS, Fastlane est un outil très pratique et complet pour automatiser beaucoup 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, encore, sur des plates-formes telles que Fabric.

Nous avions parlé de Fastlane, développé par Felix Krause, dans quelques unes de nos revues de presse. Dans cet article, vous découvrirez plus en détail comment utiliser cet outil qui permet d’automatiser beaucoup d’étapes de la livraison d’une application iOS.

Fastlane est très bien documenté : une documentation complète est disponible sur le dépôt du projet.

L’installation de Fastlane

Nous commençons notre article par l’installation de l’outil, qui se fait par le biais d’une vérification d’installation des command line tools de Xcode :

$ xcode-select --install

Ensuite, nous installons la gem de Fastlane :

$ sudo gem install fastlane —verbose

Le wizard

La première vraie étape est l’initialisation de Fastlane dans notre projet.

$ cd [your_project_folder]
$ fastlane init

Cette deuxième commande démarrera un wizard pour configurer Fastlane dans notre projet.

Le Fastfile

À la fin de cette étape, un fichier Fastfile sera généré dans le dossier Fastlane, à l’intérieur de notre projet.

Le fichier Fastfile contient toutes les informations nécessaires à l’automatisation des nos opérations, y compris la définition des lanes, qui contiennent la liste des tâches (ou actions) nécessaires pour automatiser notre build.

Une lane peut être exécutée à partir du terminal avec la commande :

fastlane NOM_DE_LA_LANE

L’Appfile

L’Appfile, stocké dans le dossier fastlane, contient des informations globales qui sont utilisées par tous les outils de la suite Fastlane, telles que l’Apple ID ou le bundle identifier de l’application.

Un exemple de Appfile est le suivant :

# Definit le bundle identifier
app_identifier "fr.xebia.monAppli" 
 
# Definit l'Apple ID du compte associé au compte de l'appli 
apple_id "xxx@xebia.fr"

Les actions

Comme dit précédemment, une lane se compose de plusieurs actions enchaînées. Mais quelles actions pouvons-nous utiliser ?

La liste complète des actions disponibles sur fastlane peut être consultée par le biais de la commande :

fastlane actions

De plus, pour visualiser des détails supplémentaires sur une action en particulier, nous pouvons utiliser la commande :

fastlane action NOM_ACTION

Si vous avez besoin de plus d’informations concernant une action, connectez-vous à la documentation disponible sur GitHub et notamment sur actions.mdXXX qui se complète par quelques exemples d’usage.

Quelles actions sont disponibles ?

À date, les actions disponibles sur Fastlane sont plus de 150, dont certaines font partie de l’initiative Fastlane, tandis que d’autres sont maintenues par des développeurs tierces.

Pour iOS, les actions core, à date sont au nombre de 10 :

  • deliver
  • snapshot
  • frameit
  • pem
  • sigh
  • produce
  • cert
  • scan
  • gym
  • match

Parmi ces dernières, sigh est probablement une des plus intéressantes, car elle permet d’automatiser un processus qui est souvent complexe et qui comporte beaucoup de procédures manuelles à effectuer sur le portail développeur Apple.

Sigh met à disposition de l’utilisateur les fonctionnalités suivantes :

  • manage, pour gérer les provisioning profiles installés dans notre système ;
  • renew et repair, pour renouveler et corriger les erreurs des profiles d’approvisionnement existants ;
  • resign, pour resigner un IPA.

En outre, la simple exécution de la commande sigh dans le dossier contenant notre xcproject permettra la création automatique des profiles nécessaires à l’application en objet, comme montre l’image ci-dessous.

Un exemple de fastline

Un autre atout majeur de sigh consiste dans la possibilité de l’utiliser en tant que commande du terminal, ce qui vous permettra de simplifier des tâches complexes sans besoin de mettre tout le reste du framework Fastlane.

Un exemple de Fastfile

Nous allons terminer cet article avec un exemple de lane qui permet de compiler une application, de la tester et de la distribuer via Fabric.

Pour ce faire, il nous suffit simplement de modifier le ficher Fastfile à l’intérieur du dossier MON_PROJET/fastlane/Fastfile.

Pour commencer, nous indiquons la version de Fastlane (qui est pré-remplie au moment de la configuration automatique) et précisons une plate-forme par défaut (dans notre exemple, ios).

fastlane_version "1.46.1"
default_platform :ios

Ensuite, nous allons ouvrir la balise platform, ce qui indique que les étapes suivantes seront applicables seulement dans le cas d’un build pour l’environnement iOS.

platform :ios do

Nous allons spécifier maintenant les paramètres globaux qui sont communs à toutes nos lanes. Pour ce faire, nous allons employer la fonction before_all, qui s’exécute avant le lancement manuel de n’importe quelle lane.

  # Enregistre les paramètres globaux
  before_all do

    # Slack
    ENV["SLACK_URL"] = "XXX"

    # Crashlytics / Fabric
    ENV["CRASHLYTICS_API_TOKEN"] = "XXX"
    ENV["CRASHLYTICS_BUILD_SECRET"] = "XXX"
    ENV["CRASHLYTICS_EMAILS"] = "XXX"
    ENV["CRASHLYTICS_GROUPS"] = "XXX"

    # Projet Xcode pour la montée de version
    ENV["FL_BUILD_NUMBER_PROJECT"] = "MonAppli.xcodeproj"

    # Compilation (gym)
 # Nous explicitons le répertoire DerivedData afin de pouvoir facilement 
 # effacer les artifacts temporaires du build
    ENV["GYM_OUTPUT_DIRECTORY"] = "./DerivedData/"
    ENV["GYM_ARCHIVE_PATH"] = "./DerivedData/"
  end

L’étape suivante est le cœur de notre Fastfile : elle contient les actions qui définissent notre processus de build. Les étapes sont directement commentées dans le code.

  # La lane de distribution
  lane :distribute do

    # Execute les tests
    scan(code_coverage: true, xcargs: "-derivedDataPath ./DerivedData")

    # Collecte (via Slather) le taux de couverture des tests 
 # L'action 'slather' est aussi disponible mais, à date, elle n'est pas à jour
    sh("slather coverage --cobertura-xml --scheme MonAppli --output-directory ../artifacts --build-directory ../DerivedData ../MonAppli.xcodeproj")
    
    # Crée une variable build_number et version_number, qui corréspond à la date courante
    build_number = Time.new.strftime("%Y%m%d.%H%M")
    version_number = Time.new.strftime("%Y.%m")

    # Incrémente le numéro de version dans les métadonnées du projet Xcode
    increment_build_number(build_number: build_number)
    increment_version_number(version_number: version_number)

    # Récupère le changelog à partir des commits
    changelog = changelog_from_git_commits

    # Vérifie et met à jour les certificats installés
    sigh
    
    # Compile l'application en utilisant les variables spécifiées
    gym(scheme: MonAppli)
    
    # Distribue l'application sur Fabric
    crashlytics(notes: changelog)

    # Notifie l'équipe via Slack
    slack(message: "Successfully deployed new App Update.")
    # Commit (git) automatiquement la version actuelle 
    commit_version_bump

    # Push (git) automatiquement les modifications vers master
    push_to_git_remote(local_branch: 'HEAD', remote_branch: 'master', force: true)
  end

Enfin, pour terminer notre Fastfile, nous allons écrire une fonction qui sera appelée lorsque la build a échoué. Cette étape contient un simple appel à Slack, vers lequel nous enverrons le contenu du message d’échec.

  # Envoie un message d'erreur à Slack si besoin
  error do |lane, exception|
    slack(
      message: exception.message,
      success: false
    )
  end
# Fermeture de la balise platform
end

Le fichier Fastfile complet contenant tous les éléments de cet article est disponible à l’adresse https://gist.github.com/viteinfinite/55e6d158172a4b46dff7.

Conclusion

Comme nous avons vu, il est très simple de prendre en main l’outil grâce à une excellente automatisation des actions proposées. Cependant, pour certaines commandes (notamment gym), la connaissance du mode de fonctionnement des outils xcodebuild et xcrun peut être précieuse pour mieux comprendre les paramètres à utiliser.

Aussi, comme vous pouvez l’imaginer, vu la quantité d’actions disponibles les possibilités d’extension sont presque illimitées. À titre d’exemple, parmi les étapes pouvant être rajoutées, nous apprécions particulièrement snapshot, qui permet d’enregistrer les écrans de notre application tout en en exécutant les tests UI, et deliver, qui automatise la soumission de tout types de données vers iTunes Connect, y compris les screenshots, les metadonnées textuelles et le binaire de l’application même.

Pour conclure, Fastlane est en évolution continue et nous avons hâte de découvrir les nouvelles actions et fonctionnalités qui pourront enrichir notre processus de build.

Simone Civetta
Simone est responsable technique des équipes mobilités chez Xebia. Il est également formateur au sein de Xebia Training .

Laisser un commentaire

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