Il y a 7 ans -
Temps de lecture 7 minutes
Automatiser signature, testing et déploiement avec Fastlane
Dans 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 :
[ruby]# 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"[/ruby]
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
etrepair
, 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 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
).
[ruby]fastlane_version "1.46.1"
default_platform :ios
[/ruby]
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.
[ruby]platform :ios do[/ruby]
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.
[ruby] # 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
[/ruby]
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.
[ruby] # 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
[/ruby]
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.
[ruby] # 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[/ruby]
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.
Commentaire