3.2. Comprendre les pipelines OpenShift

Red Hat OpenShift Pipelines est une solution cloud-native d'intégration et de livraison continues (CI/CD) basée sur les ressources Kubernetes. Elle utilise les blocs de construction Tekton pour automatiser les déploiements sur plusieurs plateformes en faisant abstraction des détails de mise en œuvre sous-jacents. Tekton introduit un certain nombre de définitions de ressources personnalisées (CRD) standard pour définir les pipelines CI/CD qui sont portables à travers les distributions Kubernetes.

3.2.1. Caractéristiques principales

  • Red Hat OpenShift Pipelines est un système CI/CD sans serveur qui exécute des pipelines avec toutes les dépendances requises dans des conteneurs isolés.
  • Red Hat OpenShift Pipelines est conçu pour les équipes décentralisées qui travaillent sur une architecture basée sur les microservices.
  • Red Hat OpenShift Pipelines utilise des définitions de pipeline CI/CD standard qui sont faciles à étendre et à intégrer aux outils Kubernetes existants, ce qui vous permet d'évoluer à la demande.
  • Vous pouvez utiliser Red Hat OpenShift Pipelines pour construire des images avec des outils Kubernetes tels que Source-to-Image (S2I), Buildah, Buildpacks et Kaniko qui sont portables sur n'importe quelle plateforme Kubernetes.
  • Vous pouvez utiliser la console OpenShift Container Platform Developer pour créer des ressources Tekton, consulter les journaux d'exécution des pipelines et gérer les pipelines dans vos espaces de noms OpenShift Container Platform.

3.2.2. Concepts des pipelines OpenShift

Ce guide fournit une vue détaillée des différents concepts de pipelines.

3.2.2.1. Tâches

Task les ressources sont les éléments constitutifs d'un pipeline et consistent en des étapes exécutées de manière séquentielle. Il s'agit essentiellement d'une fonction d'entrées et de sorties. Une tâche peut être exécutée individuellement ou dans le cadre d'un pipeline. Les tâches sont réutilisables et peuvent être utilisées dans plusieurs pipelines.

Steps sont une série de commandes qui sont exécutées séquentiellement par la tâche et qui permettent d'atteindre un objectif spécifique, tel que la construction d'une image. Chaque tâche s'exécute en tant que pod, et chaque étape s'exécute en tant que conteneur au sein de ce pod. Comme les étapes s'exécutent dans le même module, elles peuvent accéder aux mêmes volumes pour les fichiers de mise en cache, les cartes de configuration et les secrets.

L'exemple suivant illustre la tâche apply-manifests.

apiVersion: tekton.dev/v1beta1 1
kind: Task 2
metadata:
  name: apply-manifests 3
spec: 4
  workspaces:
  - name: source
  params:
    - name: manifest_dir
      description: The directory in source that contains yaml manifests
      type: string
      default: "k8s"
  steps:
    - name: apply
      image: image-registry.openshift-image-registry.svc:5000/openshift/cli:latest
      workingDir: /workspace/source
      command: ["/bin/bash", "-c"]
      args:
        - |-
          echo Applying manifests in $(params.manifest_dir) directory
          oc apply -f $(params.manifest_dir)
          echo -----------------------------------
1
La version de l'API de la tâche, v1beta1.
2
Le type d'objet Kubernetes, Task.
3
Le nom unique de cette tâche.
4
La liste des paramètres et des étapes de la tâche et l'espace de travail utilisé par la tâche.

Cette tâche démarre le pod et exécute un conteneur à l'intérieur de ce pod en utilisant l'image spécifiée pour exécuter les commandes spécifiées.

Note

À partir d'OpenShift Pipelines 1.6, les valeurs par défaut suivantes du fichier YAML de l'étape sont supprimées :

  • La variable d'environnement HOME n'indique pas par défaut le répertoire /tekton/home
  • Le champ workingDir ne renvoie pas par défaut au répertoire /workspace

Au lieu de cela, le conteneur de l'étape définit la variable d'environnement HOME et le champ workingDir. Toutefois, vous pouvez remplacer les valeurs par défaut en spécifiant les valeurs personnalisées dans le fichier YAML de l'étape.

À titre de mesure temporaire, pour maintenir la compatibilité ascendante avec les anciennes versions d'OpenShift Pipelines, vous pouvez définir les champs suivants dans la définition de la ressource personnalisée TektonConfig à false:

spec:
  pipeline:
    disable-working-directory-overwrite: false
    disable-home-env-overwrite: false

3.2.2.2. Quand l'expression

Les expressions When protègent l'exécution des tâches en définissant des critères pour l'exécution des tâches au sein d'un pipeline. Elles contiennent une liste de composants qui permet à une tâche de s'exécuter uniquement lorsque certains critères sont remplis. Les expressions When sont également prises en charge dans l'ensemble final des tâches spécifiées à l'aide du champ finally dans le fichier YAML du pipeline.

Les éléments clés d'une expression when sont les suivants :

  • input: Spécifie des entrées statiques ou des variables telles qu'un paramètre, un résultat de tâche et un état d'exécution. Vous devez saisir une entrée valide. Si vous ne saisissez pas d'entrée valide, sa valeur prend par défaut la forme d'une chaîne vide.
  • operator: Spécifie la relation d'une entrée avec un ensemble de values. Saisissez in ou notin comme valeurs d'opérateur.
  • values: Spécifie un tableau de valeurs de chaînes de caractères. Entrez un tableau non vide de valeurs statiques ou de variables telles que des paramètres, des résultats et un état lié d'un espace de travail.

Les expressions when déclarées sont évaluées avant l'exécution de la tâche. Si la valeur d'une expression when est True, la tâche est exécutée. Si la valeur d'une expression when est False, la tâche est ignorée.

Vous pouvez utiliser les expressions when dans différents cas d'utilisation. Par exemple, si :

  • Le résultat d'une tâche précédente est conforme aux attentes.
  • Un fichier dans un dépôt Git a été modifié dans les commits précédents.
  • Une image existe dans le registre.
  • Un espace de travail est disponible en option.

L'exemple suivant montre les expressions when pour une exécution de pipeline. Le pipeline n'exécutera la tâche create-file que si les critères suivants sont remplis : le paramètre path est README.md, et la tâche echo-file-exists n'est exécutée que si le résultat exists de la tâche check-file est yes.

apiVersion: tekton.dev/v1beta1
kind: PipelineRun 1
metadata:
  generateName: guarded-pr-
spec:
  serviceAccountName: 'pipeline'
  pipelineSpec:
    params:
      - name: path
        type: string
        description: The path of the file to be created
    workspaces:
      - name: source
        description: |
          This workspace is shared among all the pipeline tasks to read/write common resources
    tasks:
      - name: create-file 2
        when:
          - input: "$(params.path)"
            operator: in
            values: ["README.md"]
        workspaces:
          - name: source
            workspace: source
        taskSpec:
          workspaces:
            - name: source
              description: The workspace to create the readme file in
          steps:
            - name: write-new-stuff
              image: ubuntu
              script: 'touch $(workspaces.source.path)/README.md'
      - name: check-file
        params:
          - name: path
            value: "$(params.path)"
        workspaces:
          - name: source
            workspace: source
        runAfter:
          - create-file
        taskSpec:
          params:
            - name: path
          workspaces:
            - name: source
              description: The workspace to check for the file
          results:
            - name: exists
              description: indicates whether the file exists or is missing
          steps:
            - name: check-file
              image: alpine
              script: |
                if test -f $(workspaces.source.path)/$(params.path); then
                  printf yes | tee /tekton/results/exists
                else
                  printf no | tee /tekton/results/exists
                fi
      - name: echo-file-exists
        when: 3
          - input: "$(tasks.check-file.results.exists)"
            operator: in
            values: ["yes"]
        taskSpec:
          steps:
            - name: echo
              image: ubuntu
              script: 'echo file exists'
...
      - name: task-should-be-skipped-1
        when: 4
          - input: "$(params.path)"
            operator: notin
            values: ["README.md"]
        taskSpec:
          steps:
            - name: echo
              image: ubuntu
              script: exit 1
...
    finally:
      - name: finally-task-should-be-executed
        when: 5
          - input: "$(tasks.echo-file-exists.status)"
            operator: in
            values: ["Succeeded"]
          - input: "$(tasks.status)"
            operator: in
            values: ["Succeeded"]
          - input: "$(tasks.check-file.results.exists)"
            operator: in
            values: ["yes"]
          - input: "$(params.path)"
            operator: in
            values: ["README.md"]
        taskSpec:
          steps:
            - name: echo
              image: ubuntu
              script: 'echo finally done'
  params:
    - name: path
      value: README.md
  workspaces:
    - name: source
      volumeClaimTemplate:
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 16Mi
1
Spécifie le type d'objet Kubernetes. Dans cet exemple, PipelineRun.
2
Tâche create-file utilisée dans le pipeline.
3
when qui spécifie d'exécuter la tâche echo-file-exists uniquement si le résultat exists de la tâche check-file est yes.
4
when qui spécifie d'ignorer la tâche task-should-be-skipped-1 uniquement si le paramètre path est README.md.
5
when expression qui spécifie d'exécuter la tâche finally-task-should-be-executed seulement si le statut d'exécution de la tâche echo-file-exists et le statut de la tâche est Succeeded, le résultat exists de la tâche check-file est yes, et le paramètre path est README.md.

La page Pipeline Run details de la console web de OpenShift Container Platform montre l'état des tâches et des expressions de temps comme suit :

  • Tous les critères sont remplis : Les tâches et le symbole de l'expression "quand", représenté par un losange, sont verts.
  • L'un des critères n'est pas respecté : La tâche est ignorée. Les tâches ignorées et le symbole de l'expression "quand" sont grisés.
  • Aucun des critères n'est rempli : La tâche est ignorée. Les tâches ignorées et le symbole de l'expression "quand" sont grisés.
  • L'exécution de la tâche échoue : Les tâches qui échouent et le symbole de l'expression "quand" sont en rouge.

3.2.2.3. Enfin, les tâches

Les tâches finally sont le dernier ensemble de tâches spécifiées à l'aide du champ finally dans le fichier YAML du pipeline. Une tâche finally exécute toujours les tâches du pipeline, que les exécutions du pipeline soient réussies ou non. Les tâches finally sont exécutées en parallèle après l'exécution de toutes les tâches du pipeline, avant que le pipeline correspondant ne se termine.

Vous pouvez configurer une tâche finally pour qu'elle consomme les résultats de n'importe quelle tâche du même pipeline. Cette approche ne modifie pas l'ordre d'exécution de cette tâche finale. Elle est exécutée en parallèle avec d'autres tâches finales après l'exécution de toutes les tâches non finales.

L'exemple suivant montre un extrait de code du pipeline clone-cleanup-workspace. Ce code clone le référentiel dans un espace de travail partagé et nettoie l'espace de travail. Après avoir exécuté les tâches du pipeline, la tâche cleanup spécifiée dans la section finally du fichier YAML du pipeline nettoie l'espace de travail.

apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: clone-cleanup-workspace 1
spec:
  workspaces:
    - name: git-source 2
  tasks:
    - name: clone-app-repo 3
      taskRef:
        name: git-clone-from-catalog
      params:
        - name: url
          value: https://github.com/tektoncd/community.git
        - name: subdirectory
          value: application
      workspaces:
        - name: output
          workspace: git-source
  finally:
    - name: cleanup 4
      taskRef: 5
        name: cleanup-workspace
      workspaces: 6
        - name: source
          workspace: git-source
    - name: check-git-commit
      params: 7
        - name: commit
          value: $(tasks.clone-app-repo.results.commit)
      taskSpec: 8
        params:
          - name: commit
        steps:
          - name: check-commit-initialized
            image: alpine
            script: |
              if [[ ! $(params.commit) ]]; then
                exit 1
              fi
1
Nom unique de la canalisation.
2
L'espace de travail partagé où le dépôt git est cloné.
3
La tâche de clonage du référentiel d'application dans l'espace de travail partagé.
4
La tâche de nettoyage de l'espace de travail partagé.
5
Une référence à la tâche qui doit être exécutée lors de l'exécution de la tâche.
6
Volume de stockage partagé dont une tâche d'un pipeline a besoin au moment de l'exécution pour recevoir des données d'entrée ou fournir des données de sortie.
7
Liste des paramètres requis pour une tâche. Si un paramètre n'a pas de valeur implicite par défaut, vous devez définir explicitement sa valeur.
8
Définition des tâches intégrées.

3.2.2.4. Exécution des tâches

Un site TaskRun instancie une tâche à exécuter avec des entrées, des sorties et des paramètres d'exécution spécifiques sur un cluster. Il peut être invoqué seul ou dans le cadre d'une exécution de pipeline pour chaque tâche d'un pipeline.

Une tâche consiste en une ou plusieurs étapes qui exécutent des images de conteneur, et chaque image de conteneur effectue un travail de construction spécifique. Une exécution de tâche exécute les étapes d'une tâche dans l'ordre spécifié, jusqu'à ce que toutes les étapes s'exécutent avec succès ou qu'un échec se produise. Un TaskRun est automatiquement créé par un PipelineRun pour chaque tâche d'un pipeline.

L'exemple suivant montre une tâche qui exécute la tâche apply-manifests avec les paramètres d'entrée appropriés :

apiVersion: tekton.dev/v1beta1 1
kind: TaskRun 2
metadata:
  name: apply-manifests-taskrun 3
spec: 4
  serviceAccountName: pipeline
  taskRef: 5
    kind: Task
    name: apply-manifests
  workspaces: 6
  - name: source
    persistentVolumeClaim:
      claimName: source-pvc
1
La tâche exécute la version de l'API v1beta1.
2
Spécifie le type d'objet Kubernetes. Dans cet exemple, TaskRun.
3
Nom unique permettant d'identifier l'exécution de cette tâche.
4
Définition de l'exécution de la tâche. Pour cette exécution de tâche, la tâche et l'espace de travail requis sont spécifiés.
5
Nom de la référence de tâche utilisée pour cette exécution de tâche. Cette tâche exécute la tâche apply-manifests.
6
Espace de travail utilisé par l'exécution de la tâche.

3.2.2.5. Pipelines

Un site Pipeline est un ensemble de ressources Task disposées dans un ordre d'exécution spécifique. Elles sont exécutées pour construire des flux de travail complexes qui automatisent la construction, le déploiement et la livraison d'applications. Vous pouvez définir un flux de travail CI/CD pour votre application à l'aide de pipelines contenant une ou plusieurs tâches.

Une définition de ressource Pipeline se compose d'un certain nombre de champs ou d'attributs qui, ensemble, permettent au pipeline d'atteindre un objectif spécifique. Chaque définition de ressource Pipeline doit contenir au moins une ressource Task, qui reçoit des données d'entrée spécifiques et produit des données de sortie spécifiques. La définition du pipeline peut également inclure Conditions, Workspaces, Parameters, ou Resources en fonction des exigences de l'application.

L'exemple suivant montre le pipeline build-and-deploy, qui construit une image d'application à partir d'un dépôt Git en utilisant la ressource buildah ClusterTask :

apiVersion: tekton.dev/v1beta1 1
kind: Pipeline 2
metadata:
  name: build-and-deploy 3
spec: 4
  workspaces: 5
  - name: shared-workspace
  params: 6
  - name: deployment-name
    type: string
    description: name of the deployment to be patched
  - name: git-url
    type: string
    description: url of the git repo for the code of deployment
  - name: git-revision
    type: string
    description: revision to be used from repo of the code for deployment
    default: "pipelines-1.9"
  - name: IMAGE
    type: string
    description: image to be built from the code
  tasks: 7
  - name: fetch-repository
    taskRef:
      name: git-clone
      kind: ClusterTask
    workspaces:
    - name: output
      workspace: shared-workspace
    params:
    - name: url
      value: $(params.git-url)
    - name: subdirectory
      value: ""
    - name: deleteExisting
      value: "true"
    - name: revision
      value: $(params.git-revision)
  - name: build-image 8
    taskRef:
      name: buildah
      kind: ClusterTask
    params:
    - name: TLSVERIFY
      value: "false"
    - name: IMAGE
      value: $(params.IMAGE)
    workspaces:
    - name: source
      workspace: shared-workspace
    runAfter:
    - fetch-repository
  - name: apply-manifests 9
    taskRef:
      name: apply-manifests
    workspaces:
    - name: source
      workspace: shared-workspace
    runAfter: 10
    - build-image
  - name: update-deployment
    taskRef:
      name: update-deployment
    workspaces:
    - name: source
      workspace: shared-workspace
    params:
    - name: deployment
      value: $(params.deployment-name)
    - name: IMAGE
      value: $(params.IMAGE)
    runAfter:
    - apply-manifests
1
Version de l'API du pipeline v1beta1.
2
Spécifie le type d'objet Kubernetes. Dans cet exemple, Pipeline.
3
Nom unique de cette canalisation.
4
Spécifie la définition et la structure du pipeline.
5
Espaces de travail utilisés pour toutes les tâches du pipeline.
6
Paramètres utilisés pour toutes les tâches du pipeline.
7
Spécifie la liste des tâches utilisées dans le pipeline.
8
La tâche build-image, qui utilise la tâche buildah ClusterTask pour construire des images d'application à partir d'un dépôt Git donné.
9
Task apply-manifests, qui utilise une tâche définie par l'utilisateur portant le même nom.
10
Spécifie l'ordre dans lequel les tâches sont exécutées dans un pipeline. Dans cet exemple, la tâche apply-manifests n'est exécutée qu'une fois la tâche build-image terminée.
Note

L'opérateur Red Hat OpenShift Pipelines installe la tâche de cluster Buildah et crée le compte de service pipeline avec des permissions suffisantes pour construire et pousser une image. La tâche Buildah cluster peut échouer si elle est associée à un compte de service différent avec des autorisations insuffisantes.

3.2.2.6. Exécution du pipeline

Un site PipelineRun est un type de ressource qui lie un pipeline, des espaces de travail, des informations d'identification et un ensemble de valeurs de paramètres spécifiques à un scénario pour exécuter le flux de travail CI/CD.

Un site PipelineRun est l'instance en cours d'exécution d'un pipeline. Il instancie un pipeline pour l'exécuter avec des entrées, des sorties et des paramètres d'exécution spécifiques sur un cluster. Il crée également une exécution de tâche pour chaque tâche de l'exécution du pipeline.

Le pipeline exécute les tâches de manière séquentielle jusqu'à ce qu'elles soient terminées ou qu'une tâche échoue. Le champ status suit la progression de chaque tâche et la stocke à des fins de contrôle et d'audit.

L'exemple suivant exécute le pipeline build-and-deploy avec les ressources et les paramètres appropriés :

apiVersion: tekton.dev/v1beta1 1
kind: PipelineRun 2
metadata:
  name: build-deploy-api-pipelinerun 3
spec:
  pipelineRef:
    name: build-and-deploy 4
  params: 5
  - name: deployment-name
    value: vote-api
  - name: git-url
    value: https://github.com/openshift-pipelines/vote-api.git
  - name: IMAGE
    value: image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/vote-api
  workspaces: 6
  - name: shared-workspace
    volumeClaimTemplate:
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 500Mi
1
Exécution du pipeline Version de l'API v1beta1.
2
Le type d'objet Kubernetes. Dans cet exemple, PipelineRun.
3
Nom unique permettant d'identifier cette canalisation.
4
Nom du pipeline à exécuter. Dans cet exemple, build-and-deploy.
5
La liste des paramètres nécessaires à l'exécution du pipeline.
6
Espace de travail utilisé par le pipeline.

3.2.2.7. Espaces de travail

Note

Il est recommandé d'utiliser des espaces de travail au lieu des CR PipelineResource dans Red Hat OpenShift Pipelines, car les CR PipelineResource sont difficiles à déboguer, limités dans leur portée et rendent les tâches moins réutilisables.

Les espaces de travail déclarent les volumes de stockage partagés dont une tâche d'un pipeline a besoin au moment de l'exécution pour recevoir des données d'entrée ou fournir des données de sortie. Au lieu de spécifier l'emplacement réel des volumes, les espaces de travail vous permettent de déclarer le système de fichiers ou les parties du système de fichiers qui seraient nécessaires au moment de l'exécution. Une tâche ou un pipeline déclare l'espace de travail et vous devez fournir les détails de l'emplacement spécifique du volume. Celui-ci est ensuite monté dans cet espace de travail lors de l'exécution d'une tâche ou d'un pipeline. Cette séparation entre la déclaration de volume et les volumes de stockage au moment de l'exécution rend les tâches réutilisables, flexibles et indépendantes de l'environnement de l'utilisateur.

Avec les espaces de travail, vous pouvez

  • Stocker les entrées et sorties des tâches
  • Partager des données entre les tâches
  • Utilisez-le comme point de montage pour les informations d'identification contenues dans les secrets
  • L'utiliser comme point de montage pour les configurations contenues dans les cartes de configuration
  • L'utiliser comme point de montage pour les outils communs partagés par une organisation
  • Créer un cache d'artefacts de construction qui accélère les travaux

Vous pouvez spécifier des espaces de travail dans les sites TaskRun ou PipelineRun en utilisant :

  • Une carte de configuration ou un secret en lecture seule
  • Une revendication de volume persistant existante partagée avec d'autres tâches
  • Une demande de volume persistante à partir d'un modèle de demande de volume fourni
  • Une adresse emptyDir qui est rejetée à la fin de l'exécution de la tâche

L'exemple suivant montre un extrait de code du pipeline build-and-deploy, qui déclare un espace de travail shared-workspace pour les tâches build-image et apply-manifests telles que définies dans le pipeline.

apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: build-and-deploy
spec:
  workspaces: 1
  - name: shared-workspace
  params:
...
  tasks: 2
  - name: build-image
    taskRef:
      name: buildah
      kind: ClusterTask
    params:
    - name: TLSVERIFY
      value: "false"
    - name: IMAGE
      value: $(params.IMAGE)
    workspaces: 3
    - name: source 4
      workspace: shared-workspace 5
    runAfter:
    - fetch-repository
  - name: apply-manifests
    taskRef:
      name: apply-manifests
    workspaces: 6
    - name: source
      workspace: shared-workspace
    runAfter:
      - build-image
...
1
Liste des espaces de travail partagés entre les tâches définies dans le pipeline. Un pipeline peut définir autant d'espaces de travail que nécessaire. Dans cet exemple, un seul espace de travail nommé shared-workspace est déclaré.
2
Définition des tâches utilisées dans le pipeline. Cet extrait définit deux tâches, build-image et apply-manifests, qui partagent un espace de travail commun.
3
Liste des espaces de travail utilisés dans la tâche build-image. Une définition de tâche peut inclure autant d'espaces de travail que nécessaire. Toutefois, il est recommandé qu'une tâche utilise au maximum un espace de travail accessible en écriture.
4
Nom qui identifie de manière unique l'espace de travail utilisé dans la tâche. Cette tâche utilise un espace de travail nommé source.
5
Nom de l'espace de travail du pipeline utilisé par la tâche. Notez que l'espace de travail source utilise à son tour l'espace de travail du pipeline nommé shared-workspace.
6
Liste des espaces de travail utilisés dans la tâche apply-manifests. Notez que cette tâche partage l'espace de travail source avec la tâche build-image.

Les espaces de travail aident les tâches à partager des données et vous permettent de spécifier un ou plusieurs volumes dont chaque tâche du pipeline a besoin pendant son exécution. Vous pouvez créer une demande de volume persistant ou fournir un modèle de demande de volume qui crée une demande de volume persistant pour vous.

L'extrait de code suivant de l'exécution du pipeline build-deploy-api-pipelinerun utilise un modèle de demande de volume pour créer une demande de volume persistante afin de définir le volume de stockage de l'espace de travail shared-workspace utilisé dans le pipeline build-and-deploy.

apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
  name: build-deploy-api-pipelinerun
spec:
  pipelineRef:
    name: build-and-deploy
  params:
...

  workspaces: 1
  - name: shared-workspace 2
    volumeClaimTemplate: 3
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 500Mi
1
Spécifie la liste des espaces de travail du pipeline pour lesquels la liaison de volume sera fournie lors de l'exécution du pipeline.
2
Le nom de l'espace de travail dans le pipeline pour lequel le volume est fourni.
3
Spécifie un modèle de revendication de volume qui crée une revendication de volume persistante pour définir le volume de stockage de l'espace de travail.

3.2.2.8. Déclencheurs

Utilisez Triggers en conjonction avec les pipelines pour créer un système CI/CD à part entière où les ressources Kubernetes définissent l'ensemble de l'exécution CI/CD. Les déclencheurs capturent les événements externes, tels qu'une demande d'extraction Git, et les traitent pour en extraire des informations clés. La mise en correspondance de ces données d'événement avec un ensemble de paramètres prédéfinis déclenche une série de tâches qui peuvent ensuite créer et déployer des ressources Kubernetes et instancier le pipeline.

Par exemple, vous définissez un flux de travail CI/CD à l'aide de Red Hat OpenShift Pipelines pour votre application. Le pipeline doit démarrer pour que toute nouvelle modification prenne effet dans le référentiel de l'application. Les déclencheurs automatisent ce processus en capturant et en traitant tout événement de changement et en déclenchant une exécution du pipeline qui déploie la nouvelle image avec les dernières modifications.

Les déclencheurs sont constitués des principales ressources suivantes, qui fonctionnent ensemble pour former un système CI/CD réutilisable, découplé et autonome :

  • La ressource TriggerBinding extrait les champs d'une charge utile d'événement et les stocke en tant que paramètres.

    L'exemple suivant montre un extrait de code de la ressource TriggerBinding, qui extrait les informations relatives au dépôt Git de la charge utile de l'événement reçu :

    apiVersion: triggers.tekton.dev/v1beta1 1
    kind: TriggerBinding 2
    metadata:
      name: vote-app 3
    spec:
      params: 4
      - name: git-repo-url
        value: $(body.repository.url)
      - name: git-repo-name
        value: $(body.repository.name)
      - name: git-revision
        value: $(body.head_commit.id)
    1
    La version API de la ressource TriggerBinding. Dans cet exemple, v1beta1.
    2
    Spécifie le type d'objet Kubernetes. Dans cet exemple, TriggerBinding.
    3
    Nom unique pour identifier la ressource TriggerBinding.
    4
    Liste des paramètres qui seront extraits de la charge utile de l'événement reçu et transmis à la ressource TriggerTemplate. Dans cet exemple, l'URL, le nom et la révision du dépôt Git sont extraits du corps de l'événement.
  • La ressource TriggerTemplate sert de norme pour la façon dont les ressources doivent être créées. Elle spécifie la manière dont les données paramétrées de la ressource TriggerBinding doivent être utilisées. Un modèle de déclenchement reçoit des données de la liaison de déclenchement, puis effectue une série d'actions qui aboutissent à la création de nouvelles ressources de pipeline et au lancement d'un nouveau cycle de pipeline.

    L'exemple suivant montre un extrait de code d'une ressource TriggerTemplate, qui crée un pipeline en utilisant les informations du dépôt Git reçues de la ressource TriggerBinding que vous venez de créer :

    apiVersion: triggers.tekton.dev/v1beta1 1
    kind: TriggerTemplate 2
    metadata:
      name: vote-app 3
    spec:
      params: 4
      - name: git-repo-url
        description: The git repository url
      - name: git-revision
        description: The git revision
        default: pipelines-1.9
      - name: git-repo-name
        description: The name of the deployment to be created / patched
    
      resourcetemplates: 5
      - apiVersion: tekton.dev/v1beta1
        kind: PipelineRun
        metadata:
          name: build-deploy-$(tt.params.git-repo-name)-$(uid)
        spec:
          serviceAccountName: pipeline
          pipelineRef:
            name: build-and-deploy
          params:
          - name: deployment-name
            value: $(tt.params.git-repo-name)
          - name: git-url
            value: $(tt.params.git-repo-url)
          - name: git-revision
            value: $(tt.params.git-revision)
          - name: IMAGE
            value: image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/$(tt.params.git-repo-name)
          workspaces:
          - name: shared-workspace
            volumeClaimTemplate:
             spec:
              accessModes:
               - ReadWriteOnce
              resources:
                requests:
                  storage: 500Mi
    1
    La version API de la ressource TriggerTemplate. Dans cet exemple, v1beta1.
    2
    Spécifie le type d'objet Kubernetes. Dans cet exemple, TriggerTemplate.
    3
    Nom unique pour identifier la ressource TriggerTemplate.
    4
    Paramètres fournis par la ressource TriggerBinding.
    5
    Liste des modèles qui spécifient la manière dont les ressources doivent être créées en utilisant les paramètres reçus par les ressources TriggerBinding ou EventListener.
  • La ressource Trigger combine les ressources TriggerBinding et TriggerTemplate et, éventuellement, le processeur d'événements interceptors.

    Les intercepteurs traitent tous les événements pour une plateforme spécifique qui s'exécute avant la ressource TriggerBinding. Vous pouvez utiliser les intercepteurs pour filtrer les données utiles, vérifier les événements, définir et tester les conditions de déclenchement et mettre en œuvre d'autres traitements utiles. Les intercepteurs utilisent le secret pour la vérification des événements. Une fois que les données de l'événement passent par un intercepteur, elles sont transmises au déclencheur avant que vous ne transmettiez les données de la charge utile à la liaison du déclencheur. Vous pouvez également utiliser un intercepteur pour modifier le comportement du déclencheur associé référencé dans la spécification EventListener.

    L'exemple suivant montre un extrait de code d'une ressource Trigger, nommée vote-trigger, qui connecte les ressources TriggerBinding et TriggerTemplate, ainsi que le processeur d'événements interceptors.

    apiVersion: triggers.tekton.dev/v1beta1 1
    kind: Trigger 2
    metadata:
      name: vote-trigger 3
    spec:
      serviceAccountName: pipeline 4
      interceptors:
        - ref:
            name: "github" 5
          params: 6
            - name: "secretRef"
              value:
                secretName: github-secret
                secretKey: secretToken
            - name: "eventTypes"
              value: ["push"]
      bindings:
        - ref: vote-app 7
      template: 8
         ref: vote-app
    ---
    apiVersion: v1
    kind: Secret 9
    metadata:
      name: github-secret
    type: Opaque
    stringData:
      secretToken: "1234567"
    1
    La version API de la ressource Trigger. Dans cet exemple, v1beta1.
    2
    Spécifie le type d'objet Kubernetes. Dans cet exemple, Trigger.
    3
    Nom unique pour identifier la ressource Trigger.
    4
    Nom du compte de service à utiliser.
    5
    Nom de l'intercepteur à référencer. Dans cet exemple, github.
    6
    Paramètres souhaités à spécifier.
    7
    Nom de la ressource TriggerBinding à connecter à la ressource TriggerTemplate.
    8
    Nom de la ressource TriggerTemplate à connecter à la ressource TriggerBinding.
    9
    Secret à utiliser pour vérifier les événements.
  • La ressource EventListener fournit un point de terminaison, ou un puits d'événements, qui écoute les événements HTTP entrants avec une charge utile JSON. Elle extrait les paramètres de l'événement de chaque ressource TriggerBinding, puis traite ces données pour créer des ressources Kubernetes comme spécifié par la ressource TriggerTemplate correspondante. La ressource EventListener effectue également un traitement léger des événements ou un filtrage de base sur la charge utile à l'aide de l'événement interceptors, qui identifie le type de charge utile et le modifie éventuellement. Actuellement, les déclencheurs de pipeline prennent en charge cinq types d'intercepteurs : Webhook Interceptors, GitHub Interceptors, GitLab Interceptors, Bitbucket Interceptors, et Common Expression Language (CEL) Interceptors.

    L'exemple suivant montre une ressource EventListener qui fait référence à la ressource Trigger nommée vote-trigger.

    apiVersion: triggers.tekton.dev/v1beta1 1
    kind: EventListener 2
    metadata:
      name: vote-app 3
    spec:
      serviceAccountName: pipeline 4
      triggers:
        - triggerRef: vote-trigger 5
    1
    La version API de la ressource EventListener. Dans cet exemple, v1beta1.
    2
    Spécifie le type d'objet Kubernetes. Dans cet exemple, EventListener.
    3
    Nom unique pour identifier la ressource EventListener.
    4
    Nom du compte de service à utiliser.
    5
    Nom de la ressource Trigger référencée par la ressource EventListener.

3.2.3. Ressources complémentaires