# Obtenir des feedbacks de tous vos personas plus rapidement en s’appuyant sur Docker

Qui sommes nous?

Emmanuel Duchastenier

Laurent Leseigneur


@LLeseigneur @bonitasoft

Sommaire

Fluidifier la production de la documentation

Fiabiliser les tests d'intégration avec Docker

Faciliter les démos grâce au déploiement continu

Glossaire

Docker

Glossaire

Jenkins

Glossaire

Github / Pull Request

Glossaire

Markdown

Format d'écriture d'un document texte avec mise en forme légère ```markdown An h1 header ============ Paragraphs are separated by a blank line. 2nd paragraph. *Italic*, **bold**, and `monospace`. Itemized lists look like: * this one * that one * the other one ```

Fluidifier la production de la documentation

## Fabriquer la documentation * basée sur Drupal personnalisé par l’IT * une seule personne met à jour la doc * versioning compliqué * mise en production peu fréquente et douloureuse * accès utilisateur fermé par login

Frustrations

 On ne se sent pas propriétaire du contenu de la doc.

 Reports douloureux. Oublis fréquents.

 Pas d'aperçu du rendu final avant sa réelle publication.

![Thinking](images/monkey_thinking.jpeg) ## Nécessité de changer le processus
## Janvier 2016, la documentation passe en Open Source * suppression du login obligatoire: indexation possible par les moteurs de recherche * meilleur moteur de recherche intégré au site
## Oui, mais pour qui? ![Personas](images/personas.png)

Personas

Richard

Utilisateur (payant / de la communauté) qui lit la doc en ligne. Consommateur du contenu.

MANU

Développeur de la R&D qui maintient la doc à jour. Producteur de contenu.

Marielle

Support client / consultant qui fait face aux clients perdus dans la doc. Elle facilite l'amélioration de la qualité du contenu.
## Yapluka! ### Tout le contenu passe sous Contrôle de Version: Github * flux standard de contribution / revue de contenu * écrit en [markdown](https://fr.wikipedia.org/wiki/Markdown) en remplacement du ~~HTML~~. * Pull Request (PR) exclusivement * la PR est revue par Marielle
### toute PR déclenche une construction sur l'environnement d'intégration continue ![Github Diff](images/doc.rd.lan.png)
* Le HTML est généré * le site est publié dans un nouveau conteneur ![Github Diff](images/Jenkins_build_result.png)
### Tout le site est alors consultable ![Github Diff](images/documentation_PR_site.png)
### Github est notifié du résultat du build ![Github Diff](images/Github_checks.png)
### Une notification est envoyée sur l'outil de messagerie * pour chaque PR créée ou commentée * pour chaque PR fermée (acceptée ou refusée) * pour chaque mise en Pre-Prod / Prod ![Github Diff](images/slack-doc-prod.png)
## Dans la foulée ### On automatise la mise en pré-production / production
## Mais... mais... mais
## mais c'est génial!
### Les effets secondaires
### Séparation entre contenu et présentation Sur une PR: code source, sans rendu final ![Github Diff](images/github_diff.png)
## Mise en Production Aujourd'hui, mettre en production une nouvelle version, c'est: * merger une PR dans la branche 7.6 * attendre 2 minutes

Bénéfices visibles pour nos Personas

Richard

doc fréquemment mise à jour

une version Bêta sort avec sa doc

Bénéfices visibles pour nos Personas

Marielle / Manu

cycle court de correction et de mise en prod

traçabilité des modifications

Bénéfices visibles pour nos Personas

Manu

même cycle de travail que sur du code produit: Java, JS, Groovy, etc…

report d’une version sur l’autre simplifié:
git merge

Bénéfices visibles pour nos Personas

Marielle

elle s’est formée à Git et aux Pull Request Github

## Sous le capot
### 1 build = 1 site complet * généré en HTML à partir de Markdown * pour chaque version du produit
### Déclenchement du build des PR * Jenkins Organization plugin * Jenkinsfile dans le repository Github

Rebuild la PR si commits complémentaires

Image Docker mise à jour. Feedbacks très courts.

### Publication dans un conteneur Docker * sur 1 port dédié (numéro de la PR) * même chaîne de build que la Prod * le conteneur Docker est supprimé si la PR est fermée
## Bilan * PR mergée: dispo en prod en moins de 2 minutes * rendu identique * plus de 370 PR = 370 mises en prod (depuis Janvier 2016)

Autonomie de l'équipe

Personas satisfaits

Fiabiliser les tests d'intégration avec Docker

Bonita doit tourner sur

H2 en mode émulation est rapide, mais ne valide pas la compatibilité sur les autres DB vendors.

Personas

Manu

R&D: En charge du produit et de sa qualité

Chuck

IT: L'homme qui parle à l'oreille des serveurs

Avant

## Ce qu'on a mis en place Utilisation d’images docker déjà ajustées pour nos besoins
### Image Docker La **configuration** est déjà dans l'image
```bash #!/bin/bash #max_prepared_transactions sed -i "s/^.*max_prepared_transactions\s*=\s*\(.*\)$/\ max_prepared_transactions = 100/" "$PGDATA"/postgresql.conf ```
### Image Docker Les **schémas / databases** nécessaires sont déjà dans l'image Les **users** de connexion sont déjà dans l'image
```sql CREATE ROLE bonita LOGIN PASSWORD 'bpm'; CREATE DATABASE bonita WITH OWNER = bonita ENCODING = 'UTF8' TABLESPACE = pg_default CONNECTION LIMIT = -1; ```
### Image Docker Possibilité de précharger des données à partir d'un dump
``` #!/bin/bash if [ -f /opt/bonita/dump/bonita.dump ]; then psql -h localhost -p 5432 -Uuser bonita < /opt/bonita/dump/bonita.dump date > /var/lib/postgresql/restore.lastExecution echo "Database restored" fi ```
### Intégration Maven A chaque lancement des tests d'intégration, on lance un nouveau conteneur Docker

    io.fabric8
    docker-maven-plugin
    0.18.1

### Intégration Maven Configuration des tests d'intégration

  
    <image>
      ${docker-mysql-image}
      
        
          root
        
        
          db.random.port:3306
        
      
    </image>
  

### Activation * Activation par profils maven (1 profil pour chaque DB vendor) * Idem avec plugin gradle
## Conseils pratiques
### Tips: scalabilité Le plugin Maven nous fournit un port aléatoire.
Plus de conflit de ports. ![pigs rushing](images/pig_rush.jpg)
### Tips: Healthcheck Docker permet de s'assurer que l'image est up & running avant de lancer les tests
``` FROM postgres:9.3 MAINTAINER Laurent Leseigneur # restore dump on startup if dumpfile is present VOLUME /opt/bonita/dump COPY 0_init-databases.sql /docker-entrypoint-initdb.d/0_init-db.sql COPY 1_set-max_prepared_transactions.sh /docker-entrypoint-initdb.d/1_set-max_prepared_transactions.sh COPY 2_restore_dump.sh /docker-entrypoint-initdb.d/2_restore_dump.sh COPY healthcheck.sh /usr/bin/healthcheck.sh HEALTHCHECK --interval=5s --retries=120 CMD ["/usr/bin/healthcheck.sh"] ```

Bénéfices

Manu

env. clean avant chaque lancement, plus stable
Entre 20s & 1mn pour avoir une DB up & running
lancement en local pour debugguer

Chuck

La R&D est complètement autonome
suppression du bus factor

Objectif atteint !

Faciliter les démos grâce au déploiement continu

ICI

Intelligent Continuous Improvement, ou "amélioration continue assistée par l'intelligence artificielle".

Ce module utilise un algorithme de process-mining pour prédire la durée des instances de processus gérées par Bonita.

  • Bonita
  • Base de données
  • Elasticsearch
  • Module ICI

Personas

Nathalie

Product Owner et ergonome

Luis

Développeur front end de la UI mobile

Philippe

Sponsor du projet, Product manager

Nouveau module,
page blanche sur l'infrastructure

  • Maven Gradle & Gradle Wrapper
  • Intégration Continue Jenkinsfile, Organization plugin
  • Test d'intégration et end-to-end Docker
  • Déploiement Docker compose

l'outil de build, le job à jouer sur l'Intégration Continue et son déploiement sont dans le même repository GIT que le code source

Big Picture

## Build wrapper ? * la bonne version de l'outil de build incluse dans la conf * build identique localement et sur l'Intégration Continue * plus besoin d'installer maven ou gradle
gradle-wrapper.properties : ``` distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-4.2-bin.zip ```
## Docker compose * plusieurs conteneurs reliés entre eux * sous-réseau partagé * partage de répertoires (volumes) * ordre de démarrage selon les dépendances
``` services: tahitiBackup: container_name: ici-tahitiBackup-${BRANCH_NAME} image: registry.rd.lan/bonitasoft/tahiti-postgres:7.5.1 bonitaDB: container_name: ici-db-${BRANCH_NAME} image: registry.rd.lan/bonitasoft/postgres-9.3 ports: - ${PORT_DB}:5432 depends_on: - tahitiBackup volumes_from: - tahitiBackup expose: - 5432 ```

User Story intégrée dans le produit

Les conteneurs Docker sont déployés

  • produit livrable
  • base de données pré-remplie
``` if (isMaster) { stage('🚀 Deploy') { def deployGroovy = load "infrastructure/deploy.groovy" deployGroovy.deploy([ bonita: 18080, ici: 18082, elastic: 19200, database: 15432, kibana: 15601 ], currentBranch) } } ```

Pull Request en cours de revue

Les conteneurs Docker sont déployés

  • tests utilisateur
  • notification dans github
  • supprimés lorsque la PR est fermée

Bénéfices visibles pour nos Personas

Nathalie / Luis

Tests utilisateur avec la user story incluant un changement d'ergonomie

Bénéfices visibles pour nos Personas

Philippe

la dernière version du produit toujours disponible pour une démo

un environnement avec des données consistantes

Bilan

## Les choses à améliorer * temps de démarrage de certaines base de données (O....E) * monitorer l'espace disque consommé par Docker
## Leçons apprises * tout scripter * idéalement dans le même repository * utiliser la même version de Docker / Jenkins partout * controler le démarage avec la commande healthcheck
## Références * Site de la doc Bonita: http://documentation.bonitasoft.com * Plugin Maven Docker: [Fabric8](https://maven.fabric8.io/) * Plugin Gradle pour Docker: [gradle-docker-plugin](https://github.com/bmuschko/gradle-docker-plugin) * Image officielle docker avec des vrais morceaux de [Bonita](https://hub.docker.com/_/bonita/) * Cette [présentation](https://laurentleseigneur.github.io/agile-grenoble-2017/): https://github.com/laurentleseigneur/agile-grenoble-2017

Merci pour votre attention

### Questions? ### Remarques? ![questions?](images/questions.jpg)