Habituellement, je développe en java et j'utilise un Jenkins pour l'intégration continue. Récemment, j'ai développé un petit projet perso, pur front-end, ce qui est totalement nouveau pour moi ; le projet en question est une mini console d'administration pour WildFly.

Pour être dans l'ère du temps, j'ai préparé une image Docker qui fait tourner un serveur Apache httpd sur lequel est déployée la console. Et pour faciliter l'utilisation et la distribution de cette image, elle est sur le Hub Docker. Voyons la chaîne d'intégration continue in ze cloud et gratuite qui met à jour mon image à chaque fois que mon code est mis à jour sur GitHub.



GitHub

Le point de départ est le code source. Il est stocké dans un repository public sur GitHub.

Hub Docker et build automatique

Le point d'arrivée est l'image Docker publiée sur le Hub. L'image y est construite directement avec un "build automatique" ; pour cela, j'ai mis un Dockerfile sur GitHub dans un repository dédié. A chaque mise à jour du Dockerfile, le build est relancé. Un build peut aussi être déclenché manuellement sur le site, ou en envoyant une requête à une certaine URL.
curl --data "build=true" -X POST https://registry.hub.docker.com/u/$DOCKER_USERNAME/fly-ng/trigger/$DOCKER_KEY/
L'image Docker est construite sur la base de sewatech/apache qui est une Debian avec Apache Httpd à laquelle j'ajoute les fichiers de la console.

Le but, maintenant, c'est de faire le build de l'application, avec gulp, de stocker l'archive construite pour qu'elle soit disponible pour la construction de l'image.
FROM sewatech/apache
RUN apt-get update && apt-get install -y curl &&\
rm -r /var/www/html/* &&\
(curl -skL https://bintray.com/artifact/download/hasalex/generic/fly-ng.tar.gz \
| tar xfz - -C /var/www/html/)
Comme on peut le voir sur le script, l'archive contenant la console est téléchargée depuis mon compte Bintray.

Bintray

Bintray héberge des repositories maven, debian, rpm, docker ou génériques. Un repository générique n'a pas de structure et de méta-données particulières, il peut stocker toute sorte de fichiers. Et Bintray est gratuit pour le stockage de fichiers sous licence open source.

Pour uploader un fichier, on peut utiliser la ligne de commande avec curl.
curl -T ./dist/fly-ng.tar.gz -H "X-Bintray-Publish: 1" -H "X-Bintray-Override: 1" -u$BT_USERNAME:$BT_KEY https://api.bintray.com/content/$BT_USERNAME/generic/fly-ng/0/fly-ng.tar.gz

Travis CI

Travis CI est une plateforme d'intégration continue qui peut être utiliser gratuitement pour faire le build de repositories publics sur GitHub. Elle est capable de faire des builds pour Java, Ruby, ... et Node.JS. C'est cette dernière possibilité que j'exploite puisque j'utilise gulp pour mon petit projet et que gulp tourne sur Node.JS.

Il a donc fallu faire une tâche qui prépare l'environnement de build, qui exécute le build gulp complet, puis qui upload l'archive obtenue sur Bintray et enfin qui déclenche le build Docker directement sur le Hub.
language: node_js
node_js:
  - "0.10"
before_script:
  - npm install -g gulp
  - sudo apt-get update -qq
  - sudo apt-get install -y curl
script:
  - gulp archive
after_success:
  - "curl -T ./dist/fly-ng.tar.gz -H \"X-Bintray-Publish: 1\" -H \"X-Bintray-Override: 1\" -u$BT_USERNAME:$BT_KEY https://api.bintray.com/content/$BT_USERNAME/generic/fly-ng/0/fly-ng.tar.gz"
  - "curl --data \"build=true\" -X POST https://registry.hub.docker.com/u/$DOCKER_USERNAME/fly-ng/trigger/$DOCKER_KEY/"

Conclusion

GitHub + Travis CI + Bintray + Docker Hub, voici ma chaîne d'intégration continue gratuite.



Avec elle, à chaque fois que je fais une mise à jour de mon repository GitHub, ça déclenche le build TravisCI, qui déclenche la construction d'une nouvelle version de l'image Docker. Parfait pour ce petit projet.