Préface

Auteurs

Introduction

Dans ce livre, nous parlerons principalement de Concourse CI qui est un outils d'intégration Continue. Si vous n'êtes pas familier au concept ne vous inquiètez pas. Des chapitres sont dédiés à vous expliquer de quoi il s'agit.

Dans un premier temps, nous verons les notions d'intégration continue et de délivrance continue puis nous aborderons les chaines de déploiement d'applications et voir des exemples pratiques.

Ce livre cible tous les acteurs du domaine du logiciel sans distinction aucune. Que vous soyez développeur, analyste, administrateur système et réseaux ou autre, ce livre vous permettra d'aborder aisément les notions d'intégration continue. En tant qu'expert du domaine, nous espérons que ces notes vous rappèleront des concepts et vous raffraichiront la mémoire.

A la fin de ce livre, vous serez en messure de:

  • Dire ce que s'est que l'intégration continue,
  • Monter de bout en bout une chaine de déploiement d'une application,
  • Ecrire des scripts Starlark et bash pour automatiser vos pipelines,
  • Maitriser les notions de Job, Task, pipeline, resources et resource types.

Les oeuvres humaines n'étant pas parfaites, si vous retrouvez une erreur, un faute ou autres dans le livre, n'hésitez pas à ouvrir un issue sur la page officiel du livre ou nous envoyer directement un couriel à mmkpeto5@gmail.com. Vos préoccupations seront prises en compte.

Si vous trouvez d'autres concepts que vous souhaitez que nous abordions dans ce livre ou dans un autre livre à part, faites-nous part. Nous les ajouterons au fur et à mesure.

Pour finir, si vous souhaitez soutenir ce que nous faisons, vous pouvez laisser une étoile sur le repertoire GitHub du livre et nous sponsoriser. Les montants acquis serviront principalement à payer les frais d'hébergement pour l'accessibilité du livre aux audiences beaucoup plus larges.

Bonne lecture

Continuous Integration (CI)

L'Intégration Continue (CI) est une pratique de développement qui permet aux contributeurs à un projet de fusionner leurs travaux et d'assurer de façon automatique l'état fonctionnel de repertoire du projet. Il a été évoqué la première fois par Grady Booch l'un des fondateurs des methodes qui ont évolué pour donner le langage de modélisation UML.

Pour comprendre le concept, prenons un exemple de comment on développait des applications avant l'intégration continue (CI). Si vous êtes 20 développeurs à collaborer sur un projet hébergé sur GitHub, chacun copie le projet sur sa machine en local (cloner le projet) et modifie le code source. Lorsque les 20 développeurs auront fini de contribuer, il faut fusionner les contributions dans le répertoire central. C'est là que commencait les problèmes. Lors de la fusion qui prendra beaucoup de temps parcequ'il faut réconcilier les 20 versions des 20 développeurs. Des conflits peuvent intervenir à tout moment. Des fois, lorsque vous aurez fini la fusion, le résultat final est souvent dans un état où vous ne pouvez pas déployer parce que beaucoup de choses sont cassées. Après ces opérations, il faut maintenant refaire le tour et redresser le code avant qu'il devienne opérationnel.

Dans le but de contrer ces difficultés, qui peuvent retarder la livraison des fonctionnalités aux utilisateurs, d'éminents penseurs du domaine on pensé à l'intégration continue (CI). En bref, l'idée est de s'assurer à chaque fois que vous faites un changement que le changement peut passer en production. Le changement peut soit intégrer l'existant ou casser l'existant. Quand ça casse l'existant, il faut réparer le code jusqu'à ce que l'intégration soit correcte. C'est la base de l'intégration continue.

Une question fondamentale que vous vous poserez peut être: Comment savoir si une contribution casse l'existant ? La réponse est simple, il faut un outil qui vous le dis de façon automatisée. Concourse CI est l'un de ces outils que nous allons étudier dans ce livre.

Avec l'intégration continue (CI), quand vous faites une modification, l'outil prend le code source, le compile, le teste, fait du linting, scanne les paquets résultants pour identifier les vulnérabilités, construit une image docker du projet et vous laisse voir les opérations à appliquer pour déployer en dev ou prod. Si jamais une étape échoue, l'intégration ne passe pas. Il faut alors appliquer des correctifs pour réparer le code jusqu'à ce que tout soit au vert.

Dans ce livre, nous construirons des chaines pour nous dire si oui ou non, l'intégration est réussie. Nous mettrons en place des éléments pour vous notifier des irrégularités et des succès. À la fin, vous serez en capacité, enfin nous l'espérons de contruire en toute indépendence un système CI.

Pipeline de ce livre

Les outils sur le marché

En termes de micro services, la diversité est aussi une faiblesse si vous ne savez pas vous y prendre. Pour un seul concept, ne soyez pas surpris de retrouver des milliers d'implémentations. Ce qui est normal puis que tout le monde ne regarde pas desfois dans la même direction.

Cependant, il est nécessaire de souligner qu'il ne sert à rien d'apprendre tous les outils qui existent dans des domaines. Soyez rassuré que vous ne finirez pas de le faire et vous allez perdre du temps pour rien. L'essentiel est de comprendre le concept fondamental à fond et apprendre de nouveaux outils sur le tas.

Ceci dit, il y beaucoup de players sur le marché de l'intégration continue. Nous allons juste vous détailler quelques majeurs et connus. Sachez que chaque jours que Dieu fait, de nouveaux outils paraissent. Juste pour information, hier nous avons appris qu'un nouvel outil CI est sorti. Il s'agit de Tekton basé sur Kubernetes et qui à déjà une certification donnomée Pipelines with Tekton.

Jenkins

Jenkins CI/CD est surement l'un des plus anciens outils CI/CD opensource sur le marché. Il est apparu depuis 2011 est resté longtemps populaire dans le domaine. Il est écrit en Java et est basé sur les concepts construction par tâche. Il est entièrement gratuit et peut être installé de plusieurs façons.

LibelléDescription
Site officielhttps://www.jenkins.io
Documentationhttps://www.jenkins.io/doc
Difficulté d'apprentissageMOYEN
Plateformes supportéesWindows, Linux

Travis CI

Travis CI est aussi l'un des plus anciens dans le domaine. Personnellement, c'est le premier outils qui m'a fait découvrir le domaine. Il y a de cela un moment, quand vous analysez les repertoires de projets GitHub, vous retrouvez le fichier .travis.yml de présent! Par curiosité, si vous cherchez, vous tombez sur le site de Travis CI. Travis reste quand même l'un des plus performants et les plus stables.

Au début, il avait une offre gratuite pour démarrer mais elle a été supprimée.

LibelléDescription
Site officielhttps://www.travis-ci.com
Documentationhttps://www.travis-ci.com/getting-started
Frais d'abonnement64 USD / Utilisateur / Mois
Difficulté d'apprentissageMOYEN
Plateformes supportésLinux, Mac OS

Circle CI

Circle CI est surement l'un des outils CI les plus utilisés aujourd'hui. Il offre beaucoup de fonctionnalités et une documentation riche. Il a une offre cloud gratuite pour commencer et des abonnements mensuels abordables.

LibelléDescription
Site officielhttps://circleci.com
Documentationhttps://circleci.com/resources
Difficulté d'apprentissageMOYEN
Plateformes supportésLinux

GitHub Actions

GitHub Actions est peut être le plus avancé et le plus équipé des plateformes CI/CD. Pour l'instant, il ne peut construire que les projets hébergés sur Github. Il n'est pas opensource mais il possède des offres gratuites et offre une performance de qualité. Il vous permet de construire des tâches sur des plateformes peu supportés en matière de conteneur comme le Mac OS de Apple, Windows.

Si vous developpez des applications mobiles ou des applications multiplateforme, GitHub Actions peut être un bon choix en ce sens que vous allez avoir accès à beaucoup de facilités par défaut.

Le seul inconvénien est que son offre est limitée. Pour avoir accès à plus, il faut souscrire à un abonnement ou à une offre entreprise.

LibelléDescription
Site officielhttps://github.com/features/actions
Documentationhttps://docs.github.com/en/actions
Frais d'abonnementVARIABLE (0.008 USD / Minutes au minimum)
Difficulté d'apprentissageMOYEN
Plateformes supportéesWindows, Mac OS, Linux

GitLab CI

GitLab CI est la plateforme CI de GitLab. Il offre beaucoup de fonctionnalités mais reste limité sur les forfaits de base qui sont gratuits. Pour l'instant, il ne peut construire que les projets hebergés sur GitLab.

LibelleDescription
Site officielhttps://about.gitlab.com/solutions/continuous-integration
Documentationhttps://docs.gitlab.com/ee/ci
Difficulté d'apprentissageMOYEN
Plateformes supportéesLinux

Team City

Team City est l'outil CI/CD du puissant constructeur d'IDE Jetbrains. Annoncé à grands pas, il n'a pas totalement convaincu les utilisateurs malgré les performances. Cet état de fait peut être du au fait qu'il est apparu tardivement sur le marché alors que d'autres outils sont déjà arrivé à maturité.

Marlgré tout, il reste très populaire et très utilisé. Il est gratuit si vous souhaitez héberger son serveur vous même et payant si vous souhaitez utiliser le cloud ou la version entreprise.

LibelléDescription
Site officielhttps://www.jetbrains.com/fr-fr/teamcity
Documentationhttps://www.jetbrains.com/fr-fr/teamcity/learn
Difficulté d'apprentissageMOYEN
Plateformes supportéesWindows, Mac OS, Linux

Tekton

Tekton est peut-être le cadet des outils CI/CD actuellement. Il construit autour de l'écosystème Kubernetes et utilise des resources Kubernetes pour fonctionner. Il reste entierrement configurable. Ceux qui connaissent bien Kubernetes, seront à l'aise dans son utilisation. Il est entièrement gratuit et opensource.

LibelléDescription
Site officielhttps://tekton.dev
Documentationhttps://tekton.dev/docs
Difficulté d'apprentissageMOYEN
Plateformes supportéesLinux

Concourse

Concourse CI est un outil d'intégration continue demarré comme un projet personnel de Alex Suraci alias @vito. Selon le site officiel, il est construit sur des concepts simples commes ceux de resources, de tâches et de jobs. Concourse présente une approche générale à l'automatisation qui le rends excellent pour le CI/CD.

Les fonctionnalités far de Concourse sont entre autres:

  • Une interface graphique conviviale,
  • Les pipelines,
  • Les jobs,
  • Les Tasks,
  • Les conteneurs,
  • Les entrées/sorties.

Ressources Concourse

Opensource

Concourse CI est opensource. Cela voudrait dire que vous pouvez accéder à son code source, le modifier, contribuer à son amélioration ou même dériver une version de la version mère.

Il est écrit en Go et basé sur les standards de conteneurs offerts par la Fondation Docker.

Le fait d'avoir accès au code source de Concourse CI peut vous offrir plusieurs avantages. Vous pouvez si vous comprenez le langage de programmation Go, vous pouvez lire le code source, comprendre et proposer des modifications, améliorer l'existant en fixant des issues dans le code.

Il est possible de contribuer aussi par d'autres moyens comme la contribution à la documentation, sa traduction, son amélioration.

Interoperabilité

Certaines plateformes de CI/CD ne peuvent pour le moment pas intégrer d'autres plateformes de gestion de code source. Si vous choisissez de les utiliser, ayez à l'esprit que vous serez plus ou moins lié à leur outil de gestion de code source (CVS). Par exemple, si vous utilisez Github Actions, vous devez utiliser des outils liés comme les repertoires GitHub. Même chose pour GitLab Actions. En bref, vous ne pouvez pas facilement faire une combinaison repository GitHub avec GitLab CI ou faire un repository GitLab avec GitHub Actions. Même si vous réussissez la combinaison, vous n'aurez pas toutes les fonctionnalité et les facilités sur place.

Concourse CI offre l'interopérabilité en fonctionnant de façon indépendante de tous les outils de gestion de code source. Il peut s'intégrer à GitHub, GitLab, BitBucket et s'intégrer à tout les outils qui offrent des interfaces de programmations comme un API, ou autres. Bref, vous serez rarement à la limite de Concourse CI.

Sécurité

Concourse CI est basé sur la notion de conteneur. L'isolation des processus fourni par les opérateurs de conteneurs comme Docker, Podman et autres offre plus de sécurité. Au cas même ou il y a une vulnérabilité, le champs d'exploitation garanti est réduit puis que les processus sont isolés.

Communauté

Concourse CI dispose d'une grande communauté. Cela voudrait dire que si vous avez un problème, il y a des chances que quelqu'un a déjà été dans votre cas et vous pouvez apprendre de sa solution.

Le fait que plusieurs personnes connaissent l'outil montre que ça pourait rester longtemps dans la liste des bons outils CI/CD.

Résumé

Ce chapitre a porté essentiellement sur l'introduction au CI et à abordé les notions suivantes:

  • L'intégration continue
  • Concourse
  • Les autres outils d'intégration continue

Dans le prochain chapitre, nous verront brièvement, comment installer concourse et le démarrer.

Installation

Concourse CI étant basé sur les techologies de conteneurs, vous pouvez l'installer avec tous ces outils. En bref, tout ce qui peut exécuter un conteneur comme Docker, Podman ou autres héberger Concourse CI.

Nous aborderons deux modes d'installation

  • L'installation en locale
  • L'installation par les Helm Charts

Installation en locale

Pour installer Concourse CI en locale, vous avez besoins des outils suivants:

L'installation de Concourse CI en local peut poser des problèmes la machine ne possède pas de bonnes caractéristiques. Il peut aussi avoir des soucis si vous utilisez une version de Mac OS qui n'est pas très compatible avec Docker comme moi.

Il est préférable que vous ayez une machine avec au moins ces caractéristiques et les dispositions ci-dessous.

CaractéristiqueMinimale
ProcesseurPentium ou équivalent
RAM8 GB
Stockage500 GB

Les capacités préférables sont les suivantes:

CapacitéDétails
Peut exécuter des VMDocker sur Mac OS fonctionne des fois avec des VM
Supporter au moins 2 VMConcourse a un noeud maitre et plusieurs nodes liés
Opérerer LinuxLinux est la plateforme la plus supportée par les conteneurs

Procédure installation

La procédure d'installation locale est simple et composée de deux étapes:

  • Télécharger et lancer le fichier docker-compose.yml et le lancer avec docker compose,
  • Installer l'utilitaire de la ligne de commande fly.
curl -O https://concourse-ci.org/docker-compose.yml
docker-compose up -d

Une fois ces deux commandes lancées, il ne reste qu'à visiter l'adresse http://localhost:8080 pour utiliser concourse.

Installation avec Helm

Les installations de production de concourse sont faits avec Helm ou du Kubernetes. Généralement, vous avez un noeud principal et un ou plusieurs noeuds associés pour le traitement des jobs. L'avantage de cette architecture est le scalling. Si les jobs sont nombreux avoir plus de noeuds associés est un avantage considérable.

Installer Helm

Il faudra comme prérequis avoir helm d'installé sur la machine cible de l'installation.

Mac OS

brew install helm

Windows

choco install kubernetes-helm

ou

scoop install helm

Linux (apt)

curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm

Linux (rpm)

sudo dnf install helm

Linux (snap)

sudo snap install helm --classic

Installer Concourse CI par Helm

Le helm chart de concourse sur Github s'appelle concourse/concourse-chart. Le fichier de configuration du chart s'appelle values.yml. Il est super documenté et vous permet de comprendre en détails toutes les options de configuration.

Avant d'appliquer, remplacez <nom_installation> par un nom que vous voulez donnez aux déploiements.

Installation avec les valeurs par défaut

helm repo add concourse https://concourse-charts.storage.googleapis.com/
helm install <nom_installation> concourse/concourse

Installation avec des configurations personnalisées

helm repo add concourse https://concourse-charts.storage.googleapis.com/
helm install <nom_installation> -f values.yaml concourse/concourse

Configuration de ingress

Une fois installé, vous devez exposer votre installation. Généralement, ça passe pas ingress et un gestionnaire de certificats SSL. Voici des exemples de configurations:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: lets-encrypt
spec:
  acme:
    email: <votre-email>
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: <nom-ingress-tls>
    solvers:
      - http01:
          ingress:
            class: public
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: <nom-meta>
  namespace: default
  annotations:
    cert-manager.io/cluster-issuer: lets-encrypt
spec:
  tls:
    - hosts:
        - <nom-de-domaine-concourse>
      secretName: <nom-ingress-tls>
  rules:
    - host: <nom-de-domaine-concourse>
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: <nom-service-conteneurs>
                port:
                  number: <port-expose-service>

À la fin de l'installation, il est important que vous devez vérifier l'état de vos pods, services, load balancers Kubernetes et diagnostiquer les problèmes éventuels. Les platformes étant différentes, les techniques d'installation des certificats SSL et de Ingress sont fonction des l'implémentations de la spécification.

Les premiers écrans

Quand vous installez Concourse CI et vous visitez le lien, vous aurez accès à la page de connexion.

Page d'index

Page d'index

Depuis la page d'accueil, il est possible de faire les actions suivantes:

  • Se connecter,
  • Télécharger le script d'installation fly pour interagir avec le serveur concourse,
  • Consulter la version de concourse qui est installé.

Sur la page de connexion, cliquez le bouton Login pour vous connecter puis entrez vos identifiants.

Pour télécharger l'utilitaire de ligne de commande fly, cliquez le bouton correspandant à votre OS (Mac OS, Windows, Linux) pour télécharger.

En bas de l'écran, vous avez affiché la version de concourse qui est déployée sur le serveur.

Page de connexion

Page de connexion

Au clic du bouton de connexion, l'interface de connexion s'affiche. Pour vous connecter à votre tableau de bord, entrez votre identifiant et votre mot de passe. Si vous avez fait une installation par défaut, les informations de connexion sont.

Login: test / Password: test

Vous pouvez utiliser les même informations pour vous connecter avec l'utilitaire fly

Le tableau de bord

Tableau de bord

La page d'accueil, vous permet de faire les actions suivantes:

  • Consulter l'état global de tous vos pipelines,
  • Consulter les détails d'un pipeline en cliquant dessus,
  • Marquer comme favoris des pipelines,
  • Rechercher des pipelines si vous en avez beaucoup,
  • Vous déconnecter.

Pour avoir les détails d'un pipeline, il faut cliquer dessus.

La page d'affichage d'un pipeline

Page de Jobs

La page de détails du pipeline affiche les éléments suivants:

  • Les Jobs,
  • Les resources en entrée et en sortie des jobs,
  • La coordination des jobs.

Généralement, le code de couleur est le rouge pour les jobs en échec, l'orange pour ceux qui ont des erreurs et principalement le vert pour les jobs à succès.

Pour consulter les détails d'une tâche, cliquez dessus. Vous verrez tous les tasks de la job. À ce stade, lancer un build consiste tout simple à cliquer le bouton plus (+) en haut et à droite.

Résumé

Dans ce chapitre nous avons fait le tour de l'installation de concourse. Les deux techniques d'installation sont principalement:

  • L'installation en locale,
  • L'installation par un Helm Chart.

Nous supposerons que vous avez une installation locale pour la suite. Tout ce que nous aborderons peut être facilement transposé à un serveur distant.

Dans le prochain chapitre, nous parlerons de la documentation puis nous monterons notre premier pipeline pour dire Hello, world !

Hello pipeline

En Concourse CI ce qu'il faut savoir initialement est que tout est conteneur. Concourse exécute toutes jobs dans un conteneur. Lors de l'exécution, un conteneur peut recevoir en entrée le résultat d'un job ou d'une task précédente. Il peut à son tour exporter également des informations pour les jobs qui vont suivre.

Une seconde chose à avoir à l'esprit c'est que le format principal de configuration est le .yml. Si vous débutez en connaissance du format yaml, comprenez tout simplement que c'est une autre forme du format JSON. Space lift a écrit un bon tutoriel qui explique la structure du format yml. Learn X in Y minutes donne une référence sur ce que vous pouvez voir dans un fichier yml et ce que ça signifie. Avant de quitter cette parenthèse, il faut vous rappeler que le format yml est strict. La tabulation est de quatre (4) espaces.

La première étape pour construire un pipeline est de créer un dossier et de créer dedans un fichier yml qui va représenter le pipeline. C'est aussi simple que ça. Vous pouvez le faire avec l'interface ou la ligne de commande. Peu importe.

mkdir pipeline
cd first-pipeline.yml

Maintenant que vous avez un dossier et un fichier de pipeline, on va créer le pipeline sur le serveur. Pour le moment, ajoutez le contenu suivant au fichier de pipeline first-pipeline.yml

jobs:

Le fichier en local est prêt pour l'instant. Afin d'envoyer le pipeline sur le serveur concourse on va procéder comme suit:

  • Connexion au serveur Concourse CI,
  • Création du pipeline,
  • Activation du pipeline,
  • Exécution du pipeline.

Connexion

Avant toute chose, vous devez d'abord vous connecter au serveur Concourse oû vous voulez crééer le pipeline. Pour ce faire, on utilise la commande fly login.

fly -t <target> login -c <url> -u <username> -p <password>

Les options sont les suivantes:

target: le nom que vous voulez donner au serveur concourse cible de la connexion. ex: local

url: l'URL du serveur cible auquel vous voulez vous connecter. ex: http://localhost:8080

username: le nom d'utilisateur

password: le mot de passe

Pour notre installation locale, voici comment on peut se connecter.

fly -t local login -c http://localhost:8080 -u test -p test

Création de pipeline