always­da­ta vous offre un grand nombre d’accès dis­tants à vos comptes : SSH, FTP, WebDAV… Pourtant, déployer un site ou un ser­vice en pro­duc­tion manque par­fois de sou­plesse. Alors nous avons pen­sé à vous.

sarcastic joke GIF @Giphy

Oh oui alwaysdata, raconte-nous le déploiement !

Il y a des choses par­fois plus simples que d’autres dans nos métiers de développeur·euse·s. Le déploie­ment ne fait mal­heu­reu­se­ment pas par­tie de celles-ci. Entre la livrai­son en FTP, à l’ancienne ; la copie de fichier en SFTP ; l’application de patch à dis­tance… Il y en a pour tous les goûts et tous les pro­jets.

Une solu­tion comme Heroku l’a bien com­pris : celui ou celle qui pro­duit le code n’a pas à s’ennuyer avec les pro­blé­ma­tiques liées au déploie­ment, mais doit se concen­trer sur son métier : pro­duire un code de qua­li­té. Or tout le monde n’a pas la main sur un·e DevOp qui va se char­ger de mettre en pro­duc­tion la der­nière ver­sion pour vous lais­ser tra­vailler. Dans ce cas, vous n’avez pas le choix, il va fal­loir vous en occu­per vous-même.

Parce qu’always­da­ta est un héber­ge­ment pen­sé par des déve­lop­peurs, nous nous sommes inter­ro­gés sur la bonne manière de déployer en pro­duc­tion. Nous avons dans nos pro­jets un outil d’automatisation des pro­ces­sus de déploie­ment, mais la prio­ri­té va d’abord au sup­port d’autres tech­nos comme HTTP/2.

Alors en atten­dant, nous avons cher­ché à vous sim­pli­fier la vie. Et tout comme vous, nous pré­fé­re­rions faire nos livrai­sons en une ligne de com­mande. On s’est donc pen­chés sur un déploie­ment via Git.

Git push. Point.

excited friends tv GIF @Giphy

Voilà donc ce que nous vous pro­po­sons, à l’image de ser­vices conte­neu­ri­sés : un simple git push d’une branche de pro­duc­tion et c’est réglé.

TL;DR : Si vous sou­hai­tez com­prendre la méca­nique parce que vous êtes curieux·euse, conti­nuez ici. Si vous sou­hai­tez juste mettre en place le déploie­ment, vous pou­vez direc­te­ment vous rendre sur le dépôt GitHub always­da­ta/au­to­de­ploy-git-hook où un README suc­cinct vous gui­de­ra sur la mise en place.

Voyons com­ment démar­rer. Il vous fau­dra :

  • un accès SSH pour les réglages
  • votre code ver­sion­né avec Git
  • connaître les prin­cipes des git-hooks (mais ça, on va vous expli­quer)
  • des œufs, de la farine, du lait

Côté serveur

Commençons par créer un dépôt git conte­nant votre pro­jet sur votre ser­veur always­da­ta (bien enten­du, je vous laisse le soin d’adapter les che­mins à votre conve­nance, rien d’obligatoire) :

Nous ini­tia­li­sons le dépôt en ver­sion bare, c’est-à-dire qu’il ne contient que les fichiers de config et de ver­sio­ning. Dans notre cas, comme nous ne cher­chons à faire que du déploie­ment, nous n’avons pas besoin de plus.

Ensuite, nous allons créer un script de post-receive. C’est lui qui, comme son nom l’indique, sera appe­lé lors d’un push vers ce dépôt, avec les réfé­rences vers la branche pous­sée. Nous allons nous en ser­vir pour tes­ter la branche (par exemple, une branche nom­mée production), et déployer le conte­nu de celle-ci vers le dos­sier ser­vi par notre ins­tance Apache. Créez donc sur votre ser­veur un fichier ~/mon-projet.git/hooks/post-receive avec le conte­nu sui­vant :

Nous tes­tons que c’est bien la branche production qui vient d’être pous­sée, et nous réa­li­sons dans ce cas un checkout vers le dos­sier ~/www/mon-projet (le che­min que vous avez défi­ni pour votre site dans l’interface d’administration) qui contient les fichiers ser­vis par le ser­veur HTTP.

N’oubliez pas de rendre le script exé­cu­table avec chmod +x ~/mon-projet.git/hooks/post-receive.

En local

Revenez main­te­nant dans votre dépôt local sur votre machine de déve­lop­pe­ment. Rendez-vous dans votre pro­jet, et ajou­tez le dépôt de déploie­ment situé sur votre ser­veur always­da­ta :

Et voi­là ! Il vous suf­fit main­te­nant de pous­ser la branche production vers ce dépôt, et le déploie­ment sera auto­ma­tique :

Désormais, il vous suf­fit de merge sur votre branche de production la der­nière ver­sion à déployer, de git push sur le ser­veur, et le tour est joué !

Oui, mais moi, je ne fais pas que déployer des fichiers statiques

Alors effec­ti­ve­ment, nous avons illus­tré un cas assez simple ici, et nous sommes conscients que vous avez pro­ba­ble­ment d’autres rou­tines à mettre en place lors d’un déploie­ment.

Vous pou­vez, par exemple, avoir besoin de relan­cer votre ins­tance Apache pour que les chan­ge­ments soient pris en compte. Dans ce cas, il suf­fit d’ajouter au hook post-receive la ligne sui­vante, juste après l’instruction git checkout :

Cette requête cURL va appe­ler l’API d’always­da­ta en uti­li­sant votre clé d’API, nom de compte, et iden­ti­fiant de site à redé­mar­rer pour relan­cer le ser­vice de façon trans­pa­rente.

Là encore, rien de plus à faire désor­mais que de pous­ser la branche de production.

Encore !

theres more cole sprouse GIF @Giphy

Vous en vou­lez encore ? Avec plai­sir !

Vous avez pro­ba­ble­ment besoin d’automatiser le pro­ces­sus sur plu­sieurs sites. Nous avons donc libé­ré le code source de ce petit hook sur le dépôt GitHub always­da­ta/au­to­de­ploy-git-hook. Le script est confi­gu­rable avec des variables bash en haut du fichier, pour que vous ayez le moins de chan­ge­ments à effec­tuer.

Nous sommes mal­gré tout conscients que ce script est encore rudi­men­taire. Vous avez pro­ba­ble­ment des migra­tions à jouer sur vos bases de don­nées, ou des appels à faire pour mettre à jour vos assets sta­tiques lors d’une mise à niveau. N’hésitez pas à nous faire part de vos besoins dans les issues du dépôt, ou à pro­po­ser vos pull-requests pour que nous puis­sions amé­lio­rer encore cet outil ensemble.

helpful bill murray GIF @Giphy