diff --git a/.gitignore b/.gitignore
index e8594eb82ade0be3f274e61dbb322a6dbd2cb7e2..c189a0a8d34d58a3e5df2234a04c26827336dd0d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,7 @@
+.ipynb_checkpoints/
+*.slides.html
 .bash_history
 .cache
-__pycache__
+__pycache__/
 *.so
 *.e
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..c9adb36aeae2103a9e85403f4db0e8a879242d3d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,17 @@
+# TP GitLab CI
+
+## Execution du notebook jupyter
+
+- [Installer Anaconda](https://www.anaconda.com/download) pour disposer de `jupyter-notebook`
+- Ajouter le support du noyau bash :
+
+``` 
+pip install bash_kernel
+python -m bash_kernel.install
+```
+
+- Lancer le notebook :
+
+```
+jupyter notebook tp-gitlab-ci.ipynb
+```
\ No newline at end of file
diff --git a/cicd_pipeline_infograph.png b/cicd_pipeline_infograph.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ddd4aa828bc574d04b59904f9b7ea0dc5bc4d79
Binary files /dev/null and b/cicd_pipeline_infograph.png differ
diff --git a/fork.png b/fork.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ac023974fc86e7123d1394a34830e3a1e4176f4
Binary files /dev/null and b/fork.png differ
diff --git a/launch_slide.sh b/launch_slide.sh
new file mode 100755
index 0000000000000000000000000000000000000000..3a7c43e3f012aead44214557736cd4b59adfdadf
--- /dev/null
+++ b/launch_slide.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+set -x
+nbfile="tp-gitlab-ci.ipynb"
+jupyter-nbconvert $nbfile --to slides --post serve $2 --allow-errors
diff --git a/tanuki.png b/tanuki.png
new file mode 100644
index 0000000000000000000000000000000000000000..ece6a6c5d9257a80098c13a50ef81a8f6f3721e1
Binary files /dev/null and b/tanuki.png differ
diff --git a/tp-gitlab-ci.ipynb b/tp-gitlab-ci.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..926dbd70d89bcc30ae12ba3b340a4a40096bbbf5
--- /dev/null
+++ b/tp-gitlab-ci.ipynb
@@ -0,0 +1,427 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "slide"
+    }
+   },
+   "source": [
+    "### Journée X/Stra-Dev Intégration continue\n",
+    "\n",
+    "21 novembre 2017  \n",
+    "\n",
+    "--- \n",
+    "\n",
+    "# L'intégration continue avec GitLab\n",
+    "\n",
+    "![image.png](tanuki.png)\n",
+    "\n",
+    "## *Session pratique*\n",
+    "\n",
+    "---\n",
+    "\n",
+    "Matthieu Boileau - <matthieu.boileau@math.unistra.fr>\n",
+    "\n",
+    "*Contenu sous licence [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0)*"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "slide"
+    }
+   },
+   "source": [
+    "# GitLab CI\n",
+    "\n",
+    "GitLab CI propose une chaîne complète d'intégration continue intégrée à son système de forge logicielle.\n",
+    "\n",
+    "![](cicd_pipeline_infograph.png)\n",
+    "<span style=\"font-size:0.7em;\"><https://docs.gitlab.com/ee/ci/README.html></span>\n",
+    "\n",
+    "**Les avantages :**\n",
+    "\n",
+    "- la simplicité de mise en oeuvre\n",
+    "- la robustesse d'une solution intégrée"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "slide"
+    }
+   },
+   "source": [
+    "## Le gitlab runner\n",
+    "\n",
+    "### Introduction\n",
+    "\n",
+    "- `gitlab-runner` est un démon installé sur une machine destinée à exécuter les tâches d'intégration continue.\n",
+    "- Pour chaque *runner* enregistré, `gitlab-runner` écoute l'instance de gitlab correspondante dans l'attente d'une tâche\n",
+    "- Cette tâche est déclenchée par des évènements (`push`, `merge`, etc.) sur le projet avec lequel il est lié\n",
+    "- Ce lien est créé à l'enregistrement du *runner* par un token associé au projet.\n",
+    "\n",
+    "[**Doc en ligne**](https://docs.gitlab.com/ce/ci/runners/#shared-vs-specific-runners)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### Runners : *shared* vs *specific*\n",
+    "\n",
+    "- *shared* : n'importe quel projet peut s'en servir. Seul l'administrateur du GitLab peut enregistrer des runners partagés.\n",
+    "- *specific* : seul le créateur du runner peut s'en servir dans d'autres projets\n",
+    "\n",
+    "> **Attention** : les runners partagés sont pratiques mais peuvent présenter des [problèmes de sécurité](https://docs.gitlab.com/ee/ci/runners/README.html#be-careful-with-sensitive-information).\n",
+    "\n",
+    "\n",
+    "### Runners : *locked* vs *unlocked runners*\n",
+    "\n",
+    "- *locked* : le runner ne peut être utilisé que pour le projet avec lequel il est lié\n",
+    "- *unlocked* : le créateur du runner peut l'utiliser dans ses autres projets"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "-"
+    }
+   },
+   "source": [
+    "### Installer `gitlab-runner`\n",
+    "\n",
+    "La **[procédure](https://docs.gitlab.com/runner/install/)** dépend du système d'exploitation."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "## Fork du TP\n",
+    "\n",
+    "Faire un *fork* du projet sur votre compte GitLab en allant sur la page d'accueil du projet\n",
+    "\n",
+    "![fork.png](fork.png)\n",
+    "\n",
+    "ou en suivant [ce lien](https://git.unistra.fr/m.boileau/tp-gitlab-ci/forks/new)."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "## Clone du TP"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "-"
+    }
+   },
+   "source": [
+    "- Pour paramétrer les commandes de ce notebook, positionner les variables d'environnement suivantes :"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "export USERNAME=\"m.boileau\"  # votre login sur git.unistra.fr\n",
+    "export TPDIR=$HOME         # le répertoire où vous souhaitez installer le TP"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "- Cloner localement votre projet"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "cd $TPDIR\n",
+    "git clone git@git.unistra.fr:$USERNAME/tp-gitlab-ci.git"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "## Enregistrer  un nouveau runner\n",
+    "\n",
+    "> Si `gitlab-runner` n'est pas installé sur votre machine, rdv à la section **Utiliser un runner partagé**\n",
+    "\n",
+    "Engistrer un runner consiste à créer un nouveau runner associé à un projet.\n",
+    "Si vous n'êtes pas administrateur du GitLab, il s'agit forcément d'un runner spécifique. Celui-ci se trouve dans \n",
+    "votre projet, rubrique :\n",
+    "\n",
+    "```\n",
+    "Settings > CI / CD > Runners settings\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "Dans le terminal, maintenant :"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "slideshow": {
+     "slide_type": "-"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "export CI_SERVER_URL=https://git.unistra.fr/  # Do not change for this session\n",
+    "export RUNNER_NAME=a_runner_for_$USERNAME\n",
+    "export REGISTRATION_TOKEN=xxx  # Replace by the value provided by the runner setting page\n",
+    "export REGISTER_NON_INTERACTIVE=true\n",
+    "#gitlab-runner register --executor shell        # sous MacOS\n",
+    "#sudo gitlab-runner register --executor shell   # sous Linux"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "Ou bien lancez la commande en mode interactif et en suivant pas à pas la [procédure](http://docs.gitlab.com/runner/register/#registering-runners):\n",
+    "```\n",
+    "gitlab-runner register       # sous MacOS\n",
+    "sudo gitlab-runner register  # sous Linux\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "- Retournez sur la page de paramètrage des runners\n",
+    "- Repérez votre nouveau runner\n",
+    "- Editez-le et ajouter les tags `specific, shell`\n",
+    "\n",
+    "Votre runner est maintenant prêt à travailler. Nous allons le tester en lui soumettant une tâche GitLab CI déclenchée par un `git push` sur votre projet."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "slide"
+    }
+   },
+   "source": [
+    "## Exo1 : helloworld en bash\n",
+    "\n",
+    "- Aller dans le répertoire racine du clone local de votre projet et basculer sur la branche `exo1`"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "cd $TPDIR\n",
+    "cd tp-gitlab-ci"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "git pull\n",
+    "git checkout exo1"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Repérer le fichier `.gitlab-ci.yml`"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "ls -al"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "- L'éditer avec l'éditeur de votre choix"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "cat .gitlab-ci.yml"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "- `helloworld` indique le nom du job d'intégration continue\n",
+    "- `tags` permet de sélectionner des runners sur la base de mot-clés\n",
+    "- `scripts` correspond aux lignes de commande `bash` que vous souhaitez exécuter"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "Modifiez la ligne de script, par exemple:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "echo '    - echo \"bonjour, monde\"' >> .gitlab-ci.yml\n",
+    "cat .gitlab-ci.yml"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "-"
+    }
+   },
+   "source": [
+    "Enregistrez avec git"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "slideshow": {
+     "slide_type": "-"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "git add .gitlab-ci.yml\n",
+    "git commit -m \"Update .gitlab-ci.yml\""
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "Pousser vos modifications"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "git push"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "-"
+    }
+   },
+   "source": [
+    "Sur GitLab, observez l'exécution de votre job dans la rubrique de votre projet :\n",
+    "```\n",
+    "CI / CD > Pipelines\n",
+    "```"
+   ]
+  }
+ ],
+ "metadata": {
+  "celltoolbar": "Slideshow",
+  "kernelspec": {
+   "display_name": "Bash",
+   "language": "bash",
+   "name": "bash"
+  },
+  "language_info": {
+   "codemirror_mode": "shell",
+   "file_extension": ".sh",
+   "mimetype": "text/x-sh",
+   "name": "bash"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}