gitlab ci : integration et déploiement continue
TRANSCRIPT
www.eleven-labs.com
Intégration continue avec Gitlab CI Factory
Vincent ComposieuxTwitter : @vcomposieux
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
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
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
CONTEXTEUN PEU DE
Architecture
RECETTE
GITLAB
PRODUCTION
DEPLOIEMENTMANUEL
DEPLOIEMENTAUTO
(Work|Git)flow de travail
MASTER
DEVELOP
FEATURE 1
FEATURE 2Merge request
{
Nouvelles fonctionnalités
Production
Recette
Flux d’échanges
UTILISATEUR GITLAB RUNNER RECETTE
Création merge request
Exécution pipeline
Résultat
Merge
Exécution pipeline Déploiement
GITLAB CITO INFINITY AND
Infrastructure Gitlab CI
SERVEUR 1GITLAB
SERVEUR 1
SERVEUR 3
CITOKEN
OU
php:5.6php:7.0redis:latest…
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
Pipeline CI de merge request valide✅
composer installnpm install…
phpunitjasmine…
SKIPPED
Pipeline CI de merge request invalide❌
composer installnpm install…
phpunitjasmine…
SKIPPED
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
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
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
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
Notification sur merge request
SUCCESS
FAIL
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; …
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
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
ASTUCES#PROTIPS
composer config cache-files-dir .composercache
cache: paths: - .composercache/
Composer
Cache les dépendances composerentre les builds
À exécuter dans le container
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
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
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
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)
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é
DEMO
RENDEZ-VOUS AU WORKSHOPMERCI