A
Etienne Deneuve
Mar 10, 2024 · 6 min read

Templatisation des Pipelines

Side view worker wearing gloves

Cette approche est prise en charge par divers outils CI/CD, en particulier Azure DevOps, permettant aux équipes de définir des configurations d’étapes de pipeline standard pouvant être utilisées dans tous les pipelines d’une organisation.

Le principe DRY (Don’t Repeat Yourself)

Le principe DRY (Don’t Repeat Yourself) est un concept fondamental en développement logiciel qui met l’accent sur l’importance d’éviter la redondance en créant des composants réutilisables et modulaires. Ce principe est très applicable aux pipelines CI/CD.

Dans le contexte des pipelines, le principe DRY préconise la création de modèles qui encapsulent des configurations et des flux de travail communs. En adhérant à ce principe, les équipes de développement peuvent éliminer la redondance, réduire les erreurs et améliorer la maintenabilité de leurs processus CI/CD.

Paramètres et Variables dans les Modèles

Le principe DRY dans la templatisation des pipelines réside dans la création de configurations réutilisables à l’aide de paramètres. Ces paramètres servent d’entrées dynamiques permettant la personnalisation tout en maintenant une structure standardisée.

Paramètres

Les paramètres sont les valeurs que vous pouvez transmettre à un modèle pour personnaliser son comportement. Ils peuvent être utilisés pour contrôler l’exécution d’étapes, de jobs ou de stages dans un modèle. Les paramètres peuvent être de différents types, y compris des chaînes, des booléens et des objets, et ils peuvent avoir des valeurs par défaut. Voyons cela avec un exemple :

templates/node-step.yml
parameters:
- name: nodeVersion
default: '18.X'
steps:
- task: UseNode@1
displayName: Use Node version ${{ parameters.nodeVersion }}
inputs:
version: ${{ parameters.nodeVersion }}

Ce modèle accepte nodeVersion comme paramètre et utilise ‘18.X’ par défaut lorsque le paramètre n’est pas fourni.

Variables

Les variables dans les pipelines, en particulier dans Azure DevOps, sont une fonctionnalité puissante qui permet d’assigner dynamiquement des valeurs à des parties de la configuration du pipeline. Elles peuvent être définies à différents niveaux de portée, pipeline, étape et job, ce qui les rend très flexibles.

Variables Définies par l’Utilisateur

variables:
myVariable: 'Hello World'
steps:
- script: echo $(myVariable)

Variables Système

Azure DevOps fournit un ensemble de variables système prédéfinies qui sont automatiquement disponibles dans le pipeline. Ces variables fournissent des informations sur le pipeline, l’agent et l’environnement.

steps:
- script: echo $(Build.BuildId)

Cette étape affiche l’ID de la build actuelle, en utilisant la variable système Build.BuildId.

Types de Modèles

Comme on le sait, le pipeline YAML commun dans Azure DevOps est composé de stages, de jobs et d’étapes comme le montre cet exemple :

trigger:
- main
stages:
- stage: Build
displayName: 'Build Stage'
pool:
vmImage: ubuntu-latest
jobs:
- job: BuildJob
displayName: 'Build Job'
steps:
- script: echo Building the application...
displayName: 'Build Application'
- script: echo Running tests...
displayName: 'Run Tests'

Les mêmes types de modèles s’appliquent :

  • SModèles de Stages : Les modèles de stages permettent la définition d’un ou de plusieurs stages pouvant être réutilisés à travers plusieurs pipelines. Par exemple, vous pouvez avoir un stage commun pour le build, les tests et le déploiement de certaines applications.
templates/build-test-deploy.yml
parameters:
- name: buildJobName
stages:
- stage: Build
displayName: 'Build Stage'
jobs:
- job: Build
displayName: 'Build Job'
steps:
- script: echo Building...
- stage: Test
displayName: 'Test Stage'
jobs:
- job: Test
displayName: 'Test Job'
steps:
- script: echo Testing...
- stage: Deploy
displayName: 'Deploy Stage'
jobs:
- job: Deploy
displayName: 'Deploy Job'
steps:
- script: echo Deploying...

Pour utiliser ce modèle de stage dans un pipeline avec buildJobName comme paramètre :

azure-pipelines.yml
trigger:
- main
pool: 'ubuntu-latest'
stages:
- template: templates/build-test-deploy.yml
parameters:
buildJobName: 'Build Job'
  • Modèles de Jobs : Les modèles de jobs permettent de définir un ou plusieurs jobs pouvant être réutilisés à travers différents stages dans les pipelines. Voici un exemple de modèle de job :
templates/test.yml
jobs:
- job: Test
displayName: 'Test Job'
steps:
- script: echo Testing...

Pour utiliser ce modèle de job dans un stage :

azure-pipelines.yml
trigger:
- main
pool: 'ubuntu-latest'
stages:
- stage: Test
displayName: 'Test Stage'
jobs:
- template: templates/test.yml
  • Modèles d’Étapes : Les modèles d’étapes permettent de définir une ou plusieurs étapes pouvant être réutilisées à travers différents jobs dans plusieurs pipelines. Cela est utile pour définir des tâches communes, telles que l’exécution de vérifications de style et l’installation de Node qui sont fréquemment utilisées.
templates/npm-install-step.yml
parameters:
- name: nodeVersion
steps:
- task: UseNode@1
displayName: Use Node version ${{ parameters.nodeVersion }}
inputs:
version: ${{ parameters.nodeVersion }}
- task: Cache@2
inputs:
key: 'npm | "$(Agent.OS)" | package-lock.json'
restoreKeys: |
npm | "$(Agent.OS)"
path: $(npm_config_cache)
displayName: Cache npm
- task: Bash@3
displayName: Install NodeJS Dependencies
inputs:
targetType: inline
script: |
npm ci
workingDirectory: $(System.DefaultWorkingDirectory)

Pour utiliser ce modèle d’étapes dans le pipeline principal :

azure-pipelines.yml
trigger:
- main
pool: 'ubuntu-latest'
stages:
- stage: BuildAndTest
displayName: 'Build and Test Stage'
jobs:
- job: NpmInstall
displayName: 'Npm Install'
steps:
- template: templates/npm-install-step.yml
parameters:
nodeVersion: '20.X'
  • Modèles de Variables : Le modèle de variables peut être défini en spécifiant les variables et leurs valeurs dans un fichier YAML séparé. Par exemple :
templates/variables.yml
variables:
- name: nodeVersion
value: '18.X'

Et cela peut être utilisé comme ceci :

azure-pipelines.yml
variables:
- template: 'templates/variables.yml'
trigger:
- main
pool: 'ubuntu-latest'
stages:
- stage: BuildAndTest
displayName: 'Build and Test Stage'
jobs:
- job: NpmInstall
displayName: 'Npm Install'
steps:
- template: templates/npm-install-step.yml
parameters:
nodeVersion: ${{ variables.nodeVersion }}

Avantages de la Templatisation des Pipelines

  • Consistance et Normalisation : La templatisation garantit que tous les pipelines au sein d’une organisation suivent la même structure et les mêmes conventions. Cette cohérence est cruciale pour maintenir la qualité et réduire le risque d’erreurs.
  • Réduction de la Duplication : En utilisant des modèles, les pipelines sont plus propres et plus faciles à gérer, mais réduisent également la probabilité d’erreurs.
  • Maintenabilité Améliorée : Lorsque des modifications doivent être apportées, telles que la mise à jour d’une étape ou l’ajout d’un nouveau paramètre, vous avez seulement besoin de mettre à jour le modèle.
  • Flexibilité et Personnalisation : Les modèles peuvent être personnalisés avec des paramètres, permettant ainsi l’adaptation du comportement du pipeline aux besoins spécifiques de chaque projet ou étape.

En résumé, l’adoption de la templatisation des pipelines révolutionne les flux de travail CI/CD, favorisant la cohérence, l’efficacité et l’adaptabilité.

Templates Pipelines CI-CD

Articles relatifs