Gérer facilement ses applications Heroku avec des alias

Attention : Cet article présente une solution basée sur une fonctionnalité spécifique à ZSH.

Si comme nous vous hébergez certaines applications chez Heroku, vous devez souvent jongler entre deux apps : staging et production. Il est même fort possible que d’autres apps soient présentes.

Cela oblige en général à préciser l’option --app pour chaque commande heroku, ce qui peut devenir fastidieux.

Une solution acceptable serait de pouvoir simplement taper PROD ou PR en fin de ligne et que l’app de production soit utilisée.

Définir un alias pour chaque environnement de chaque projet ne semble cependant pas la marche à suivre. Comment faire ?!

TL ;DR

Utilisez direnv et les alias globaux de ZSH.

Organisation

Partons de la situation suivante : nous avons deux projets, project1 et project2 avec chacun un environnement staging et un environnement production.

Nous avons donc les apps Heroku suivantes :

  • project1-staging ;
  • project1-production ;
  • project2-staging ;
  • project2-production.

Chaque projet est accessible localement dans ~/apps/project1 et ~/apps/project2.

Le but : pouvoir, pour chaque projet, exécuter des commande en staging avec

$ heroku <command> ST

et en production avec

$ heroku <command> PR

Alias ZSH

Première étape, nous allons ajouter deux alias globaux dans notre configuration ZSH :

# ~/.zshrc

alias -g PR='--app=$PRODUCTION'
alias -g ST='--app=$STAGING'

Deux choses importantes à retenir ici :

  • l’option -g qui permet d’utiliser ces alias n’importe où sur une ligne de commande ;
  • l’utilisation des guillemets simples qui n’interprètent pas les variables à la création des alias.

Pour fonctionner, ces alias ont besoin de deux variables d’environnement : $PRODUCTION et $STAGING.

Il ne reste plus qu’à définir ces deux variables pour chaque projet.

Configurer Direnv

C’est ici que direnv entre en scène. Cet outil permet de gérer des environnements variables en fonction du dossier dans lequel on se trouve… intéressant !

On peut donc définir des variables d’environnement différentes pour ~/apps/project1 et ~/apps/project2, exactement ce qu’il nous faut.

Direnv est généralement packagé pour les principaux systèmes, sous OS X il peut s’installer à l’aide de Homebrew :

$ brew install direnv

Une fois installé il faut le charger au lancement de ZSH, on ajoute donc la ligne suivante :

# ~/.zshrc
eval "$(direnv hook $0)"

Il ne reste plus qu’à créer les fichiers de configuration pour chaque projet. Ce fichier nommé .envrc est simplement une liste d’exports de variables :

  $ cd ~/apps/project1
  $ echo "export STATING=project1-staging" > .envrc
  direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
  $ echo "export PRODUCTION=project1-production" >> .envrc
  direnv: error .envrc is blocked. Run `direnv allow` to approve its content.

Direnv nous demande d’autoriser le fichier, un simple mécanisme de sécurité :

$ direnv allow .
direnv: loading .envrc
direnv: export +PRODUCTION +STATING

Profiter

Maintenant que nous avons nos alias et les variables chargées, nous pouvons effectuer un premier test :

$ cd ~/apps/project1
direnv: loading .envrc
direnv: export +PRODUCTION +STATING
$ echo PR
--app=project1-production
$ echo ST
--app=project1-staging

Parfait, nos variables sont bien interprétés à l’utilisation des alias. Nous pouvons donc les utiliser pour nos commandes Heroku :

$ heroku logs PR
...
logs de l'application
...

Appliquez le même procédé pour chaque projet et vous pourrez taper la même commande dans chaque projet avec une configuration spécifique.

Et vous, comment optimisez-vous votre environnement de travail ?

Publié le 19 janvier 2015

Notre vision des choses vous correspond ? Vous avez envie de travailler avec nous ?