Ajout d'un bouton Heroku Deploy
Dans le cadre des missions réalisées pour Azimutt, j'ai été chargé d'intégrer le bouton "Deploy to heroku" permettant de lancer l'app directement sur Heroku avec un minimum de configuration.
Fonctionnement
Pour ajouter un bouton Heroku à son repo, il faut ajouter un fichier app.json
à la racine de celui-ci. (Pas terrible comme nommage, rien n'indique que c'est spécifique Heroku).
Ce fichier permet de définir les meta données du déploiement: nom, description, logo, tags. La façon de le déployer, les éventuels addons et les variables d'environnement.
Application à Azimutt
Environnement d'éxecution
Par défaut, Heroku tente de déployer le projet tel de manière dynamique en détectant la technilogie sous-jacente. S'il détecte du node, il va utiliser un environmment node. Idem s'il détecte du Python.
Azimutt étant un mono-repo avec des dépendances fortes comme Elixir et Elm qui nécessitent l'installation de paquets linux, l'environnement d'exécution sera un container docker
.
Pour cela, il faut préciser l'option "stack": "container"
dans la configuration et ajouter le fichier heroku.yml
à la racine du repo pour indiquer à Heroku comment builder le container (Ici on indique simplement qu'on a un Dockerfile)
Addons
Pour proposer un déploiement simple afin de faciliter la découverte d'Azimutt, j'ai configuré les services nécessaires au bon fonctionnement sous la forme d'addons proposés par Heroku :
heroku-postgresql
comme base de donne Postgresah-s3-object-storage-stackhero
comme storage compatible S3mailgun
comme serveur d'envoi SMTP
Variables d'environnement
Dans le fichier app.json
, on peut configurer les variables d'environnement nécessaires au setup. Dans le cas d'Azimutt, j'ai indiqué les variables minimales pour le fonctionnement et configuré celles qui sont spécifique au déploiement Heroku (S3, mailgun, etc)
Limitations
Nom de host
Azimutt a besoin de connaître l'URL de base du serveur Phoenix pour spécifier des liens vers celui-ci. Sous Heroku, il n'est pas possible de récupérer l'URL qui va être créée avant le déploiement ou via une variable dynamique.
Variables d'environnement des addons
Les addons ajoutent des variables d'environnement à la configuration.
Variables qu'il faut reprendre dans notre code.
Il est possible de configurer un préfixe pour chaque Addon afin de maximiser la compatibilité.
Par contre, lorsqu'il y a plusieurs variables, elles sont identifiées par des sufixes spécifiés par les développeurs des addons.
Ainsi, il faut parfois ré-adapter son l'addon.
Pour palier à ce problème, j'ai indiqué dans la doc d'Azimutt comment configurer ou copier les variables d'environnement afin de les adapter au code.
Ajout du bouton
Afin d'ajouter le bouton, il suffit de copier / coller le code fourni par Heroku dans son readme.md
[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://www.heroku.com/deploy)
Par défaut, l'url heroku.com/deploy
identifie le repo de base via le referrer
. Ce qui est très pratique pour tester sur la branche de développement avant de merge vers la branche principale.
Sinon, il est possible de personnaliser la branche à utiliser avec le paramètre template
.
Tests
Pour tester, on affiche le readme
dans GitHub. Sur la bonne branche si on ne bosse pas sur la principale.
On clic dessus et arrive sur Heroku. On peut vérifier la configuration de base et/ou lancer un déploiement complet pour tester.
On peut également se configurer une URL de test si on souhaite pré-remplir des variables d'envrionnement.
Ex pris dans la doc officielle: https://www.heroku.com/deploy?template=https://github.com/rauchg/slackin/tree/0.5.1&env[SLACK_SUBDOMAIN]=testdomain