30
www.eleven-labs.com Intégration continue avec Gitlab CI Factory Vincent Composieux Twitter : @vcomposieux

Gitlab CI : Integration et Déploiement Continue

Embed Size (px)

Citation preview

Page 1: Gitlab CI : Integration et Déploiement Continue

www.eleven-labs.com

Intégration continue avec Gitlab CI Factory

Vincent ComposieuxTwitter : @vcomposieux

Page 2: Gitlab CI : Integration et Déploiement Continue

Qu’est-ce que l’intégration continue ?

« L'intégration continue est un ensemble de pratiques utilisées en génie logiciel consistant à vérifier à chaque modification de code source que le résultat des modifications ne produitpas de régression dans l'application développée. »

Source : https://fr.wikipedia.org/wiki/Int%C3%A9gration_continue

Page 3: Gitlab CI : Integration et Déploiement Continue

Qu’est-ce que le déploiement continu ?

Le déploiement continu est une approche de génie logiciel dans lequel les équipes produisent des logiciels dans des cycles courts et veille à ce que le logiciel soit fiable à tout moment.Il vise à la construction, les essais et la diffusion des logiciels plus rapidement et plus fréquemment.Source : https://en.wikipedia.org/wiki/Continuous_delivery

Page 4: Gitlab CI : Integration et Déploiement Continue

Orchestrateur de tâchesIntégration continue via plugins

Intégration continueDéploiement continu

Gestion du code source

Intégration continueDéploiement continu

Collaboration entre les devDashboard pour les issues{

$129 / mois

Page 5: Gitlab CI : Integration et Déploiement Continue

CONTEXTEUN PEU DE

Page 6: Gitlab CI : Integration et Déploiement Continue

Architecture

RECETTE

GITLAB

PRODUCTION

DEPLOIEMENTMANUEL

DEPLOIEMENTAUTO

Page 7: Gitlab CI : Integration et Déploiement Continue

(Work|Git)flow de travail

MASTER

DEVELOP

FEATURE 1

FEATURE 2Merge request

{

Nouvelles fonctionnalités

Production

Recette

Page 8: Gitlab CI : Integration et Déploiement Continue

Flux d’échanges

UTILISATEUR GITLAB RUNNER RECETTE

Création merge request

Exécution pipeline

Résultat

Merge

Exécution pipeline Déploiement

Page 9: Gitlab CI : Integration et Déploiement Continue

GITLAB CITO INFINITY AND

Page 10: Gitlab CI : Integration et Déploiement Continue

Infrastructure Gitlab CI

SERVEUR 1GITLAB

SERVEUR 1

SERVEUR 3

CITOKEN

OU

php:5.6php:7.0redis:latest…

Page 11: Gitlab CI : Integration et Déploiement Continue

Ajouter des runners Gitlab CI

Disponible sous Linux, Mac OS, Windows ou Docker

$ sudo gitlab-ci-multi-runner register \ --url "https://gitlab.com/" \ --registration-token "PROJECT_REGISTRATION_TOKEN" \ --description "docker-php-7.0" \ --executor docker \ --docker-image php:7.0… much more

Page 12: Gitlab CI : Integration et Déploiement Continue

Pipeline CI de merge request valide✅

composer installnpm install…

phpunitjasmine…

SKIPPED

Page 13: Gitlab CI : Integration et Déploiement Continue

Pipeline CI de merge request invalide❌

composer installnpm install…

phpunitjasmine…

SKIPPED

Page 14: Gitlab CI : Integration et Déploiement Continue

image: php:7.0

stages: - build - test - notify - deploy

Récupère l’image php:7.0 sur Docker hub

Exécutés dans l’ordre défini

Exécuté lors du merge (develop) oumanuellement (production)

{Exécutés lors d’une merge request

gitlab-ci.yml

Page 15: Gitlab CI : Integration et Déploiement Continue

build: stage: build before_script: - bash ci/build-install.sh > /dev/null script: - make build artifacts: paths: - bin/ - vendor/

BuildNom de la tâche

Nom du stage

Script d’installation du container

Tâche du Makefile ( ) exécutée

{ Ces répertoires seront récupérésdans les stages suivantes

Page 16: Gitlab CI : Integration et Déploiement Continue

test: stage: test before_script: - bash ci/test-install.sh > /dev/null script: - make test except: - master - develop when: on_success artifacts: paths: - ./

Installation de xdebug pour lesrapports PHPUnit, …

{

Cette tâche ne se déclenchera passur les branches master et develop(mais se déclenchera sur lesbranches des merge requests)

Les tests sont exécutés uniquementsi le build du projet n’a pas échoué

Test

Page 17: Gitlab CI : Integration et Déploiement Continue

notify:test:success: stage: notify before_script: - bash ci/notify-install.sh > /dev/null script: - make notify-merge-request-success when: on_success

notify:test:failure: stage: notify before_script: - bash ci/notify-install.sh > /dev/null script: - make notify-merge-request-failure when: on_failure

Notification en cas de succès des tests

Notification en cas d’échec des tests

Notify

Page 18: Gitlab CI : Integration et Déploiement Continue

Notification sur merge request

SUCCESS

FAIL

Page 19: Gitlab CI : Integration et Déploiement Continue

Instance web d’une merge request

SERVEURNGINX

hook.phpRequête HTTP

(job Notify)Récupération artifact

server { server_name ~^(?<subdomain>.+)\.test\-ci\.composieux\.fr$; root /var/www/test-ci/$subdomain; …

Page 20: Gitlab CI : Integration et Déploiement Continue

deploy:recette: stage: deploy script: - make deploy-recette environment: recette only: - develop when: on_success

Déploiement automatique sur la recettelors du merge d’une nouvelle fonctionnalité

Déploiement si build réussi uniquement

Deploy

Page 21: Gitlab CI : Integration et Déploiement Continue

deploy:production: stage: deploy before_script: - bash ci/deploy-install.sh > /dev/null script: - make merge-master - make deploy-production environment: production only: - develop when: manual

Merge sur la branche master puisdéploiement en production

Déploiement manuel seulement

{

Deploy

Page 22: Gitlab CI : Integration et Déploiement Continue

ASTUCES#PROTIPS

Page 23: Gitlab CI : Integration et Déploiement Continue

composer config cache-files-dir .composercache

cache: paths: - .composercache/

Composer

Cache les dépendances composerentre les builds

À exécuter dans le container

Page 24: Gitlab CI : Integration et Déploiement Continue

deploy:recette: before_script: - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' - eval $(ssh-agent -s) - ssh-add <(echo "$SSH_PRIVATE_KEY") - mkdir -p ~/.ssh - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config’ script: - ssh eleven-labs.com

Partager sa clé SSH avec les runners

À ajouter dans les variables du projet

Idéalement, mettre tout ceci dans le Makefile

Page 25: Gitlab CI : Integration et Déploiement Continue

Obtenir l’identifiant de la MR en cours …

curl -s -H "PRIVATE-TOKEN: $CI_API_TOKEN" https://gitlab.com/api/v3/projects/$$CI_PROJECT_ID/merge_requests\?state\=opened

| jq '.[] | select(.source_branch|contains("$(shell echo $CI_BUILD_REF_NAME)")) | .id'

Token du compte @wilson-ci

Nom de la branche source de la merge request

Page 26: Gitlab CI : Integration et Déploiement Continue

Déclencher des builds CI via les « Triggers »

Disponible pour chaque projet dans « Triggers »curl -X POST \ -F token=TOKEN \ -F ref=REF_NAME \ https://gitlab.com/api/v3/projects/PROJECT_ID/trigger/builds

Nom de la branche à builder

Page 27: Gitlab CI : Integration et Déploiement Continue

job: variables: CI_DEBUG_TRACE: "true"

Nouveautés Gitlab CI 8.13

Pour débuguer les commandes shell, lister les variables, …

job: variables: GIT_STRATEGY: none

Pour désactiver les opérations Git lorsque non nécessaire(par exemple : déploiements via artifacts)

Page 28: Gitlab CI : Integration et Déploiement Continue

Conclusion

• Le module CI de Gitlab est un outil très complet• « Pipeline simple » facile à mettre en place• « Pipeline complexe » demande du code supplémentaire et

d’implémenter des webhooks / triggers• CI sur merge requests demande d’être amélioré

Page 29: Gitlab CI : Integration et Déploiement Continue

DEMO

Page 30: Gitlab CI : Integration et Déploiement Continue

RENDEZ-VOUS AU WORKSHOPMERCI