web-dev-qa-db-fra.com

Comment déclencher une construction jenkins sur un noeud spécifique en utilisant un plugin de pipeline?

J'ai un travail de pipeline Jenkins appelé "TestPipeline". Je souhaite déclencher une compilation sur 2 esclaves différents portant les noms "testeur1 'et" testeur2 ". Le script de pipeline est très simple ici:

node('tester1') {
    build 'test_job'
}
node('tester2') {
    build 'test_job'
}

Toutefois, lorsque j'exécute le travail TestPipeline, "test_job" ne s'exécute pas sur les noeuds que j'ai affectés. Mais utilisez plutôt un noeud aléatoire. 

Je me demande si je devrais définir "Restreindre où ce projet peut être exécuté" sur mon "test_job". Donc je l'ai mis à "testeur" (l'étiquette "testeur" contient les deux nœuds "testeur1" et "testeur2"). Mais lorsque je réexécute le travail de pipeline, "test_job" s'exécute deux fois sur "testeur2". Je devrais m'attendre à ce que le travail s'exécute d'abord sur "testeur1", puis sur "testeur2". Pourquoi donc? Est-ce parce que l'étape "noeud" n'a pas d'importance lorsqu'il s'agit de savoir sur quel noeud l'étape de construction doit être construite?

22
Andy Wang

S'il vous plaît voir le bug ici . La solution est la suivante.

  1. Installer le plugin de paramètre Node and Label
  2. Dans la configuration de test_job, sélectionnez 'Cette construction est paramétrée', ajoutez un paramètre Label et définissez le nom du paramètre sur 'noeud'.
  3. Dans le script de pipeline, utilisez le code:
build job: 'test_job', parameters: [[$class: 'LabelParameterValue', name: 'node', label: 'tester1']]
build job: 'test_job', parameters: [[$class: 'LabelParameterValue', name: 'node', label: 'tester2']]

Et le travail sera construit comme je le voulais.

Cependant, je pense que ce n'est qu'une solution de contournement. Je crois toujours que c'est un bug. Parce que l’étape du nœud devrait faire son travail au lieu de laisser les autres plugins le faire.

21
Andy Wang

J'ai fait de même, mais en utilisant le paramètre Node, je peux donc utiliser la liste de nœuds en cours d'exécution directement ou le pipeline en cours (dans le pipeline, j'utilise le paramètre Choice pour obtenir la liste des nœuds disponibles). Donc dans mon cas:

  1. Installer le plugin de paramètre Node and Label
  2. Dans la configuration de test_job, sélectionnez 'Cette construction est paramétrée', ajoutez un paramètre Node et définissez le nom du paramètre sur node_name.
  3. Dans le pipeline, ajoutez le paramètre Choice, appelez-le node et indiquez-y les choix possibles. Ainsi, le pipeline en cours d'exécution vous permet de choisir le nœud sur lequel il doit être exécuté.

Code à insérer dans le script de pipeline:

build job: 'my_job', 
  parameters: [[$class: 'NodeParameterValue', name: 'node_name', labels: ["$node"], nodeEligibility: [$class: 'AllNodeEligibility']]]
6
Grysik

Voici comment je l'ai fait fonctionner

  1. créer un 'job' '' test_job '' avec le type de paramètre 'label', nom 'node', la valeur peut être n'importe quelle chaîne. (C’est le travail à déclencher) . Définissez la valeur de libellé «Limiter le lieu où ce projet peut être exécuté». 

  2. créer un "pipeline" avec le type de paramètre "Node". Dans la section de pipeline, utilisez le script suivant

Notez que l'étiquette de test_job est $ {env.NODE_NAME}. Elle sera définie par le pipeline en fonction du choix de l'utilisateur. 

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
              echo 'Building..'
              script {
                build job: 'test_job', parameters: [
                [$class: 'LabelParameterValue', name: 'node', label: "${env.NODE_NAME}" ]
                ]
}}}}}
 

0
cannie

Je viens de tester cela sur mon installation et il a correctement exécuté chaque script sur chaque nœud. Vous voudrez peut-être vérifier que vous avez correctement configuré vos esclaves. Je crois que la documentation indique qu'ils doivent disposer du paramètre Lancer les agents esclaves via Java Web Start, vous pouvez vérifier.

0
Alex Haynes