{ "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", "### 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`" ] }, { "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": "subslide" } }, "source": [ "Sur GitLab, observez l'exécution de votre job dans la rubrique de votre projet :\n", "```\n", "CI / CD > Pipelines\n", "```" ] }, { "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." ] } ], "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 }