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", + "\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", + "\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", + "\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 +}