Chapitre 5. Jenkins


5.1. Configuration des images Jenkins

OpenShift Container Platform fournit une image de conteneur pour exécuter Jenkins. Cette image fournit une instance de serveur Jenkins, qui peut être utilisée pour mettre en place un flux de base pour les tests, l'intégration et la livraison en continu.

L'image est basée sur les images de base universelles de Red Hat (UBI).

OpenShift Container Platform suit la version LTS de Jenkins. OpenShift Container Platform fournit une image qui contient Jenkins 2.x.

Les images Jenkins d'OpenShift Container Platform sont disponibles sur Quay.io ou registry.redhat.io.

Par exemple :

$ podman pull registry.redhat.io/ocp-tools-4/jenkins-rhel8:<image_tag>
Copy to Clipboard Toggle word wrap

Pour utiliser ces images, vous pouvez soit y accéder directement à partir de ces registres, soit les pousser dans votre registre d'images de conteneurs OpenShift Container Platform. En outre, vous pouvez créer un flux d'images qui pointe vers l'image, soit dans votre registre d'images de conteneurs, soit à l'emplacement externe. Vos ressources OpenShift Container Platform peuvent alors référencer le flux d'images.

Mais pour des raisons pratiques, OpenShift Container Platform fournit des flux d'images dans l'espace de noms openshift pour l'image de base de Jenkins ainsi que pour les images d'exemple d'agent fournies pour l'intégration d'OpenShift Container Platform avec Jenkins.

5.1.1. Configuration et personnalisation

Vous pouvez gérer l'authentification Jenkins de deux manières :

  • L'authentification OAuth de OpenShift Container Platform fournie par le plugin OpenShift Container Platform Login.
  • Authentification standard fournie par Jenkins.

5.1.1.1. OpenShift Container Platform Authentification OAuth

L'authentification OAuth est activée en configurant les options sur le panneau Configure Global Security dans l'interface utilisateur Jenkins, ou en définissant la variable d'environnement OPENSHIFT_ENABLE_OAUTH sur Jenkins Deployment configuration à une valeur autre que false. Cela active le plugin OpenShift Container Platform Login, qui récupère les informations de configuration à partir des données de pod ou en interagissant avec le serveur API OpenShift Container Platform.

Les informations d'identification valides sont contrôlées par le fournisseur d'identité d'OpenShift Container Platform.

Jenkins prend en charge l'accès par navigateur et hors navigateur.

Les utilisateurs valides sont automatiquement ajoutés à la matrice d'autorisation Jenkins lors de la connexion, où les rôles OpenShift Container Platform dictent les permissions Jenkins spécifiques que les utilisateurs ont. Les rôles utilisés par défaut sont les rôles prédéfinis admin, edit, et view. Le plugin de connexion exécute des requêtes self-SAR contre ces rôles dans le projet ou l'espace de noms dans lequel Jenkins est exécuté.

Les utilisateurs ayant le rôle admin disposent des autorisations traditionnelles des utilisateurs administratifs de Jenkins. Les utilisateurs ayant le rôle edit ou view ont progressivement moins d'autorisations.

Les rôles par défaut de OpenShift Container Platform admin, edit, et view et les permissions Jenkins attribuées à ces rôles dans l'instance Jenkins sont configurables.

Lorsque Jenkins est exécuté dans un pod OpenShift Container Platform, le plugin de connexion recherche une carte de configuration nommée openshift-jenkins-login-plugin-config dans l'espace de noms dans lequel Jenkins est exécuté.

Si ce plugin trouve et peut lire cette carte de configuration, vous pouvez définir le rôle pour les mappages de permissions Jenkins. Spécifiquement :

  • Le plugin de connexion traite les paires de clés et de valeurs dans la carte de configuration comme des mappings de permission Jenkins vers des mappings de rôles OpenShift Container Platform.
  • La clé est l'identifiant court du groupe de permission Jenkins et l'identifiant court de la permission Jenkins, ces deux éléments étant séparés par un trait d'union.
  • Si vous souhaitez ajouter l'autorisation Overall Jenkins Administer à un rôle OpenShift Container Platform, la clé doit être Overall-Administer.
  • Pour avoir une idée des groupes de permissions et des ID de permissions disponibles, allez sur la page d'autorisation de la matrice dans la console Jenkins et les ID des groupes et des permissions individuelles dans le tableau qu'ils fournissent.
  • La valeur de la paire clé/valeur est la liste des rôles OpenShift Container Platform auxquels la permission doit s'appliquer, chaque rôle étant séparé par une virgule.
  • Si vous souhaitez ajouter l'autorisation Overall Jenkins Administer aux rôles par défaut admin et edit, ainsi qu'à un nouveau rôle Jenkins que vous avez créé, la valeur de la clé Overall-Administer sera admin,edit,jenkins.
Note

L'utilisateur admin qui est pré-rempli dans l'image Jenkins d'OpenShift Container Platform avec des privilèges administratifs ne reçoit pas ces privilèges lorsque OpenShift Container Platform OAuth est utilisé. Pour accorder ces permissions, l'administrateur du cluster OpenShift Container Platform doit explicitement définir cet utilisateur dans le fournisseur d'identité OpenShift Container Platform et lui attribuer le rôle admin.

Les autorisations des utilisateurs Jenkins qui sont stockées peuvent être modifiées après la création initiale des utilisateurs. Le plugin OpenShift Container Platform Login interroge le serveur API OpenShift Container Platform pour les permissions et met à jour les permissions stockées dans Jenkins pour chaque utilisateur avec les permissions récupérées d'OpenShift Container Platform. Si l'interface utilisateur Jenkins est utilisée pour mettre à jour les permissions d'un utilisateur Jenkins, les changements de permissions sont écrasés la prochaine fois que le plugin interroge OpenShift Container Platform.

Vous pouvez contrôler la fréquence de l'interrogation à l'aide de la variable d'environnement OPENSHIFT_PERMISSIONS_POLL_INTERVAL. L'intervalle d'interrogation par défaut est de cinq minutes.

La manière la plus simple de créer un nouveau service Jenkins utilisant l'authentification OAuth est d'utiliser un modèle.

5.1.1.2. Authentification Jenkins

L'authentification Jenkins est utilisée par défaut si l'image est exécutée directement, sans utiliser de modèle.

Lors du premier démarrage de Jenkins, la configuration est créée avec l'utilisateur et le mot de passe de l'administrateur. Les informations d'identification de l'utilisateur par défaut sont admin et password. Configurez le mot de passe par défaut en définissant la variable d'environnement JENKINS_PASSWORD lorsque vous utilisez, et uniquement lorsque vous utilisez, l'authentification standard de Jenkins.

Procédure

  • Créez une application Jenkins qui utilise l'authentification Jenkins standard :

    $ oc new-app -e \
        JENKINS_PASSWORD=<password> \
        ocp-tools-4/jenkins-rhel8
    Copy to Clipboard Toggle word wrap

5.1.2. Variables d'environnement Jenkins

Le serveur Jenkins peut être configuré avec les variables d'environnement suivantes :

Expand
VariableDéfinitionExemples de valeurs et de réglages

OPENSHIFT_ENABLE_OAUTH

Détermine si le plugin OpenShift Container Platform Login gère l'authentification lors de la connexion à Jenkins. Pour l'activer, réglez-le à true.

Par défaut : false

JENKINS_PASSWORD

Le mot de passe de l'utilisateur admin lors de l'utilisation de l'authentification standard de Jenkins. Ne s'applique pas lorsque OPENSHIFT_ENABLE_OAUTH est défini sur true.

Par défaut : password

JAVA_MAX_HEAP_PARAM, CONTAINER_HEAP_PERCENT, JENKINS_MAX_HEAP_UPPER_BOUND_MB

Ces valeurs contrôlent la taille maximale du tas de la JVM Jenkins. Si JAVA_MAX_HEAP_PARAM est défini, sa valeur est prioritaire. Sinon, la taille maximale du tas est calculée dynamiquement comme CONTAINER_HEAP_PERCENT de la limite de mémoire du conteneur, éventuellement plafonnée à JENKINS_MAX_HEAP_UPPER_BOUND_MB MiB.

Par défaut, la taille maximale du tas de la JVM Jenkins est fixée à 50 % de la limite de mémoire du conteneur, sans plafond.

JAVA_MAX_HEAP_PARAM exemple de réglage : -Xmx512m

CONTAINER_HEAP_PERCENT valeur par défaut : 0.5, ou 50 %

JENKINS_MAX_HEAP_UPPER_BOUND_MB exemple de réglage : 512 MiB

JAVA_INITIAL_HEAP_PARAM, CONTAINER_INITIAL_PERCENT

Ces valeurs contrôlent la taille initiale du tas de la JVM Jenkins. Si JAVA_INITIAL_HEAP_PARAM est défini, sa valeur est prioritaire. Sinon, la taille initiale du tas est calculée dynamiquement comme CONTAINER_INITIAL_PERCENT de la taille maximale du tas calculée dynamiquement.

Par défaut, la JVM définit la taille initiale du tas.

JAVA_INITIAL_HEAP_PARAM exemple de réglage : -Xms32m

CONTAINER_INITIAL_PERCENT exemple de réglage : 0.1 ou 10%

CONTAINER_CORE_LIMIT

S'il est défini, il spécifie un nombre entier de cœurs utilisés pour dimensionner le nombre de threads internes de la JVM.

Exemple de réglage : 2

JAVA_TOOL_OPTIONS

Spécifie les options à appliquer à toutes les JVM s'exécutant dans ce conteneur. Il n'est pas recommandé de remplacer cette valeur.

Par défaut : -XX: UnlockExperimentalVMOptions -XX: UseCGroupMemoryLimitForHeap -Dsun.zip.disableMemoryMapping=true

JAVA_GC_OPTS

Spécifie les paramètres de collecte des déchets de la JVM Jenkins. Il n'est pas recommandé de remplacer cette valeur.

Par défaut : -XX: UseParallelGC -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90

JENKINS_JAVA_OVERRIDES

Spécifie des options supplémentaires pour la JVM Jenkins. Ces options sont ajoutées à toutes les autres options, y compris les options Java ci-dessus, et peuvent être utilisées pour les remplacer si nécessaire. Séparez chaque option supplémentaire par un espace ; si une option contient des caractères d'espacement, échappez-les avec une barre oblique inverse.

Exemples de paramètres : -Dfoo -Dbar; -Dfoo=first\ value -Dbar=second\ value.

JENKINS_OPTS

Spécifie les arguments pour Jenkins.

 

INSTALL_PLUGINS

Spécifie les plugins Jenkins supplémentaires à installer lors de la première exécution du conteneur ou lorsque OVERRIDE_PV_PLUGINS_WITH_IMAGE_PLUGINS est défini sur true. Les plugins sont spécifiés sous la forme d'une liste de paires nom:version délimitées par des virgules.

Exemple de réglage : git:3.7.0,subversion:2.10.2.

OPENSHIFT_PERMISSIONS_POLL_INTERVAL

Spécifie l'intervalle en millisecondes pendant lequel le plugin OpenShift Container Platform Login interroge OpenShift Container Platform sur les permissions associées à chaque utilisateur défini dans Jenkins.

Valeur par défaut : 300000 - 5 minutes

OVERRIDE_PV_CONFIG_WITH_IMAGE_CONFIG

Lors de l'exécution de cette image avec un volume persistant (PV) OpenShift Container Platform pour le répertoire de configuration Jenkins, le transfert de la configuration de l'image vers le PV n'est effectué que lors du premier démarrage de l'image, car le PV est attribué lors de la création de la réclamation de volume persistant (PVC). Si vous créez une image personnalisée qui étend cette image et met à jour la configuration dans l'image personnalisée après le démarrage initial, la configuration n'est pas copiée à moins que vous ne définissiez cette variable d'environnement à true.

Par défaut : false

OVERRIDE_PV_PLUGINS_WITH_IMAGE_PLUGINS

Lors de l'exécution de cette image avec un PV OpenShift Container Platform pour le répertoire de configuration Jenkins, le transfert des plugins de l'image vers le PV n'est effectué que lors du premier démarrage de l'image car le PV est attribué lors de la création du PVC. Si vous créez une image personnalisée qui étend cette image et met à jour les plugins dans l'image personnalisée après le démarrage initial, les plugins ne sont pas copiés à moins que vous ne définissiez cette variable d'environnement sur true.

Par défaut : false

ENABLE_FATAL_ERROR_LOG_FILE

Lors de l'exécution de cette image avec un PVC OpenShift Container Platform pour le répertoire de configuration Jenkins, cette variable d'environnement permet au fichier journal des erreurs fatales de persister lorsqu'une erreur fatale se produit. Le fichier d'erreurs fatales est enregistré à l'adresse /var/lib/jenkins/logs.

Par défaut : false

AGENT_BASE_IMAGE

La définition de cette valeur remplace l'image utilisée pour le conteneur jnlp dans les modèles de pods du plugin Kubernetes fournis avec cette image. Sinon, c'est l'image du flux d'images jenkins-agent-base-rhel8:latest dans l'espace de noms openshift qui est utilisée.

Par défaut : image-registry.openshift-image-registry.svc:5000/openshift/jenkins-agent-base-rhel8:latest

JAVA_BUILDER_IMAGE

La définition de cette valeur remplace l'image utilisée pour le conteneur java-builder dans les modèles de pods du plugin Kubernetes java-builder fournis avec cette image. Sinon, c'est l'image du flux d'images java:latest dans l'espace de noms openshift qui est utilisée.

Par défaut : image-registry.openshift-image-registry.svc:5000/openshift/java:latest

JAVA_FIPS_OPTIONS

La définition de cette valeur permet de contrôler le fonctionnement de la JVM lorsqu'elle est exécutée sur un nœud FIPS. Pour plus d'informations, voir Configurer OpenJDK 11 en mode FIPS.

Par défaut : -Dcom.redhat.fips=false

5.1.3. Fournir à Jenkins un accès à l'ensemble des projets

Si vous voulez exécuter Jenkins ailleurs que dans votre projet, vous devez fournir un jeton d'accès à Jenkins pour qu'il puisse accéder à votre projet.

Procédure

  1. Identifiez le secret du compte de service qui dispose des autorisations appropriées pour accéder au projet auquel Jenkins doit accéder :

    $ oc describe serviceaccount jenkins
    Copy to Clipboard Toggle word wrap

    Exemple de sortie

    Name:       default
    Labels:     <none>
    Secrets:    {  jenkins-token-uyswp    }
                {  jenkins-dockercfg-xcr3d    }
    Tokens:     jenkins-token-izv1u
                jenkins-token-uyswp
    Copy to Clipboard Toggle word wrap

    Dans ce cas, le secret est nommé jenkins-token-uyswp.

  2. Récupérer le jeton du secret :

    $ oc describe secret <nom du secret ci-dessus>
    Copy to Clipboard Toggle word wrap

    Exemple de sortie

    Name:       jenkins-token-uyswp
    Labels:     <none>
    Annotations:    kubernetes.io/service-account.name=jenkins,kubernetes.io/service-account.uid=32f5b661-2a8f-11e5-9528-3c970e3bf0b7
    Type:   kubernetes.io/service-account-token
    Data
    ====
    ca.crt: 1066 bytes
    token:  eyJhbGc..<content cut>....wRA
    Copy to Clipboard Toggle word wrap

    Le paramètre token contient la valeur du token dont Jenkins a besoin pour accéder au projet.

5.1.4. Points de montage inter-volumes Jenkins

L'image Jenkins peut être exécutée avec des volumes montés pour permettre un stockage persistant de la configuration :

  • /var/lib/jenkins est le répertoire de données dans lequel Jenkins stocke les fichiers de configuration, y compris les définitions de tâches.

Pour personnaliser l'image Jenkins officielle d'OpenShift Container Platform, vous pouvez utiliser l'image en tant que source-to-image (S2I).

Vous pouvez utiliser S2I pour copier vos définitions de tâches Jenkins personnalisées, ajouter des plugins supplémentaires ou remplacer le fichier config.xml fourni par votre propre configuration.

Pour inclure vos modifications dans l'image Jenkins, vous devez disposer d'un dépôt Git avec la structure de répertoire suivante :

plugins
Ce répertoire contient les plugins binaires Jenkins que vous souhaitez copier dans Jenkins.
plugins.txt
Ce fichier liste les plugins que vous souhaitez installer en utilisant la syntaxe suivante :
pluginId:pluginVersion
Copy to Clipboard Toggle word wrap
configuration/jobs
Ce répertoire contient les définitions des tâches de Jenkins.
configuration/config.xml
Ce fichier contient votre configuration Jenkins personnalisée.

Le contenu du répertoire configuration/ est copié dans le répertoire /var/lib/jenkins/, de sorte que vous pouvez également y inclure des fichiers supplémentaires, tels que credentials.xml.

L'exemple de configuration de construction personnalise l'image Jenkins dans OpenShift Container Platform

apiVersion: build.openshift.io/v1
kind: BuildConfig
metadata:
  name: custom-jenkins-build
spec:
  source:                       
1

    git:
      uri: https://github.com/custom/repository
    type: Git
  strategy:                     
2

    sourceStrategy:
      from:
        kind: ImageStreamTag
        name: jenkins:2
        namespace: openshift
    type: Source
  output:                       
3

    to:
      kind: ImageStreamTag
      name: custom-jenkins:latest
Copy to Clipboard Toggle word wrap

1
Le paramètre source définit le dépôt Git source avec la disposition décrite ci-dessus.
2
Le paramètre strategy définit l'image originale de Jenkins à utiliser comme image source pour la construction.
3
Le paramètre output définit l'image Jenkins personnalisée résultante que vous pouvez utiliser dans les configurations de déploiement à la place de l'image Jenkins officielle.

5.1.6. Configuration du plugin Jenkins Kubernetes

L'image OpenShift Jenkins inclut le plugin Kubernetes préinstallé pour Jenkins afin que les agents Jenkins puissent être provisionnés dynamiquement sur plusieurs hôtes de conteneurs en utilisant Kubernetes et OpenShift Container Platform.

Pour utiliser le plugin Kubernetes, OpenShift Container Platform fournit une image OpenShift Agent Base qui peut être utilisée comme agent Jenkins.

Important

OpenShift Container Platform 4.11 déplace les images OpenShift Jenkins et OpenShift Agent Base vers le dépôt ocp-tools-4 à l'adresse registry.redhat.io afin que Red Hat puisse produire et mettre à jour les images en dehors du cycle de vie d'OpenShift Container Platform. Auparavant, ces images se trouvaient dans la charge utile d'installation d'OpenShift Container Platform et dans le dépôt openshift4 à l'adresse registry.redhat.io.

Les images OpenShift Jenkins Maven et NodeJS Agent ont été supprimées de la charge utile OpenShift Container Platform 4.11. Red Hat ne produit plus ces images et elles ne sont pas disponibles dans le dépôt ocp-tools-4 à l'adresse registry.redhat.io. Red Hat maintient les versions 4.10 et antérieures de ces images pour toutes les corrections de bogues importantes ou les CVE de sécurité, en suivant la politique de cycle de vie d'OpenShift Container Platform.

Pour plus d'informations, voir le lien "Changements importants pour OpenShift Jenkins images" dans la section suivante "Ressources supplémentaires".

Les images des agents Maven et Node.js sont automatiquement configurées en tant qu'images de modèle de pod Kubernetes dans la configuration d'image Jenkins de la plateforme OpenShift Container pour le plugin Kubernetes. Cette configuration comprend des étiquettes pour chaque image que vous pouvez appliquer à tous vos travaux Jenkins sous leur paramètre Restrict where this project can be run. Si le label est appliqué, les travaux s'exécutent sous un pod OpenShift Container Platform exécutant l'image d'agent correspondante.

Important

Dans OpenShift Container Platform 4.10 et plus, le modèle recommandé pour exécuter des agents Jenkins à l'aide du plugin Kubernetes est d'utiliser des modèles de pods avec les conteneurs jnlp et sidecar. Le conteneur jnlp utilise l'image de l'agent Jenkins Base d'OpenShift Container Platform pour faciliter le lancement d'un pod séparé pour votre construction. L'image du conteneur sidecar contient les outils nécessaires pour construire dans une langue particulière au sein du pod séparé qui a été lancé. De nombreuses images de conteneurs du Red Hat Container Catalog sont référencées dans les flux d'images d'exemple dans l'espace de noms openshift. L'image Jenkins d'OpenShift Container Platform possède un modèle de pod nommé java-build avec des conteneurs sidecar qui démontrent cette approche. Ce modèle de pod utilise la dernière version de Java fournie par le flux d'images java dans l'espace de noms openshift.

L'image Jenkins permet également l'auto-découverte et l'auto-configuration d'images d'agents supplémentaires pour le plugin Kubernetes.

Avec le plugin de synchronisation OpenShift Container Platform, au démarrage de Jenkins, l'image Jenkins recherche dans le projet qu'elle exécute, ou dans les projets listés dans la configuration du plugin, les éléments suivants :

  • Flux d'images dont l'étiquette role est définie sur jenkins-agent.
  • Balises de flux d'images avec l'annotation role fixée à jenkins-agent.
  • Config maps with the role label set to jenkins-agent.

Lorsque l'image Jenkins trouve un flux d'images avec l'étiquette appropriée, ou une balise de flux d'images avec l'annotation appropriée, elle génère la configuration du plugin Kubernetes correspondant. De cette façon, vous pouvez affecter vos travaux Jenkins à l'exécution d'un pod utilisant l'image de conteneur fournie par le flux d'images.

Les références de nom et d'image du flux d'images ou de la balise de flux d'images sont mises en correspondance avec les champs de nom et d'image dans le modèle de pod du plugin Kubernetes. Vous pouvez contrôler le champ label du modèle de pod de plugin Kubernetes en définissant une annotation sur l'objet flux d'images ou balise de flux d'images avec la clé agent-label. Sinon, le nom est utilisé comme étiquette.

Note

Ne vous connectez pas à la console Jenkins pour modifier la configuration du modèle de pod. Si vous le faites après la création du modèle de pod, et que le plugin OpenShift Container Platform Sync détecte que l'image associée au flux d'images ou à la balise de flux d'images a changé, il remplace le modèle de pod et écrase ces changements de configuration. Vous ne pouvez pas fusionner une nouvelle configuration avec la configuration existante.

Envisagez l'approche de la carte de configuration si vous avez des besoins de configuration plus complexes.

Lorsqu'elle trouve une carte de configuration avec l'étiquette appropriée, l'image Jenkins suppose que toutes les valeurs de la charge utile de données clé-valeur de la carte de configuration contiennent un langage de balisage extensible (XML) cohérent avec le format de configuration pour Jenkins et les modèles de pods du plugin Kubernetes. L'un des principaux avantages des cartes de configuration par rapport aux flux d'images et aux balises de flux d'images est que vous pouvez contrôler tous les paramètres du modèle de pod plugin Kubernetes.

Exemple de carte de configuration pour jenkins-agent

kind: ConfigMap
apiVersion: v1
metadata:
  name: jenkins-agent
  labels:
    role: jenkins-agent
data:
  template1: |-
    <org.csanchez.jenkins.plugins.kubernetes.PodTemplate>
      <inheritFrom></inheritFrom>
      <name>template1</name>
      <instanceCap>2147483647</instanceCap>
      <idleMinutes>0</idleMinutes>
      <label>template1</label>
      <serviceAccount>jenkins</serviceAccount>
      <nodeSelector></nodeSelector>
      <volumes/>
      <containers>
        <org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate>
          <name>jnlp</name>
          <image>openshift/jenkins-agent-maven-35-centos7:v3.10</image>
          <privileged>false</privileged>
          <alwaysPullImage>true</alwaysPullImage>
          <workingDir>/tmp</workingDir>
          <command></command>
          <args>${computer.jnlpmac} ${computer.name}</args>
          <ttyEnabled>false</ttyEnabled>
          <resourceRequestCpu></resourceRequestCpu>
          <resourceRequestMemory></resourceRequestMemory>
          <resourceLimitCpu></resourceLimitCpu>
          <resourceLimitMemory></resourceLimitMemory>
          <envVars/>
        </org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate>
      </containers>
      <envVars/>
      <annotations/>
      <imagePullSecrets/>
      <nodeProperties/>
    </org.csanchez.jenkins.plugins.kubernetes.PodTemplate>
Copy to Clipboard Toggle word wrap

L'exemple suivant montre deux conteneurs qui référencent des flux d'images dans l'espace de noms openshift. L'un des conteneurs gère le contrat JNLP pour lancer des pods en tant qu'agents Jenkins. L'autre conteneur utilise une image contenant des outils de construction de code dans un langage de codage particulier :

kind: ConfigMap
apiVersion: v1
metadata:
  name: jenkins-agent
  labels:
    role: jenkins-agent
data:
  template2: |-
        <org.csanchez.jenkins.plugins.kubernetes.PodTemplate>
          <inheritFrom></inheritFrom>
          <name>template2</name>
          <instanceCap>2147483647</instanceCap>
          <idleMinutes>0</idleMinutes>
          <label>template2</label>
          <serviceAccount>jenkins</serviceAccount>
          <nodeSelector></nodeSelector>
          <volumes/>
          <containers>
            <org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate>
              <name>jnlp</name>
              <image>image-registry.openshift-image-registry.svc:5000/openshift/jenkins-agent-base-rhel8:latest</image>
              <privileged>false</privileged>
              <alwaysPullImage>true</alwaysPullImage>
              <workingDir>/home/jenkins/agent</workingDir>
              <command></command>
              <args>\$(JENKINS_SECRET) \$(JENKINS_NAME)</args>
              <ttyEnabled>false</ttyEnabled>
              <resourceRequestCpu></resourceRequestCpu>
              <resourceRequestMemory></resourceRequestMemory>
              <resourceLimitCpu></resourceLimitCpu>
              <resourceLimitMemory></resourceLimitMemory>
              <envVars/>
            </org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate>
            <org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate>
              <name>java</name>
              <image>image-registry.openshift-image-registry.svc:5000/openshift/java:latest</image>
              <privileged>false</privileged>
              <alwaysPullImage>true</alwaysPullImage>
              <workingDir>/home/jenkins/agent</workingDir>
              <command>cat</command>
              <args></args>
              <ttyEnabled>true</ttyEnabled>
              <resourceRequestCpu></resourceRequestCpu>
              <resourceRequestMemory></resourceRequestMemory>
              <resourceLimitCpu></resourceLimitCpu>
              <resourceLimitMemory></resourceLimitMemory>
              <envVars/>
            </org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate>
          </containers>
          <envVars/>
          <annotations/>
          <imagePullSecrets/>
          <nodeProperties/>
        </org.csanchez.jenkins.plugins.kubernetes.PodTemplate>
Copy to Clipboard Toggle word wrap
Note

Ne vous connectez pas à la console Jenkins pour modifier la configuration du modèle de pod. Si vous le faites après la création du modèle de pod, et que le plugin OpenShift Container Platform Sync détecte que l'image associée au flux d'images ou à la balise de flux d'images a changé, il remplace le modèle de pod et écrase ces changements de configuration. Vous ne pouvez pas fusionner une nouvelle configuration avec la configuration existante.

Envisagez l'approche de la carte de configuration si vous avez des besoins de configuration plus complexes.

Une fois installé, le plugin OpenShift Container Platform Sync surveille le serveur API d'OpenShift Container Platform pour les mises à jour des flux d'images, des balises de flux d'images et des cartes de configuration et ajuste la configuration du plugin Kubernetes.

Les règles suivantes s'appliquent :

  • La suppression de l'étiquette ou de l'annotation de la carte de configuration, du flux d'images ou de la balise de flux d'images supprime toute PodTemplate existante de la configuration du plugin Kubernetes.
  • Si ces objets sont supprimés, la configuration correspondante est supprimée du plugin Kubernetes.
  • Si vous créez des objets ConfigMap, ImageStream, ou ImageStreamTag correctement étiquetés ou annotés, ou si vous ajoutez des étiquettes après leur création initiale, cela entraîne la création d'un PodTemplate dans la configuration de Kubernetes-plugin.
  • Dans le cas du formulaire PodTemplate by config map, les modifications apportées aux données de la config map pour PodTemplate sont appliquées aux paramètres de PodTemplate dans la configuration du plugin Kubernetes. Les modifications remplacent également toutes les modifications apportées à PodTemplate via l'interface utilisateur Jenkins entre les modifications apportées à la carte de configuration.

Pour utiliser une image de conteneur comme agent Jenkins, l'image doit exécuter l'agent comme point d'entrée. Pour plus de détails, voir la documentation officielle de Jenkins.

5.1.7. Permissions Jenkins

Si, dans la carte de configuration, l'élément <serviceAccount> du modèle XML de pod est le compte de service OpenShift Container Platform utilisé pour le pod résultant, les informations d'identification du compte de service sont montées dans le pod. Les permissions sont associées au compte de service et contrôlent quelles opérations contre le maître OpenShift Container Platform sont autorisées à partir du pod.

Considérons le scénario suivant avec des comptes de service utilisés pour le pod, qui est lancé par le plugin Kubernetes qui s'exécute dans l'image Jenkins d'OpenShift Container Platform.

Si vous utilisez le modèle d'exemple pour Jenkins fourni par OpenShift Container Platform, le compte de service jenkins est défini avec le rôle edit pour le projet dans lequel Jenkins s'exécute, et le pod Jenkins maître a ce compte de service monté.

Les deux modèles de pods Maven et NodeJS par défaut qui sont injectés dans la configuration Jenkins sont également configurés pour utiliser le même compte de service que le maître Jenkins.

  • Tous les modèles de pods qui sont automatiquement découverts par le plugin de synchronisation d'OpenShift Container Platform parce que leurs flux d'images ou leurs balises de flux d'images ont l'étiquette ou les annotations requises sont configurés pour utiliser le compte de service principal Jenkins comme compte de service.
  • Pour les autres façons de fournir une définition de modèle de pod dans Jenkins et le plugin Kubernetes, vous devez spécifier explicitement le compte de service à utiliser. Ces autres moyens incluent la console Jenkins, le pipeline DSL podTemplate fourni par le plugin Kubernetes, ou l'étiquetage d'une carte de configuration dont les données sont la configuration XML d'un modèle de pod.
  • Si vous ne spécifiez pas de valeur pour le compte de service, le compte de service default est utilisé.
  • Assurez-vous que le compte de service utilisé a les permissions, les rôles, etc. nécessaires définis dans OpenShift Container Platform pour manipuler les projets que vous choisissez de manipuler à l'intérieur du pod.

5.1.8. Création d'un service Jenkins à partir d'un modèle

Les modèles fournissent des champs de paramètres pour définir toutes les variables d'environnement avec des valeurs par défaut prédéfinies. OpenShift Container Platform fournit des modèles pour faciliter la création d'un nouveau service Jenkins. Les modèles Jenkins doivent être enregistrés dans le projet par défaut openshift par votre administrateur de cluster lors de la configuration initiale du cluster.

Les deux modèles disponibles définissent tous deux une configuration de déploiement et un service. Les modèles diffèrent par leur stratégie de stockage, qui détermine si le contenu de Jenkins persiste après le redémarrage d'un pod.

Note

Un pod peut être redémarré lorsqu'il est déplacé vers un autre nœud ou lorsqu'une mise à jour de la configuration de déploiement déclenche un redéploiement.

  • jenkins-ephemeral utilise un stockage éphémère. Au redémarrage du pod, toutes les données sont perdues. Ce modèle n'est utile que pour le développement ou les tests.
  • jenkins-persistent utilise un volume persistant (PV). Les données survivent à un redémarrage du pod.

Pour utiliser un magasin PV, l'administrateur du cluster doit définir un pool PV dans le déploiement d'OpenShift Container Platform.

Après avoir sélectionné le modèle que vous souhaitez, vous devez l'instancier pour pouvoir utiliser Jenkins.

Procédure

  1. Créez une nouvelle application Jenkins en utilisant l'une des méthodes suivantes :

    • UN PV :

      $ oc new-app jenkins-persistent
      Copy to Clipboard Toggle word wrap
    • Ou un volume de type emptyDir dont la configuration ne persiste pas lors des redémarrages de pods :

      $ oc new-app jenkins-ephemeral
      Copy to Clipboard Toggle word wrap

Avec les deux modèles, vous pouvez lancer oc describe sur eux pour voir tous les paramètres disponibles pour la surcharge.

Par exemple :

$ oc describe jenkins-ephemeral
Copy to Clipboard Toggle word wrap

5.1.9. Utilisation du plugin Jenkins Kubernetes

Dans l'exemple suivant, l'objet openshift-jee-sample BuildConfig provoque le provisionnement dynamique d'un pod d'agent Maven Jenkins. Le pod clone du code source Java, construit un fichier WAR et provoque l'exécution d'un second BuildConfig, openshift-jee-sample-docker. Le second BuildConfig place le nouveau fichier WAR dans une image de conteneur.

Important

OpenShift Container Platform 4.11 a supprimé les images OpenShift Jenkins Maven et NodeJS Agent de son payload. Red Hat ne produit plus ces images et elles ne sont pas disponibles dans le dépôt ocp-tools-4 à l'adresse registry.redhat.io. Red Hat maintient les versions 4.10 et antérieures de ces images pour toutes les corrections de bogues importantes ou les CVE de sécurité, en suivant la politique de cycle de vie de OpenShift Container Platform.

Pour plus d'informations, voir le lien "Changements importants pour OpenShift Jenkins images" dans la section suivante "Ressources supplémentaires".

Exemple de BuildConfig qui utilise le plugin Jenkins Kubernetes

kind: List
apiVersion: v1
items:
- kind: ImageStream
  apiVersion: image.openshift.io/v1
  metadata:
    name: openshift-jee-sample
- kind: BuildConfig
  apiVersion: build.openshift.io/v1
  metadata:
    name: openshift-jee-sample-docker
  spec:
    strategy:
      type: Docker
    source:
      type: Docker
      dockerfile: |-
        FROM openshift/wildfly-101-centos7:latest
        COPY ROOT.war /wildfly/standalone/deployments/ROOT.war
        CMD $STI_SCRIPTS_PATH/run
      binary:
        asFile: ROOT.war
    output:
      to:
        kind: ImageStreamTag
        name: openshift-jee-sample:latest
- kind: BuildConfig
  apiVersion: build.openshift.io/v1
  metadata:
    name: openshift-jee-sample
  spec:
    strategy:
      type: JenkinsPipeline
      jenkinsPipelineStrategy:
        jenkinsfile: |-
          node("maven") {
            sh "git clone https://github.com/openshift/openshift-jee-sample.git ."
            sh "mvn -B -Popenshift package"
            sh "oc start-build -F openshift-jee-sample-docker --from-file=target/ROOT.war"
          }
    triggers:
    - type: ConfigChange
Copy to Clipboard Toggle word wrap

Il est également possible d'outrepasser la spécification du pod de l'agent Jenkins créé dynamiquement. L'exemple suivant est une modification de l'exemple précédent, qui surcharge la mémoire du conteneur et spécifie une variable d'environnement.

Exemple de BuildConfig qui utilise le plugin Jenkins Kubernetes, en spécifiant la limite de mémoire et la variable d'environnement

kind: BuildConfig
apiVersion: build.openshift.io/v1
metadata:
  name: openshift-jee-sample
spec:
  strategy:
    type: JenkinsPipeline
    jenkinsPipelineStrategy:
      jenkinsfile: |-
        podTemplate(label: "mypod", 
1

                    cloud: "openshift", 
2

                    inheritFrom: "maven", 
3

                    containers: [
            containerTemplate(name: "jnlp", 
4

                              image: "openshift/jenkins-agent-maven-35-centos7:v3.10", 
5

                              resourceRequestMemory: "512Mi", 
6

                              resourceLimitMemory: "512Mi", 
7

                              envVars: [
              envVar(key: "CONTAINER_HEAP_PERCENT", value: "0.25") 
8

            ])
          ]) {
          node("mypod") { 
9

            sh "git clone https://github.com/openshift/openshift-jee-sample.git ."
            sh "mvn -B -Popenshift package"
            sh "oc start-build -F openshift-jee-sample-docker --from-file=target/ROOT.war"
          }
        }
  triggers:
  - type: ConfigChange
Copy to Clipboard Toggle word wrap

1
Un nouveau modèle de pod appelé mypod est défini dynamiquement. Le nom du nouveau modèle de pod est référencé dans la strophe du nœud.
2
La valeur cloud doit être réglée sur openshift.
3
Le nouveau modèle de pod peut hériter sa configuration d'un modèle de pod existant. Dans ce cas, il hérite du modèle de pod Maven qui est prédéfini par OpenShift Container Platform.
4
Cet exemple remplace les valeurs du conteneur préexistant et doit être spécifié par son nom. Toutes les images de l'agent Jenkins livrées avec OpenShift Container Platform utilisent le nom de conteneur jnlp.
5
Spécifiez à nouveau le nom de l'image du conteneur. Il s'agit d'un problème connu.
6
Une demande de mémoire de 512 Mi est spécifiée.
7
Une limite de mémoire de 512 Mi est spécifiée.
8
Une variable d'environnement CONTAINER_HEAP_PERCENT, avec la valeur 0.25, est spécifiée.
9
La strophe de nœud fait référence au nom du modèle de pod défini.

Par défaut, le pod est supprimé lorsque la construction est terminée. Ce comportement peut être modifié avec le plugin ou dans un fichier Jenkins du pipeline.

Upstream Jenkins a récemment introduit un format déclaratif YAML pour définir un DSL de pipeline podTemplate en ligne avec vos pipelines. Un exemple de ce format, utilisant le modèle de pod java-builder défini dans l'image Jenkins de OpenShift Container Platform :

def nodeLabel = 'java-buidler'

pipeline {
  agent {
    kubernetes {
      cloud 'openshift'
      label nodeLabel
      yaml """
apiVersion: v1
kind: Pod
metadata:
  labels:
    worker: ${nodeLabel}
spec:
  containers:
  - name: jnlp
    image: image-registry.openshift-image-registry.svc:5000/openshift/jenkins-agent-base-rhel8:latest
    args: ['\$(JENKINS_SECRET)', '\$(JENKINS_NAME)']
  - name: java
    image: image-registry.openshift-image-registry.svc:5000/openshift/java:latest
    command:
    - cat
    tty: true
"""
    }
  }

  options {
    timeout(time: 20, unit: 'MINUTES')
  }

  stages {
    stage('Build App') {
      steps {
        container("java") {
          sh "mvn --version"
        }
     }
    }
  }
}
Copy to Clipboard Toggle word wrap

5.1.10. Besoins en mémoire de Jenkins

Lorsqu'il est déployé par les modèles Jenkins Ephemeral ou Jenkins Persistent fournis, la limite de mémoire par défaut est de 1 Gi.

Par défaut, tous les autres processus qui s'exécutent dans le conteneur Jenkins ne peuvent pas utiliser plus de 512 MiB de mémoire. S'ils ont besoin de plus de mémoire, le conteneur s'arrête. Il est donc fortement recommandé que les pipelines exécutent des commandes externes dans un conteneur d'agent dans la mesure du possible.

Et si les quotas de Project le permettent, voir les recommandations de la documentation Jenkins sur ce qu'un maître Jenkins devrait avoir du point de vue de la mémoire. Ces recommandations préconisent d'allouer encore plus de mémoire au maître Jenkins.

Il est recommandé de spécifier les valeurs de demande et de limite de mémoire sur les conteneurs d'agents créés par le plugin Jenkins Kubernetes. Les administrateurs peuvent définir des valeurs par défaut pour chaque image d'agent via la configuration de Jenkins. Les paramètres de demande et de limite de mémoire peuvent également être modifiés pour chaque conteneur.

Vous pouvez augmenter la quantité de mémoire disponible pour Jenkins en remplaçant le paramètre MEMORY_LIMIT lors de l'instanciation du modèle Jenkins Ephemeral ou Jenkins Persistent.

Retour au début
Red Hat logoGithubredditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance. Découvrez nos récentes mises à jour.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez le Blog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

Theme

© 2025 Red Hat