doc-locale/fr-fr/ci/migration/jenkins.md
{{< details >}}
{{< /details >}}
Si vous migrez de Jenkins vers GitLab CI/CD, vous pouvez créer des pipelines CI/CD qui répliquent et améliorent vos workflows Jenkins.
GitLab CI/CD et Jenkins sont des outils CI/CD présentant certaines similitudes. GitLab et Jenkins utilisent tous deux :
Par ailleurs, il existe quelques différences importantes entre les deux :
De nombreuses fonctionnalités et de nombreux concepts Jenkins ont des équivalents dans GitLab offrant les mêmes fonctionnalités.
Jenkins peut être configuré avec un Jenkinsfile au format Groovy. GitLab CI/CD utilise un fichier .gitlab-ci.yml par défaut.
Exemple de Jenkinsfile :
pipeline {
agent any
stages {
stage('hello') {
steps {
echo "Hello World"
}
}
}
}
Le fichier .gitlab-ci.yml GitLab CI/CD équivalent serait :
stages:
- hello
hello-job:
stage: hello
script:
- echo "Hello World"
Une configuration Jenkins est composée d'un bloc pipeline avec des sections et des directives. GitLab CI/CD dispose d'une fonctionnalité similaire, configurée avec des mots-clés YAML.
| Jenkins | GitLab | Explication |
|---|---|---|
agent | image | Les pipelines CI/CD Jenkins s'exécutent sur des agents, et la section agent définit comment le pipeline s'exécute, ainsi que le conteneur Docker à utiliser. Les jobs GitLab s'exécutent sur des runners, et le mot-clé image définit le conteneur à utiliser. Vous pouvez configurer vos propres runners dans Kubernetes ou sur n'importe quel hôte. |
post | after_script ou stage | La section Jenkins post définit les actions à effectuer à la fin d'une étape ou d'un pipeline. Dans GitLab, utilisez after_script pour les commandes à exécuter à la fin d'un job, et before_script pour les actions à exécuter avant les autres commandes d'un job. Utilisez stage pour sélectionner l'étape exacte dans laquelle un job doit s'exécuter. GitLab prend en charge les étapes .pre et .post, qui s'exécutent toujours avant ou après toutes les autres étapes définies. |
stages | stages | Les étapes Jenkins sont des groupes de jobs. GitLab CI/CD utilise également des étapes, mais offre plus de flexibilité. Vous pouvez avoir plusieurs étapes, chacune avec plusieurs jobs indépendants. Utilisez stages au niveau supérieur pour définir les étapes et leur ordre d'exécution, et utilisez stage au niveau du job pour définir l'étape de ce job. |
steps | script | Les steps Jenkins définissent ce qui doit être exécuté. GitLab CI/CD utilise une section script similaire. La section script est un tableau YAML avec des entrées distinctes pour chaque commande à exécuter en séquence. |
| Jenkins | GitLab | Explication |
|---|---|---|
environment | variables | Jenkins utilise environment pour les variables d'environnement. GitLab CI/CD utilise le mot-clé variables pour définir les variables CI/CD pouvant être utilisées lors de l'exécution d'un job, mais aussi pour une configuration de pipeline plus dynamique. Ces variables peuvent également être définies dans l'interface GitLab, sous les paramètres CI/CD. |
options | Non applicable | Jenkins utilise options pour la configuration supplémentaire, notamment les délais d'expiration et les valeurs de nouvelle tentative. GitLab n'a pas besoin d'une section distincte pour les options ; toute la configuration est ajoutée en tant que mots-clés CI/CD au niveau du job ou du pipeline, par exemple timeout ou retry. |
parameters | Non applicable | Dans Jenkins, des paramètres peuvent être requis lors du déclenchement d'un pipeline. Les paramètres sont gérés dans GitLab avec des variables CI/CD, qui peuvent être définies à de nombreux endroits, notamment dans la configuration du pipeline, les paramètres du projet, au moment de l'exécution manuellement via l'interface utilisateur, ou via l'API. |
triggers | rules | Dans Jenkins, triggers définit quand un pipeline doit s'exécuter à nouveau, par exemple via la notation cron. GitLab CI/CD peut exécuter des pipelines automatiquement pour de nombreuses raisons, notamment les modifications Git et les mises à jour de merge requests. Utilisez le mot-clé rules pour contrôler les événements pour lesquels exécuter des jobs. Les pipelines planifiés sont définis dans les paramètres du projet. |
tools | Non applicable | Dans Jenkins, tools définit les outils supplémentaires à installer dans l'environnement. GitLab ne dispose pas d'un mot-clé similaire, car il est recommandé d'utiliser des images de conteneurs préconstruites avec les outils exacts requis pour vos jobs. Ces images peuvent être mises en cache et peuvent être construites pour contenir déjà les outils dont vous avez besoin pour vos pipelines. Si un job nécessite des outils supplémentaires, ils peuvent être installés dans le cadre d'une section before_script. |
input | Non applicable | Dans Jenkins, input ajoute une invite pour la saisie utilisateur. Comme pour parameters, les entrées sont gérées dans GitLab via des variables CI/CD. |
when | rules | Dans Jenkins, when définit quand une étape doit être exécutée. GitLab dispose également d'un mot-clé when, qui définit si un job doit démarrer en fonction du statut des jobs précédents, par exemple si les jobs ont réussi ou échoué. Pour contrôler quand ajouter des jobs à des pipelines spécifiques, utilisez rules. |
Cette section passe en revue les configurations CI/CD couramment utilisées, en montrant comment elles peuvent être converties de Jenkins vers GitLab CI/CD.
Les pipelines Jenkins génèrent des jobs CI/CD automatisés déclenchés lorsque certains événements se produisent, comme le push d'un nouveau commit. Un pipeline Jenkins est défini dans un Jenkinsfile. L'équivalent GitLab est le fichier de configuration .gitlab-ci.yml.
Jenkins ne fournit pas d'emplacement pour stocker le code source, de sorte que le Jenkinsfile doit être stocké dans un dépôt de contrôle de source distinct.
Les jobs sont un ensemble de commandes qui s'exécutent dans une séquence définie pour atteindre un résultat particulier.
Par exemple, construire un conteneur puis le déployer en production, dans un Jenkinsfile :
pipeline {
agent any
stages {
stage('build') {
agent { docker 'golang:alpine' }
steps {
apk update
go build -o bin/hello
}
post {
always {
archiveArtifacts artifacts: 'bin/hello'
onlyIfSuccessful: true
}
}
}
stage('deploy') {
agent { docker 'golang:alpine' }
when {
branch 'staging'
}
steps {
echo "Deploying to staging"
scp bin/hello remoteuser@remotehost:/remote/directory
}
}
}
}
Cet exemple :
golang:alpine.staging, qui :
staging.Le fichier .gitlab-ci.yml GitLab CI/CD équivalent serait :
default:
image: golang:alpine
stages:
- build
- deploy
build-job:
stage: build
script:
- apk update
- go build -o bin/hello
artifacts:
paths:
- bin/hello
expire_in: 1 week
deploy-job:
stage: deploy
script:
- echo "Deploying to Staging"
- scp bin/hello remoteuser@remotehost:/remote/directory
rules:
- if: $CI_COMMIT_BRANCH == 'staging'
artifacts:
paths:
- bin/hello
Dans Jenkins, les jobs qui ne dépendent pas des jobs précédents peuvent s'exécuter en parallèle lorsqu'ils sont ajoutés à une section parallel.
Par exemple, dans un Jenkinsfile :
pipeline {
agent any
stages {
stage('Parallel') {
parallel {
stage('Python') {
agent { docker 'python:latest' }
steps {
sh "python --version"
}
}
stage('Java') {
agent { docker 'openjdk:latest' }
when {
branch 'staging'
}
steps {
sh "java -version"
}
}
}
}
}
}
Cet exemple exécute un job Python et un job Java en parallèle, en utilisant différentes images de conteneurs. Le job Java ne s'exécute que lorsque la branche staging est modifiée.
Le fichier .gitlab-ci.yml GitLab CI/CD équivalent serait :
python-version:
image: python:latest
script:
- python --version
java-version:
image: openjdk:latest
rules:
- if: $CI_COMMIT_BRANCH == 'staging'
script:
- java -version
Dans ce cas, aucune configuration supplémentaire n'est nécessaire pour que les jobs s'exécutent en parallèle. Les jobs s'exécutent en parallèle par défaut, chacun sur un runner différent, en supposant qu'il y ait suffisamment de runners pour tous les jobs. Le job Java est configuré pour ne s'exécuter que lorsque la branche staging est modifiée.
Dans GitLab, vous pouvez utiliser une matrice pour exécuter un job plusieurs fois en parallèle dans un seul pipeline, mais avec des valeurs de variables différentes pour chaque instance du job. Jenkins exécute la matrice de manière séquentielle.
Par exemple, dans un Jenkinsfile :
matrix {
axes {
axis {
name 'PLATFORM'
values 'linux', 'mac', 'windows'
}
axis {
name 'ARCH'
values 'x64', 'x86'
}
}
stages {
stage('build') {
echo "Building $PLATFORM for $ARCH"
}
stage('test') {
echo "Building $PLATFORM for $ARCH"
}
stage('deploy') {
echo "Building $PLATFORM for $ARCH"
}
}
}
Le fichier .gitlab-ci.yml GitLab CI/CD équivalent serait :
stages:
- build
- test
- deploy
.parallel-hidden-job:
parallel:
matrix:
- PLATFORM: [linux, mac, windows]
ARCH: [x64, x86]
build-job:
extends: .parallel-hidden-job
stage: build
script:
- echo "Building $PLATFORM for $ARCH"
test-job:
extends: .parallel-hidden-job
stage: test
script:
- echo "Testing $PLATFORM for $ARCH"
deploy-job:
extends: .parallel-hidden-job
stage: deploy
script:
- echo "Testing $PLATFORM for $ARCH"
Dans GitLab, vous pouvez exécuter vos jobs CI/CD dans des conteneurs Docker séparés et isolés en utilisant le mot-clé image.
Par exemple, dans un Jenkinsfile :
stage('Version') {
agent { docker 'python:latest' }
steps {
echo 'Hello Python'
sh 'python --version'
}
}
Cet exemple montre des commandes s'exécutant dans un conteneur python:latest.
Le fichier .gitlab-ci.yml GitLab CI/CD équivalent serait :
version-job:
image: python:latest
script:
- echo "Hello Python"
- python --version
Dans GitLab, utilisez le mot-clé variables pour définir des variables CI/CD. Utilisez des variables pour réutiliser des données de configuration, disposer d'une configuration plus dynamique ou stocker des valeurs importantes. Les variables peuvent être définies globalement ou par job.
Par exemple, dans un Jenkinsfile :
pipeline {
agent any
environment {
NAME = 'Fern'
}
stages {
stage('English') {
environment {
GREETING = 'Hello'
}
steps {
sh 'echo "$GREETING $NAME"'
}
}
stage('Spanish') {
environment {
GREETING = 'Hola'
}
steps {
sh 'echo "$GREETING $NAME"'
}
}
}
}
Cet exemple montre comment les variables peuvent être utilisées pour transmettre des valeurs aux commandes dans les jobs.
Le fichier .gitlab-ci.yml GitLab CI/CD équivalent serait :
default:
image: alpine:latest
stages:
- greet
variables:
NAME: "Fern"
english:
stage: greet
variables:
GREETING: "Hello"
script:
- echo "$GREETING $NAME"
spanish:
stage: greet
variables:
GREETING: "Hola"
script:
- echo "$GREETING $NAME"
Les variables peuvent également être définies dans l'interface GitLab, dans les paramètres CI/CD. Dans certains cas, vous pouvez utiliser des variables protégées et masquées pour les valeurs secrètes. Ces variables sont accessibles dans les jobs de pipeline de la même manière que les variables définies dans le fichier de configuration.
Par exemple, dans un Jenkinsfile :
pipeline {
agent any
stages {
stage('Example Username/Password') {
environment {
AWS_ACCESS_KEY = credentials('aws-access-key')
}
steps {
sh 'my-login-script.sh $AWS_ACCESS_KEY'
}
}
}
}
Le fichier .gitlab-ci.yml GitLab CI/CD équivalent serait :
login-job:
script:
- my-login-script.sh $AWS_ACCESS_KEY
De plus, GitLab CI/CD met à disposition des variables prédéfinies pour chaque pipeline et job, contenant des valeurs pertinentes pour le pipeline et le dépôt.
Lorsqu'un nouveau pipeline démarre, GitLab vérifie quels jobs doivent s'exécuter dans ce pipeline. Vous pouvez configurer des jobs pour qu'ils s'exécutent en fonction de facteurs tels que le statut des variables ou le type de pipeline.
Par exemple, dans un Jenkinsfile :
stage('deploy_staging') {
agent { docker 'alpine:latest' }
when {
branch 'staging'
}
steps {
echo "Deploying to staging"
}
}
Dans cet exemple, le job ne s'exécute que lorsque la branche sur laquelle vous effectuez un commit est nommée staging.
Le fichier .gitlab-ci.yml GitLab CI/CD équivalent serait :
deploy_staging:
stage: deploy
script:
- echo "Deploy to staging server"
rules:
- if: '$CI_COMMIT_BRANCH == staging'
Comme les agents Jenkins, les runners GitLab sont les hôtes qui exécutent les jobs. Si vous utilisez GitLab.com, vous pouvez utiliser la flotte de runners d'instance pour exécuter des jobs sans provisionner vos propres runners.
Pour convertir un agent Jenkins en vue d'une utilisation avec GitLab CI/CD, désinstallez l'agent, puis installez et enregistrez un runner. Les runners ne nécessitent pas beaucoup de surcharge, vous pourrez donc peut-être utiliser un provisionnement similaire à celui des agents Jenkins que vous utilisiez.
Quelques informations clés sur les runners :
tags pour un contrôle plus précis et associer des runners à des jobs spécifiques. Par exemple, vous pouvez utiliser un tag pour les jobs nécessitant du matériel dédié, plus puissant ou spécifique.Par exemple, dans un Jenkinsfile :
pipeline {
agent none
stages {
stage('Linux') {
agent {
label 'linux'
}
steps {
echo "Hello, $USER"
}
}
stage('Windows') {
agent {
label 'windows'
}
steps {
echo "Hello, %USERNAME%"
}
}
}
}
Le fichier .gitlab-ci.yml GitLab CI/CD équivalent serait :
linux_job:
stage: build
tags:
- linux
script:
- echo "Hello, $USER"
windows_job:
stage: build
tags:
- windows
script:
- echo "Hello, %USERNAME%"
Dans GitLab, tout job peut utiliser le mot-clé artifacts pour définir un ensemble d'artefacts à stocker à la fin d'un job. Les artefacts sont des fichiers pouvant être utilisés dans des jobs ultérieurs, par exemple à des fins de test ou de déploiement.
Par exemple, dans un Jenkinsfile :
stages {
stage('Generate Cat') {
steps {
sh 'touch cat.txt'
sh 'echo "meow" > cat.txt'
}
post {
always {
archiveArtifacts artifacts: 'cat.txt'
onlyIfSuccessful: true
}
}
}
stage('Use Cat') {
steps {
sh 'cat cat.txt'
}
}
}
Le fichier .gitlab-ci.yml GitLab CI/CD équivalent serait :
stages:
- generate
- use
generate_cat:
stage: generate
script:
- touch cat.txt
- echo "meow" > cat.txt
artifacts:
paths:
- cat.txt
expire_in: 1 week
use_cat:
stage: use
script:
- cat cat.txt
artifacts:
paths:
- cat.txt
Un cache est créé lorsqu'un job télécharge un ou plusieurs fichiers et les enregistre pour un accès plus rapide ultérieurement. Les jobs suivants utilisant le même cache n'ont pas à télécharger à nouveau les fichiers, ce qui leur permet de s'exécuter plus rapidement. Le cache est stocké sur le runner et téléchargé vers S3 si le cache distribué est activé. Jenkins core ne fournit pas de mise en cache.
Par exemple, dans un fichier .gitlab-ci.yml :
cache-job:
script:
- echo "This job uses a cache."
cache:
key: binaries-cache-$CI_COMMIT_REF_SLUG
paths:
- binaries/
Certaines fonctionnalités de Jenkins activées via des plugins sont prises en charge nativement dans GitLab avec des mots-clés et des fonctionnalités offrant des fonctionnalités similaires. Par exemple :
Vous avez peut-être utilisé des plugins pour des choses comme la qualité du code, la sécurité ou l'analyse statique des applications dans Jenkins. GitLab fournit des scanners de sécurité nativement pour détecter les vulnérabilités dans toutes les parties du SDLC. Vous pouvez ajouter ces plugins dans GitLab à l'aide de modèles. Par exemple, pour ajouter l'analyse SAST à votre pipeline, ajoutez ce qui suit à votre .gitlab-ci.yml :
include:
- template: Jobs/SAST.gitlab-ci.yml
Vous pouvez personnaliser le comportement des scanners de sécurité en utilisant des variables CI/CD, par exemple avec les scanners SAST.
Les informations privilégiées, souvent appelées « secrets », sont des informations sensibles ou des identifiants dont vous avez besoin dans votre workflow CI/CD. Vous pouvez utiliser des secrets pour déverrouiller des ressources protégées ou des informations sensibles dans des outils, des applications, des conteneurs et des environnements cloud natifs.
La gestion des secrets dans Jenkins est généralement gérée avec le champ de type Secret ou le plugin Credentials. Les identifiants stockés dans les paramètres Jenkins peuvent être exposés aux jobs en tant que variables d'environnement à l'aide du plugin Credentials Binding.
Pour la gestion des secrets dans GitLab, vous pouvez utiliser l'une des intégrations prises en charge pour un service externe. Ces services stockent les secrets de manière sécurisée en dehors de votre projet GitLab, mais vous devez disposer d'un abonnement au service.
GitLab prend également en charge l'authentification OIDC pour d'autres services tiers qui prennent en charge OIDC.
De plus, vous pouvez mettre des identifiants à la disposition des jobs en les stockant dans des variables CI/CD, bien que les secrets stockés en texte brut soient susceptibles d'être exposés accidentellement, comme dans Jenkins. Vous devez toujours stocker les informations sensibles dans des variables masquées et protégées, ce qui atténue une partie du risque.
De plus, ne stockez jamais de secrets en tant que variables dans votre fichier .gitlab-ci.yml, qui est public pour tous les utilisateurs ayant accès au projet. Le stockage d'informations sensibles dans des variables ne doit être effectué que dans les paramètres du projet, du groupe ou de l'instance.
Consultez les consignes de sécurité pour améliorer la sécurité de vos variables CI/CD.
La liste suivante d'étapes recommandées a été créée après observation d'organisations ayant réussi à réaliser rapidement cette migration.
Avant de démarrer une migration, vous devez créer un plan de migration pour préparer la migration. Pour une migration depuis Jenkins, posez-vous les questions suivantes en préparation :
Avant de commencer tout travail de migration, vous devez d'abord :
.gitlab-ci.yml dans chaque projet.Vous pouvez utiliser le JenkinsFile Wrapper pour exécuter une instance Jenkins complète dans un job GitLab CI/CD, y compris les plugins. Utilisez cet outil pour faciliter la transition vers GitLab CI/CD, en retardant la migration des pipelines moins urgents.
[!note] Le JenkinsFile Wrapper n'est pas inclus dans GitLab et ne relève pas du périmètre du support. Pour plus d'informations, consultez la déclaration de support.
Si vous avez des questions auxquelles cette page ne répond pas, le forum de la communauté GitLab peut être une excellente ressource.