Déployer simplement ses projets avec PHPloy

Posté le 27 mai 2016 dans Développement

J’ai plusieurs projets persos hébergés sur divers serveurs qui peuvent être des serveurs dédiés, des VPS ou des hébergements mutualisés. Pour mettre à jour ces projets, j’ouvrais Filezilla et selon mon humeur et la taille du projet soit je balançais tout le dossier sur le serveur, soit j’utilisais l’outil intégré à Filezilla qui permet de faire une diff des dossiers / fichiers, et je balançais uniquement ceux qui devaient l’être, récursivement. Idem pour les fichiers à supprimer.

C’est kikoulol hein ? Je connais des sociétés qui procèdent ainsi pour mettre à jour leurs clients. Pour des projets persos passe encore (la seule personne à satisfaire c’est vous-même), mais pour des vrais clients ?

yodawg

Bref, dans tous les cas ce mode de fonctionnement a commencé à me gonfler ces derniers temps, j’ai donc cherché une solution pour simplifier et automatiser un minimum tout ça. Attention, je ne vais pas vous parler de serveurs d’intégration continue, de serveurs de build, de QA et compagnie : il s’agit ici de projets persos. Je cherche une solution simple à mettre en place et qui ne nécessite pas une architecture type NASA.

Introducing PHPloy

La solution que j’ai trouvée se nomme PHPloy. Il s’agit d’un outil de déploiement via (S)FTP écrit en PHP se basant sur Git. Le principe est simple :

  1. Configurer PHPloy pour un projet :
  2. Le ou les serveurs distants sur lesquels déployer (paramètres de connexion FTP, chemin d’installation, etc) ;
  3. Branche Git à utiliser ;
  4. Fichiers ou dossiers à inclure ou exclure (par rapport au dépôt Git) ;
  5. Dossiers à copier post déploiement (sur le serveur) ;
  6. Dossiers à vider post déploiement (sur le serveur) ;
  7. Commandes persos à exécuter pre / post déploiement (sur le poste client) ;
  8. Lancer au moment souhaité la commande qui lance le déploiement (par exemple lors d’un hook Git post-commit) ;
  9. PHPloy s’occupe du reste.

PHPloy fonctionne de manière incrémentielle, c’est à dire qu’il :

  • déploie uniquement les fichiers ayant fait l’objet d’une modification (il supprime évidemment les fichiers qui ont été supprimés) ;
  • la ligne ci-dessus implique qu’il maintient un état actuel du déploiement sur le serveur en enregistrant l’ID du dernier commit déployé ;
  • la ligne précédente implique finalement qu’il est possible d’effectuer des rollbacks si quelque chose a foiré.

Pour clarifier les choses : PHPloy est utilisé indépendamment de vos serveurs vers lesquels déployer, c’est à dire qu’il n’y a rien à installer sur ces derniers (c’était un de mes critères de sélection).

Installation

Téléchargez le dernier .phar de PHPloy ici (dans l’archive ZIP, il est dans le dossier bin) puis placez-le dans le répertoire root de votre projet sous Git. Renommez-le simplement en phploy afin d’éviter de s’emmerder à écrire l’extension à chaque fois que nous l’utiliserons en ligne de commande. Vous pouvez également l’installer globalement.

Configuration

Basique

Maintenant, créons le fichier de configuration d’exemple avec php phploy --init en vous assurant au préalable d’être dans votre répertoire de travail. Le fichier créé, se nommant phploy.ini, devrait avoir cette gueule :

; NOTE: If non-alphanumeric characters are present, enclose in value in quotes.

[staging]
    quickmode = ftp://example:password@production-example.com:21/path/to/installation

[production]
    scheme = sftp
    user = example
    pass = password
    host = staging-example.com
    path = /path/to/installation
    port = 22

Nous pouvons voir que ce fichier est divisé en sections, chaque section est un serveur - le nom du serveur est donné par le nom de la section, entre crochets. Vous pouvez donc définir autant de serveurs que désiré. PHPloy est capable de déployer sur un, plusieurs ou tous ces serveurs en même temps (référez-vous à la doc pour plus d’infos).

Maintenant, remplacez tout le contenu de ce fichier par celui-ci, puis renseignez les valeurs qui vont bien, en fonction de votre configuration évidemment. Perso, je préfère la version détaillée de la configuration de la connexion au lieu du quickmode, c’est plus lisible.

[default]
    scheme = ftp
    user = ahah
    ; Pas obligé de renseigner de mot de passe. PHPloy vous le demandera si ce n'est pas le cas.
    ; Ou alors, vous pouvez utiliser une clé privée (voyez la doc)
    pass = ohohooh
    host = ftp.omfg.fr
    path = /var/www/omfg
    port = 21
    branch = master

Nous déployons dans ce cas sur un seul serveur qui sera celui utilisé par défaut par PHPloy dans tous les cas (à cause du nom réservé default).

Plusieurs serveurs

Une config pour plusieurs serveurs ressemblerait à ça (dans ce cas je tape sur le même serveur FTP, mais ça pourrait très bien être deux serveurs séparés) :

[prod]
    scheme = ftp
    user = ahah
    pass = ohohooh
    host = ftp.omfg.fr
    path = /var/www/omfg
    port = 21
    branch = master

[dev]
    scheme = ftp
    user = ahah
    pass = ohohooh
    host = ftp.omfg.fr
    path = /var/www/omfg_dev
    port = 21
    branch = dev

Trucs sympas

PHPloy travaille main dans la main avec Git et les fichiers qui sont sous son contrôle, mais il y a certains cas où vous voudrez le forcer ou non à faire des trucs. Vous pouvez donc exclure ou inclure des fichiers ou dossiers :

    exclude[] = 'src/*.scss'
    exclude[] = '*.env.example'
    include[] = 'js/app.min.js'
    include[] = 'repertoire/'

Copier des répertoires après déploiement (sur le serveur) :

    copy[] = 'public->www'

Vider le contenu de certains dossiers après déploiement (par exemple : vider le cache) :

    purge[] = 'cache/'

Et finalement lancer des commandes persos pré et post déploiement (sur le poste client) :

    pre-deploy[] = 'minify --output js/app.min.js js/common.js js/tabs.js js/menu.js'
    post-deploy[] = 'mail -s "Déploiement OK :)" admin@omfg.fr'

Les paramètres se terminant par des crochets - vous l’aurez compris - peuvent être présents plusieurs fois, et sont chaînés en étant appelés dans l’ordre.

Deploy all the things

Avant de lancer le déploiement, vous pouvez lister les fichiers qui seront uploadés et supprimés avec php phploy -l :

---------------------------------------------------
|                   PHPloy v4.2                   |
---------------------------------------------------
LIST mode: No remote files will be modified.
No revision found - uploading everything...
Your branch is up-to-date with 'origin/master'.

SERVER: dev
   Files that will be uploaded in next deployment:
      public/.htaccess
      public/css/app.css
      public/css/bootstrap.min.css
[...]

Pour déployer sur un seul serveur en utilisant le fichier de config ci-dessus, faites php phploy -s {nom du serveur}. Si le paramètre -s n’est pas présent, PHPloy va déployer sur tous les serveurs configurés sauf si un serveur du nom de default est configuré, auquel cas il ne déploiera que sur ce dernier. Finalement, quoi que vous utilisiez, vous devriez avoir un truc de ce style qui s’affiche :

---------------------------------------------------
|                   PHPloy v4.2                   |
---------------------------------------------------
No revision found - uploading everything...
Your branch is up-to-date with 'origin/master'.

SERVER: dev
 ^   1 of 370 public/.htaccess
 ^   2 of 370 public/css/app.css
 ^   3 of 370 public/css/bootstrap.min.css
 ^   4 of 370 public/css/font-awesome.min.css
[...]

Dans ce cas, j’ai jamais exécuté PHPloy sur le serveur cible, c’est pourquoi il me dit qu’il n’y a pas de révision trouvée et qu’il y a des centaines de fichiers à envoyer. Rassurez-vous, phploy.ini ne sera jamais déployé sur les serveurs distants.

Ça a foiré

Pas de soucis ! php phploy --rollback vous permet de revenir en arrière si vous remarquez un problème après le déploiement. Transformez --rollback en --rollback="{hash d'un commit}" et vous pourrez même revenir en arrière vers un commit bien précis.

Et voilà, c’est tout. Lisez la doc pour avoir toutes les infos.