Il y a 2 mois · 4 minutes · Mobile

Advanced Fastlane avec dotenv

Logo Fastlane

Dans un précédent article, Automatiser signature, testing et déploiement avec Fastlane, nous vous avons expliqué comment débuter avec Fastlane. Aujourd’hui nous vous montrons comment l’utiliser de manière avancée via la gestion des environnements avec dotenv.

dotenv

dotenv vous permet de gérer un projet multi-environnement au travers de fichiers.

Il vous suffit de passer --env dans votre ligne de commande pour l’utiliser avec Fastlane.

fastlane distribute --env prod

dotenv va alors charger les fichiers de configuration suivants (dans l’ordre) et ajouter les valeurs dans ENV:

  • .env
  • .env.default
  • .env.<line-option> (ici, .env.prod)

dotenv + fastlane

Prenons le Fastfile du précédent article et voyons comment utiliser dotenv pour gérer deux environnements :

  • Préprod
  • Prod
default_platform :ios

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

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

lane :distribute do |options|
 scan(code_coverage: true)
 increment_build_number
 sigh()
 gym(scheme: monAppli)
 crashlytics(notes: changelog_from_git_commits)
 slack("Successfully deployed new App Update.")
 commit_version_bump
 push_to_git_remote(local_branch: 'HEAD', remote_branch: 'master')
end

private_lane :inc_build do
 build_number = Time.new.strftime("%Y%m%d.%H%M")
    version_number = Time.new.strftime("%Y.%m")

 increment_build_number(build_number: build_number)
    increment_version_number(version_number: version_number)
end

Valeurs communes

1ère étape : nous pouvons sortir nos variables ENV pour les placer dans .env :

# Slack
SLACK_URL = "XXX"

# Crashlytics / Fabric
CRASHLYTICS_API_TOKEN = "XXX"
CRASHLYTICS_BUILD_SECRET = "XXX"

Nous pouvons également variabiliser :

  1. Le nom de notre application
  2. Les informations de versioning (git)
# utilisé par gym
GYM_SCHEME = monAppli 

# utilisés par push_to_git_remote
FL_GIT_PUSH_LOCAL_BRANCH = HEAD
FL_GIT_PUSH_REMOTE_BRANCH = master

Ce qui nous donne le Fastfile suivant :

default_platform :ios

lane :distribute do |options|
 scan(code_coverage: true)
 increment_build_number
 sigh()
 gym()
 crashlytics(notes: changelog_from_git_commits)
 slack("Successfully deployed new App Update.")
 commit_version_bump
 push_to_git_remote()
end

private_lane :inc_build do
 build_number = Time.new.strftime("%Y%m%d.%H%M")
    version_number = Time.new.strftime("%Y.%m")

 increment_build_number(build_number: build_number)
    increment_version_number(version_number: version_number)
end 

Appfile

Deuxième point important avant de pouvoir créer nos environnements : l’app identifier. Sa valeur est définie dans Appfile de deux manières différentes :

  1. soit de manière statique
  2. soit en fonction de la lane executée
# Solution 1
app_identifier "fr.xebia.monAppli" 

# Solution 2
for_lane :distribute do
 app_identifier "fr.xebia.monAppli" 
end

for_lane :distribute_preprod do
 app_identifier "xxx" 
end

Problème : La solution 1 ne nous permet pas de définir un app identifier par environnement. Quant à la solution 2, elle est inapplicable : nos utilisons les même lanes pour tous les environnements.

La solution la plus simple est de transformer app identifier en variable d’environnement, pour pouvoir ensuite la définir dans nos .env :

app_identifier ENV['APP_IDENTIFIER']
# Valeur par défaut dans notre fichier .env
APP_IDENTIFIER = fr.xebia.monAppli

Environnements

Preprod

preprod a les caractéristiques suivantes :

  • Son scheme (GYM_SCHEME) s’appelle monAppli-Preprod
  • Son provisioning profile s’appelle Mon Appli Preprod, et l’export (GYM_EXPORT_METHOD) est de type development
  • L’app identifier (APP_IDENTIFIER) est fr.xebia.monAppli.preprod

Voici le fichier .env.preprod  :

GYM_SCHEME = monAppli-Preprod
GYM_EXPORT_METHOD = development
APP_IDENTIFIER = fr.xebia.monAppli.preprod

Prod

prod a les caractéristiques suivantes :

  • Son scheme (GYM_SCHEME) est monAppli
  • L’app identifier est fr.xebia.monAppli

Comme ce sont les valeurs par défaut définies dans notre fichier .env, il n’y a rien à mettre dans celui de .env.prod ! Facile non ?

Aller plus loin

Jusqu’à présent les variables d’environnements que nous avons utilisées sont celles définies par Fastlane. Vous pouvez cependant très bien définir les vôtres.

Par exemple, avec la version actuelle du Fastfile nous ne sommes capables d’uploader que sur Fabric. Si nous souhaitons gérer ce dernier ainsi que iTunes, nous pouvons créer de nouvelles variables d’environnements :

default_platform :ios
 
lane :distribute do |options|
    scan()
    increment_build_number
    sigh()
    gym()
 
    crashlytics(notes: changelog_from_git_commits) if ENV["UPLOAD_CRASHLYTICS"] == true
    deliver() if ENV["UPLOAD_ITUNES"] == true
 
    slack("Successfully deployed new App Update.")
    commit_version_bump
    push_to_git_remote()
end

Nous pouvons ensuite définir UPLOAD_CRASHLYTICS et UPLOAD_ITUNES dans nos .env.

UPLOAD_CRASHLYTICS = true
UPLOAD_CRASHLYTICS = false
UPLOAD_ITUNES = true

Conclusion

Vous savez maintenant utiliser Fastlane avec des environnements. En y regardant de plus près vous verrez que nous avons réussi à rendre générique notre Fastfile : il est agnostique de tout environnement. Nous avons un fichier Fastfile réutilisable sur tous nos projets !

Mais ce n’est pas tout, vous pouvez dorénavant définir et configurer autant d’environnements que vous le souhaitez. À vous les joies de dev, test, integ, pre-preprod, post-prod, … Enjoy!

Jean-Christophe Pastant
Consultant iOS, fervent défenseur du code de qualité.

Laisser un commentaire

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