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.
NoteVous 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.
NoteDans 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
Jenkins | OpenShift 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
Jenkins | OpenShift 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.