Skip to content
Snippets Groups Projects
tp-gitlab-ci.ipynb 10.2 KiB
Newer Older
Matthieu Boileau's avatar
Matthieu Boileau committed
{
 "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",
Matthieu Boileau's avatar
Matthieu Boileau committed
    "### Mettre en place une action d'intégration continue\n",
    "\n",
    "Aller dans le répertoire racine du clone local de votre projet et basculer sur la branche `exo1`"
Matthieu Boileau's avatar
Matthieu Boileau committed
   ]
  },
  {
   "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": [
Matthieu Boileau's avatar
Matthieu Boileau committed
    "L'éditer avec l'éditeur de votre choix"
Matthieu Boileau's avatar
Matthieu Boileau committed
   ]
  },
  {
   "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": {
Matthieu Boileau's avatar
Matthieu Boileau committed
     "slide_type": "subslide"
Matthieu Boileau's avatar
Matthieu Boileau committed
    }
   },
   "source": [
    "Sur GitLab, observez l'exécution de votre job dans la rubrique de votre projet :\n",
    "```\n",
    "CI / CD > Pipelines\n",
    "```"
   ]
Matthieu Boileau's avatar
Matthieu Boileau committed
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Provoquer une erreur\n",
    "\n",
    "Dans `.gitlab-ci.yml`, introduisez une erreur dans une des lignes du script et observer l'effet dans `CI / CD > Pipelines` après avoir pousser les modifications.\n",
    "\n",
    "> **Note :** les fichiers peuvent s'éditer directement dans GitLab."
   ]
Matthieu Boileau's avatar
Matthieu Boileau committed
  }
 ],
 "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
}