Erreur de script du pipeline Jenkins: fin du pipeline java.lang.NoSuchMethodError: aucune méthode DSL de ce type 'httpRequest' n'a été trouvée

Sep 14 2020

Je souhaite obtenir le dernier statut d'un travail jenkins séparé Backup_Precheckdans mon script Pipeline actuel.

Voici mon script de pipeline.

import groovy.json.JsonSlurper

pipeline 
{

   agent any

   
   stages {

       stage('check Job Backup_Precheck status'){

               steps {
   
                    script{

                         if(checkStatus() == "RUNNING" ){

                            timeout(time: 60, unit: 'MINUTES') {

                           waitUntil {
                        
                 def status = checkStatus()
                        
                 return  (status == "SUCCESS" || status == "FAILURE" || status == "UNSTABLE" || status == "ABORTED")

                                          }

                                    }

                                }

                          if( checkStatus() != "SUCCESS" ){

                            error('Stopping Job Weekend_Backup becuase job Backup_Precheck is not successful.')

                                                }

                      else
                        {

                        echo 'Triggering ansible backup automation'

                                                }
                  
        } // script end
                 
       } //steps ends here

                     } // stage ends here

      stage('Hello') {
    
         steps {

                echo 'Hello World'
    
            }

              }

       } //step closes

             }    

def checkStatus() {
    
        def statusUrl = httpRequest "https://portal.myshop.com:9043/job/Backup_Precheck/lastBuild/api/json"

                def statusJson = new JsonSlurper().parseText(statusUrl.getContent())


                return statusJson['result']
           

}

J'obtiens l'erreur ci-dessous dans les journaux de la console jenkins:

[Pipeline] {(Hello) Stage "Hello" ignoré en raison d'échecs précédents [Pipeline]} [Pipeline] // stage [Pipeline]} [Pipeline] // node [Pipeline] End of Pipeline java.lang.NoSuchMethodError : Aucune méthode DSL 'httpRequest' trouvée parmi les étapes [ansiColor, ansiblePlaybook, ansibleTower, ansibleTowerProjectRevision, ansibleTowerProjectSync, ansibleVault, archive, bat, build, catchError, checkout, deleteDir, dir, dockerFingerprintFrom, dockerFingerprintRun, email envVarsForTool, erreur, fileExists, findBuildScans, getContext, git, input, isUnix, junit, bibliothèque, libraryResource, charge, verrou, mail, jalon, nœud, parallèle, powershell, propriétés, publishHTML, pwd, pwsh, readFile, readTrusted, resolScm retry, script, sh, sleep, stage, stash, step, svn, task, timeout, tm, tool, unarchive, unstable, unstash, validateDeclarativePipeline, waitUntil, warnError, withContext, withCredentials, withDockerConta

Je comprends que je pourrais avoir besoin de moi pour installer le plugin de requête HTTP afin de résoudre ce qui précède.

Cependant, ne puis-je pas obtenir le dernier statut d'un emploi sans avoir à dépendre du HTTP Request Plugin? Si oui, veuillez me guider.

Réponses

2 smelm Sep 14 2020 at 16:12

Il existe un moyen plus simple de procéder. Puisque Jenkins est implémenté en Java et que le pipeline s'exécute dans Groovy (la même VM), vous pouvez accéder à chaque classe et fonction à partir du code Jenkins. Afin d'obtenir le résultat de la construction actuelle d'un travail, vous pouvez faire quelque chose comme ceci:

def job = jenkins.model.Jenkins.instance.getItemByFullName("<folder>/<job name>")
def result = job.getLastBuild().result

Cette approche est très puissante et vous donne beaucoup de contrôle sur Jenkins au moment de l'exécution de vos pipelines.

Pour en savoir plus, vous pouvez:

  • Regardez la documentation
  • Ouvrez la console de script, commencez par jenkins.model.Jenkins.instance et [imprimer toutes les méthodes disponibles] [2]

[2]: https://bateru.com/news/2011/11/code-of-the-day-groovy-print-all-methods-of-an-object/. Vous pouvez partir de là.