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.

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 officiel | https://www.jenkins.io |
| Documentation | https://www.jenkins.io/doc |
| Difficulté d'apprentissage | MOYEN |
| Plateformes supportées | Windows, 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 officiel | https://www.travis-ci.com |
| Documentation | https://www.travis-ci.com/getting-started |
| Frais d'abonnement | 64 USD / Utilisateur / Mois |
| Difficulté d'apprentissage | MOYEN |
| Plateformes supportés | Linux, 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 officiel | https://circleci.com |
| Documentation | https://circleci.com/resources |
| Difficulté d'apprentissage | MOYEN |
| Plateformes supportés | Linux |
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 officiel | https://github.com/features/actions |
| Documentation | https://docs.github.com/en/actions |
| Frais d'abonnement | VARIABLE (0.008 USD / Minutes au minimum) |
| Difficulté d'apprentissage | MOYEN |
| Plateformes supportées | Windows, 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.
| Libelle | Description |
|---|---|
| Site officiel | https://about.gitlab.com/solutions/continuous-integration |
| Documentation | https://docs.gitlab.com/ee/ci |
| Difficulté d'apprentissage | MOYEN |
| Plateformes supportées | Linux |
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 officiel | https://www.jetbrains.com/fr-fr/teamcity |
| Documentation | https://www.jetbrains.com/fr-fr/teamcity/learn |
| Difficulté d'apprentissage | MOYEN |
| Plateformes supportées | Windows, 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 officiel | https://tekton.dev |
| Documentation | https://tekton.dev/docs |
| Difficulté d'apprentissage | MOYEN |
| Plateformes supportées | Linux |
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
- concourse-ci.org
- concourse/concourse
- resources-types/concourse
- concourse/docs
- concourse/blog
- starkandwayne/concourse-tutorial
- vmware/concourse-pipeline-samples
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éristique | Minimale |
|---|---|
| Processeur | Pentium ou équivalent |
| RAM | 8 GB |
| Stockage | 500 GB |
Les capacités préférables sont les suivantes:
| Capacité | Détails |
|---|---|
| Peut exécuter des VM | Docker sur Mac OS fonctionne des fois avec des VM |
| Supporter au moins 2 VM | Concourse a un noeud maitre et plusieurs nodes liés |
| Opérerer Linux | Linux 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

Depuis la page d'accueil, il est possible de faire les actions suivantes:
- Se connecter,
- Télécharger le script d'installation
flypour 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

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

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

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