5.3. Migration de Jenkins vers OpenShift Pipelines ou Tekton

Vous pouvez migrer vos flux de travail CI/CD de Jenkins vers Red Hat OpenShift Pipelines, une expérience CI/CD cloud-native basée sur le projet Tekton.

5.3.1. Comparaison des concepts de Jenkins et d'OpenShift Pipelines

Vous pouvez consulter et comparer les termes équivalents suivants utilisés dans Jenkins et OpenShift Pipelines.

5.3.1.1. Terminologie Jenkins

Jenkins propose des pipelines déclaratifs et scénarisés qui sont extensibles à l'aide de bibliothèques partagées et de plugins. Voici quelques termes de base de Jenkins :

  • Pipeline: Automatise l'ensemble du processus de construction, de test et de déploiement des applications en utilisant la syntaxe Groovy.
  • Node: Une machine capable d'orchestrer ou d'exécuter un pipeline scénarisé.
  • Stage: Un sous-ensemble conceptuellement distinct de tâches effectuées dans un pipeline. Les plugins ou les interfaces utilisateurs utilisent souvent ce bloc pour afficher l'état ou la progression des tâches.
  • Step: Une tâche unique qui spécifie l'action exacte à effectuer, soit en utilisant une commande, soit en utilisant un script.

5.3.1.2. Terminologie d'OpenShift Pipelines

OpenShift Pipelines utilise la syntaxe YAML pour les pipelines déclaratifs et se compose de tâches. Voici quelques termes de base dans OpenShift Pipelines :

  • Pipeline: Un ensemble de tâches en série, en parallèle ou les deux.
  • Task: Une séquence d'étapes sous forme de commandes, de binaires ou de scripts.
  • PipelineRun: Exécution d'un pipeline avec une ou plusieurs tâches.
  • TaskRun: Exécution d'une tâche comportant une ou plusieurs étapes.

    Note

    Vous pouvez lancer un PipelineRun ou un TaskRun avec un ensemble d'entrées telles que des paramètres et des espaces de travail, et l'exécution se traduit par un ensemble de sorties et d'artefacts.

  • Workspace: Dans OpenShift Pipelines, les espaces de travail sont des blocs conceptuels qui servent les objectifs suivants :

    • Stockage des données d'entrée, des données de sortie et des éléments de construction.
    • Espace commun pour partager les données entre les tâches.
    • Points de montage pour les informations d'identification contenues dans les secrets, les configurations contenues dans les cartes de configuration et les outils communs partagés par une organisation.
    Note

    Dans Jenkins, il n'y a pas d'équivalent direct des espaces de travail d'OpenShift Pipelines. Vous pouvez considérer le nœud de contrôle comme un espace de travail, car il stocke le référentiel de code cloné, l'historique de construction et les artefacts. Lorsqu'un travail est assigné à un nœud différent, le code cloné et les artefacts générés sont stockés dans ce nœud, mais le nœud de contrôle conserve l'historique de construction.

5.3.1.3. Cartographie des concepts

Les éléments constitutifs de Jenkins et d'OpenShift Pipelines ne sont pas équivalents, et une comparaison spécifique ne fournit pas une correspondance techniquement précise. Les termes et concepts suivants de Jenkins et OpenShift Pipelines sont en corrélation générale :

Tableau 5.1. Jenkins et OpenShift Pipelines - comparaison de base

JenkinsOpenShift Pipelines

Pipeline

Pipeline et PipelineRun

Stade

Tâche

Étape

Une étape dans une tâche

5.3.2. Migrer un exemple de pipeline de Jenkins vers OpenShift Pipelines

Vous pouvez utiliser les exemples équivalents suivants pour vous aider à migrer vos pipelines de construction, de test et de déploiement de Jenkins vers OpenShift Pipelines.

5.3.2.1. Pipeline Jenkins

Considérons un pipeline Jenkins écrit en Groovy pour construire, tester et déployer :

pipeline {
   agent any
   stages {
       stage('Build') {
           steps {
               sh 'make'
           }
       }
       stage('Test'){
           steps {
               sh 'make check'
               junit 'reports/**/*.xml'
           }
       }
       stage('Deploy') {
           steps {
               sh 'make publish'
           }
       }
   }
}

5.3.2.2. OpenShift Pipelines pipeline

Pour créer un pipeline dans OpenShift Pipelines équivalent au pipeline Jenkins précédent, vous créez les trois tâches suivantes :

Exemple build fichier de définition YAML de la tâche

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: myproject-build
spec:
  workspaces:
  - name: source
  steps:
  - image: my-ci-image
    command: ["make"]
    workingDir: $(workspaces.source.path)

Exemple test fichier de définition YAML de la tâche

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: myproject-test
spec:
  workspaces:
  - name: source
  steps:
  - image: my-ci-image
    command: ["make check"]
    workingDir: $(workspaces.source.path)
  - image: junit-report-image
    script: |
      #!/usr/bin/env bash
      junit-report reports/**/*.xml
    workingDir: $(workspaces.source.path)

Exemple deploy fichier de définition YAML de la tâche

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: myprojectd-deploy
spec:
  workspaces:
  - name: source
  steps:
  - image: my-deploy-image
    command: ["make deploy"]
    workingDir: $(workspaces.source.path)

Vous pouvez combiner les trois tâches de manière séquentielle pour former un pipeline dans OpenShift Pipelines :

Exemple : Pipelines OpenShift pour la construction, les tests et le déploiement

apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: myproject-pipeline
spec:
  workspaces:
  - name: shared-dir
  tasks:
  - name: build
    taskRef:
      name: myproject-build
    workspaces:
    - name: source
      workspace: shared-dir
  - name: test
    taskRef:
      name: myproject-test
    workspaces:
    - name: source
      workspace: shared-dir
  - name: deploy
    taskRef:
      name: myproject-deploy
    workspaces:
    - name: source
      workspace: shared-dir

5.3.3. Migration des plugins Jenkins vers les tâches Tekton Hub

Vous pouvez étendre les capacités de Jenkins en utilisant des plugins. Pour obtenir une extensibilité similaire dans OpenShift Pipelines, utilisez l'une des tâches disponibles dans Tekton Hub.

Par exemple, considérons la tâche git-clone dans Tekton Hub, qui correspond au plugin git pour Jenkins.

Exemple : git-clone task from Tekton Hub

apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
 name: demo-pipeline
spec:
 params:
   - name: repo_url
   - name: revision
 workspaces:
   - name: source
 tasks:
   - name: fetch-from-git
     taskRef:
       name: git-clone
     params:
       - name: url
         value: $(params.repo_url)
       - name: revision
         value: $(params.revision)
     workspaces:
     - name: output
       workspace: source

5.3.4. Étendre les capacités d'OpenShift Pipelines à l'aide de tâches et de scripts personnalisés

Dans OpenShift Pipelines, si vous ne trouvez pas la bonne tâche dans Tekton Hub, ou si vous avez besoin d'un plus grand contrôle sur les tâches, vous pouvez créer des tâches et des scripts personnalisés pour étendre les capacités d'OpenShift Pipelines.

Exemple : Une tâche personnalisée pour exécuter la commande maven test

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: maven-test
spec:
  workspaces:
  - name: source
  steps:
  - image: my-maven-image
    command: ["mvn test"]
    workingDir: $(workspaces.source.path)

Exemple : Exécuter un script shell personnalisé en indiquant son chemin d'accès

...
steps:
  image: ubuntu
  script: |
      #!/usr/bin/env bash
      /workspace/my-script.sh
...

Exemple : Exécuter un script Python personnalisé en l'écrivant dans le fichier YAML

...
steps:
  image: python
  script: |
      #!/usr/bin/env python3
      print(“hello from python!”)
...

5.3.5. Comparaison des modèles d'exécution de Jenkins et d'OpenShift Pipelines

Jenkins et OpenShift Pipelines offrent des fonctions similaires mais sont différents en termes d'architecture et d'exécution.

Tableau 5.2. Comparaison des modèles d'exécution dans Jenkins et OpenShift Pipelines

JenkinsOpenShift Pipelines

Jenkins dispose d'un nœud contrôleur. Jenkins exécute des pipelines et des étapes de manière centralisée, ou orchestre des tâches exécutées sur d'autres nœuds.

OpenShift Pipelines est sans serveur et distribué, et il n'y a pas de dépendance centrale pour l'exécution.

Les conteneurs sont lancés par le nœud contrôleur de Jenkins via le pipeline.

OpenShift Pipelines adopte une approche "container-first", où chaque étape s'exécute en tant que conteneur dans un pod (équivalent aux nœuds dans Jenkins).

L'extensibilité est obtenue par l'utilisation de plugins.

L'extensibilité est obtenue en utilisant les tâches du Tekton Hub ou en créant des tâches et des scripts personnalisés.

5.3.6. Exemples de cas d'utilisation courants

Jenkins et OpenShift Pipelines offrent tous deux des fonctionnalités pour les cas d'utilisation CI/CD les plus courants, tels que

  • Compilation, construction et déploiement d'images à l'aide d'Apache Maven
  • Extension des capacités de base à l'aide de plugins
  • Réutilisation des bibliothèques partageables et des scripts personnalisés

5.3.6.1. Exécuter un pipeline Maven dans Jenkins et OpenShift Pipelines

Vous pouvez utiliser Maven dans les flux de travail Jenkins et OpenShift Pipelines pour compiler, construire et déployer des images. Pour faire correspondre votre flux de travail Jenkins existant à OpenShift Pipelines, considérez les exemples suivants :

Exemple : Compiler et construire une image et la déployer sur OpenShift en utilisant Maven dans Jenkins

#!/usr/bin/groovy
node('maven') {
    stage 'Checkout'
    checkout scm

    stage 'Build'
    sh 'cd helloworld && mvn clean'
    sh 'cd helloworld && mvn compile'

    stage 'Run Unit Tests'
    sh 'cd helloworld && mvn test'

    stage 'Package'
    sh 'cd helloworld && mvn package'

    stage 'Archive artifact'
    sh 'mkdir -p artifacts/deployments && cp helloworld/target/*.war artifacts/deployments'
    archive 'helloworld/target/*.war'

    stage 'Create Image'
    sh 'oc login https://kubernetes.default -u admin -p admin --insecure-skip-tls-verify=true'
    sh 'oc new-project helloworldproject'
    sh 'oc project helloworldproject'
    sh 'oc process -f helloworld/jboss-eap70-binary-build.json | oc create -f -'
    sh 'oc start-build eap-helloworld-app --from-dir=artifacts/'

    stage 'Deploy'
    sh 'oc new-app helloworld/jboss-eap70-deploy.json' }

Exemple : Compiler et construire une image et la déployer sur OpenShift en utilisant Maven dans OpenShift Pipelines.

apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: maven-pipeline
spec:
  workspaces:
    - name: shared-workspace
    - name: maven-settings
    - name: kubeconfig-dir
      optional: true
  params:
    - name: repo-url
    - name: revision
    - name: context-path
  tasks:
    - name: fetch-repo
      taskRef:
        name: git-clone
      workspaces:
        - name: output
          workspace: shared-workspace
      params:
        - name: url
          value: "$(params.repo-url)"
        - name: subdirectory
          value: ""
        - name: deleteExisting
          value: "true"
        - name: revision
          value: $(params.revision)
    - name: mvn-build
      taskRef:
        name: maven
      runAfter:
        - fetch-repo
      workspaces:
        - name: source
          workspace: shared-workspace
        - name: maven-settings
          workspace: maven-settings
      params:
        - name: CONTEXT_DIR
          value: "$(params.context-path)"
        - name: GOALS
          value: ["-DskipTests", "clean", "compile"]
    - name: mvn-tests
      taskRef:
        name: maven
      runAfter:
        - mvn-build
      workspaces:
        - name: source
          workspace: shared-workspace
        - name: maven-settings
          workspace: maven-settings
      params:
        - name: CONTEXT_DIR
          value: "$(params.context-path)"
        - name: GOALS
          value: ["test"]
    - name: mvn-package
      taskRef:
        name: maven
      runAfter:
        - mvn-tests
      workspaces:
        - name: source
          workspace: shared-workspace
        - name: maven-settings
          workspace: maven-settings
      params:
        - name: CONTEXT_DIR
          value: "$(params.context-path)"
        - name: GOALS
          value: ["package"]
    - name: create-image-and-deploy
      taskRef:
        name: openshift-client
      runAfter:
        - mvn-package
      workspaces:
        - name: manifest-dir
          workspace: shared-workspace
        - name: kubeconfig-dir
          workspace: kubeconfig-dir
      params:
        - name: SCRIPT
          value: |
            cd "$(params.context-path)"
            mkdir -p ./artifacts/deployments && cp ./target/*.war ./artifacts/deployments
            oc new-project helloworldproject
            oc project helloworldproject
            oc process -f jboss-eap70-binary-build.json | oc create -f -
            oc start-build eap-helloworld-app --from-dir=artifacts/
            oc new-app jboss-eap70-deploy.json

5.3.6.2. Étendre les capacités de base de Jenkins et d'OpenShift Pipelines à l'aide de plugins

Jenkins a l'avantage de disposer d'un vaste écosystème composé de nombreux plugins développés au fil des ans par sa vaste base d'utilisateurs. Vous pouvez rechercher et parcourir les plugins dans l'index des plugins Jenkins.

OpenShift Pipelines dispose également de nombreuses tâches développées et contribuées par la communauté et les utilisateurs professionnels. Un catalogue public des tâches réutilisables d'OpenShift Pipelines est disponible dans le Tekton Hub.

En outre, OpenShift Pipelines intègre de nombreux plugins de l'écosystème Jenkins dans ses capacités de base. Par exemple, l'autorisation est une fonction critique à la fois dans Jenkins et dans OpenShift Pipelines. Alors que Jenkins garantit l'autorisation en utilisant le plugin Role-based Authorization Strategy, OpenShift Pipelines utilise le système intégré de contrôle d'accès basé sur les rôles d'OpenShift.

5.3.6.3. Partager du code réutilisable dans Jenkins et OpenShift Pipelines

Les bibliothèques partagées Jenkins fournissent du code réutilisable pour certaines parties des pipelines Jenkins. Les bibliothèques sont partagées entre les fichiers Jenkins afin de créer des pipelines hautement modulaires sans répétition de code.

Bien qu'il n'y ait pas d'équivalent direct des bibliothèques partagées de Jenkins dans OpenShift Pipelines, vous pouvez obtenir des flux de travail similaires en utilisant des tâches du Tekton Hub en combinaison avec des tâches et des scripts personnalisés.

5.3.7. Ressources complémentaires