Il y a 5 ans -

Temps de lecture 4 minutes

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.

[ruby]fastlane distribute –env prod[/ruby]

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

[ruby gutter= »true »]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[/ruby]

Valeurs communes

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

[text]# Slack
SLACK_URL = "XXX"

# Crashlytics / Fabric
CRASHLYTICS_API_TOKEN = "XXX"
CRASHLYTICS_BUILD_SECRET = "XXX"[/text]

Nous pouvons également variabiliser :

  1. Le nom de notre application
  2. Les informations de versioning (git)

[java gutter= »true »]# 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[/java]

Ce qui nous donne le Fastfile suivant :

[ruby gutter= »true »]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 [/ruby]

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

[ruby]# 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[/ruby]

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 :

[java gutter= »true »]app_identifier ENV[‘APP_IDENTIFIER’][/java]

[java]# Valeur par défaut dans notre fichier .env
APP_IDENTIFIER = fr.xebia.monAppli[/java]

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  :

[java gutter= »true »]GYM_SCHEME = monAppli-Preprod
GYM_EXPORT_METHOD = development
APP_IDENTIFIER = fr.xebia.monAppli.preprod[/java]

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 :

[ruby gutter= »true »]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

[/ruby]

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

[bash]UPLOAD_CRASHLYTICS = true[/bash]

[bash]UPLOAD_CRASHLYTICS = false
UPLOAD_ITUNES = true[/bash]

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!

Publié par Jean-Christophe Pastant

Jean-Christophe est consultant iOS et partage régulièrement ses bonnes pratiques avec la communauté iOS.

Commentaire

Laisser un commentaire

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

Nous recrutons

Être un Sapient, c'est faire partie d'un groupe de passionnés ; C'est l'opportunité de travailler et de partager avec des pairs parmi les plus talentueux.