ADADAM | Cloud Power Unleashed

We build apps for the cloud, in the cloud...
Bitbucket Docker Français Pipelines

Découvrez Bitbucket Pipelines, adoptez la DevOps attitude !

Bitbucket Pipelines ouvre un nouveau chemin vers l’Intégration Continue et le Déploiement Continue de n’importe quel projet logiciel : en combinant Git comme répertoire de code source et Docker pour l’environnement de test et de déploiement, Bitbucket Pipelines permet d’automatiser rapidement votre projet de développement et de tester ce dernier de manière fiable, automatique et systématique.

 

Permettre aux développeurs ou aux administrateurs système de tester leurs évolutions de code rapidement et ainsi garantir le bon fonctionnement de la mise à jour est crucial car certains systèmes ou applications aujourd’hui n’ont pas ou plus le droit à l’arrêt de service.

Et puis arrive aussi l’urgence : le projet critique et sensible que l’on doit lancer immédiatement, parfois à contre courant de tout le Système d’Informations en place, il faut aller vite et faire bien, voir très bien. A mon sens, c’est là que peut intervenir Bitbucket Pipelines dans de grosses organisations bien en place, pas exclusivement, mais cette plateforme prend tout son sens dans certaines de ces conditions.

Découvrir Bitbucket Pipelines

Pour me permettre de vous montrer ce que l’on peut réaliser avec Bitbucket Pipelines, j’ai choisis d’implémenter quelques scripts serveur en PHP, scripts souvent utilisés pour l’administration de serveur Web, de test ou de livraison de projets WordPress par exemple, pour de l’outillage de surveillance ou de supervision aussi.

Nous allons donc :

  • construire et mettre à disposition de notre plateforme d’intégration continue une image Docker basée sur PHP 7.1.1, avec MySQL 5.5 d’installer sur cette machine.
  • créer un dépôt (ou répertoire) de code source sur Bitbucket qui hébergera les scripts PHP pour cette démonstration, l’un permettant le ping d’un site web, l’autre l’affichage des bases de données MySQL.
  • relier l’image Docker et le projet de scripts PHP via Bitbucket Pipelines et ainsi pouvoir tester / exécuter notre code dans un environnement connu et maîtrisé à savoir l’image Docker que fraîchement créée.

Préparer l’image Docker

Une image Docker intégrée dans le Docker Hub gratuit de la société éditrice permet de pouvoir utiliser son image au besoin : par simple appel (en ligne de commande), l’image de la machine serveur sera exécutée dans un container d’application Docker.

Vous pouvez directement utiliser mon image : https://hub.docker.com/r/dlauberton/docker-php-demo1/

Le contenu de notre DockerFile

# Dockerfile for darwyn bitbucket pipelies
# starting with PHP

FROM php:7.1.1
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update \
  && apt-get install -y mysql-server mysql-client libmysqlclient-dev --no-install-recommends \
  && docker-php-ext-install pdo pdo_mysql \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

Construction de l’image en local

docker build -t dlauberton/docker-php-demo1

Lancement de l’image en local

docker run -i -t dlauberton/docker-php-demo1 /bin/bash

Mise à jour de l’image sur DockerHub

docker login
# saisir ces identifiants et mot de passe

docker push dlauberton/docker-php-demo1

Préparer le répertoire de code source sur Bitbucket

Mon dépôt de code source complet : https://bitbucket.org/dlauberton/pipelines-php-demo1

Contenu du script script-showdb.php

Ce script affiche toutes les bases de données MySQL.

<?php

#connection to mysql
$conn = new PDO("mysql:host=127.0.0.1;dbname=php_demo", root, '');

#show db query
$sqlshowdb = 'SHOW DATABASES;';

#execute
$q1 = $conn->query($sqlshowdb);

#print results databases
while ($row = $q1->fetch()){
  print_r($row);
}
?>

Contenu du script script-ping.php

Ce script permet via une variable d’environnement le ping d’un site Web.

<?php
#ping thanks to an Environment Variable website
$str = exec("ping -c 1 $argv[1]",$output);

print_r(array_values($output));
?>

La configuration Bitbucket Pipelines

Contenu du fichier bitbucket-pipelines.yml

# custom docker image
image: dlauberton/docker-php-demo1

pipelines:
  default:
    - step:
        script:
          - /etc/init.d/mysql start #start mysql
          - mysql -u root -e 'CREATE DATABASE php_demo' #create a database
          - php -version #print php version
          - mysql --version #print mysql version
          - php script-showdb.php #run the script showdb of the demo
          - php script-ping.php $WEBSITETOPING #run the ping script ping of the demo

Ce fichier permet de donner des commandes à exécuter suite au lancement de l’image Docker. Je commence par démarrer MySQL, puis je crée une nouvelle base de données MySQL, ensuite j’affiche les versions utilisées de PHP et de MySQL, pour finalement utiliser nos deux scripts PHP :

  • l’un pour afficher toutes les bases de données d’un serveur MySQL,
  • l’autre pour lancer un ping sur le site web d’Atlassian via une variable d’environnement.

Ajouter une variable d’environnement pour notre configuration

L’idée ici est de variabiliser l’appel de notre script PHP pour pouvoir faire un ping sur un ou plusieurs sites Web facilement, en multipliant les appels à notre script PHP dans la configuration (format YAML) de Bitbucket Pipelines.

L’ajout d’une variable d’environnement est très simple dans les paramètres du répertoire de code source BitBucket.

Exécution dans Bitbucket Pipelines

A chaque mise à jour de code, Bitbucket Pipelines lancera automatiquement une exécution de nos scripts PHP, voici ce que cela peut donner après plusieurs modifications de code.

Les logs de chaque exécution vont permettre de lire les résultats obtenus.

Ici le ping du site d’Atlassian :

Ici l’affichage de toutes les bases de données MySQL :

N’attendez plus ! Testez le par vous même !!! J’ai utilisé Bitbucket Pipelines pour monter en compétence sur Docker. Je suis tombé littéralement fan de cette technologie de container d’applications. Cela me permet aussi de tester facilement la chaîne complète de l’intégration et du déploiement continue d’un projet, ici en PHP mais aussi en JAVA, notamment pour le développement d’addons basés sur JIRA Software par exemple.

Je compte réaliser une autre démonstration prochainement, pour aller encore plus loin avec Bitbucket Pipelines, Docker et PHP. La suite donc… au prochain article !