4 votes

Puis-je utiliser une Closure pour définir une étape dans un pipeline déclaratif Jenkins ?

J'essaie de faire quelque chose comme ça :

def makeStage = {
  stage('a') {
    steps {
      echo 'Hello World'
    }
  }
} 
pipeline {
  agent none
  stages {
    makeStage()
  }
}

Mais ça me donne cette exception :

WorkflowScript: 11: Expected a stage @ line 11, column 5.
   makeStage()
   ^

Est-il possible de définir une étape comme une fermeture externe et si oui, comment ?

4voto

Szymon Stepniak Points 17693

Il est impossible de définir des étapes en dehors du pipeline déclaratif. L'objectif principal du pipeline déclaratif est de fournir une syntaxe simplifiée et argumentée afin que vous puissiez vous concentrer sur ce qui doit être fait (en utilisant certains des outils disponibles dans le pipeline déclaratif). étapes ) et non pas comment le faire.

Si vous êtes intéressé par une manière plus flexible de mettre en œuvre le pipeline, vous pouvez choisir Scripted Pipeline qui n'est pas très stricte en ce qui concerne la syntaxe - elle est seulement limitée par Groovy et le module d'exécution CPS.

Le pipeline de travail (scripté) de votre exemple ressemblerait à ceci :

#!groovy

def makeStage = {
  stage('a') {
    echo 'Hello World'
  }
} 

node {
    makeStage()
}

Attention : Il n'y a pas steps méthode à l'intérieur stage dans un pipeline scénarisé. Si vous le laissez là, vous obtiendrez

java.lang.NoSuchMethodError: No such DSL method 'steps' found among 
    steps [archive, bat, build, catchError, checkout, deleteDir, dir, 
    dockerFingerprintFrom, ...

scripts dans le pipeline déclaratif

Pipeline déclaratif définit un script étape qui vous permet de mettre un bloc de pipeline scripté. Cependant, il ne permet toujours pas de définir les étapes de manière dynamique ou/et d'extraire la définition des étapes vers une fonction ou une fermeture. script est exécutée à l'intérieur de l'étape, donc vous ne pouvez pas contrôler à l'intérieur de ce bloc si l'étape est exécutée ou non. Dans certains cas cependant, cette étape peut être très utile si vous voulez faire quelque chose de plus complexe que de simplement appeler une étape prédéfinie d'un pipeline déclaratif.

3voto

John Huynh Points 71

Super tard, mais au cas où quelqu'un rencontrerait ce problème, une solution possible serait d'envelopper votre scène générée autour d'une déclaration script et de l'invoquer. .call sur la scène générée.

Donc pour toi :

def makeStage = {
  return {
    stage('a') {
      echo 'Hello World'
    }
  }
}

pipeline {
  agent none
  stages {
    stage ('hello world') {
      steps {
        script {
          makeStage().call()
        }      
      }
    }
  }
}

Oups. édité, j'avais "steps" à l'intérieur de mon stage('a') dans la déclaration makeStage. "steps" est une directive déclarative de pipeline, donc il jetait une erreur à l'intérieur du bloc script.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X