web-dev-qa-db-fra.com

La phase conditionnelle du pipeline Jenkins réussit mais Jenkins indique que la construction a échoué

Version Jenkins = 2.19 Version du plugin Jenkins Multibranch Pipeline = 2.92

J'ai un Jenkinsfile avec quelques étapes conditionnelles basées sur la branche.

Voici une version modifiée par souci de brièveté de mon Jenkinsfile:

node {
    stage('Checkout') {
        checkout scm
    }

    stage('Clean Verify') {
        sh 'mvn clean verify'
    }

    if (env.BRANCH_NAME == "develop") {
        stage('Docker') {
            sh 'mvn docker:build -DpushImage'
        }
    }
}

J'utilise le plugin de pipeline multibranches.

Il détecte et construit avec succès toutes mes branches.

Le problème que j'ai est que toutes les constructions rapportent comme ayant échoué même si, si je survole chaque étape, cela signale le succès.

J'ai joint une image illustrant une branche de fonctionnalité dans laquelle les deux étapes que je voulais exécuter ont été exécutées et se sont terminées avec succès, mais vous pouvez voir que la construction a en fait été signalée comme ayant échoué.

 Jenkins failed build

J'obtiens également le même résultat pour la branche de développement: elle exécute l'étape Docker avec succès, mais les rapports de génération ont échoué.

Je m'attends à ce que chaque branche fasse état de son succès lorsque toutes les étapes exécutées pour cette branche ont été réussies.

EDIT 1

Voici la fin du journal de construction (j'espère que c'est suffisant car je ne voulais pas extraire toutes les informations privées, mais laissez-moi savoir si nécessaire)

[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 30.459 s
[INFO] Finished at: 2017-02-21T15:13:02+11:00
[INFO] Final Memory: 84M/769M
[INFO] ------------------------------------------------------------------------
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] sh
Required context class hudson.FilePath is missing
Perhaps you forgot to surround the code with a step that provides this, such as: node
[Pipeline] End of Pipeline
org.jenkinsci.plugins.workflow.steps.MissingContextVariableException: Required context class hudson.FilePath is missing
    at org.jenkinsci.plugins.workflow.steps.StepDescriptor.checkContextAvailability(StepDescriptor.Java:253)
at org.jenkinsci.plugins.workflow.cps.DSL.invokeStep(DSL.Java:179)
at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.Java:126)
at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.Java:108)
at groovy.lang.GroovyObject$invokeMethod.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.Java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.Java:113)
at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.Java:151)
at org.kohsuke.groovy.sandbox.GroovyInterceptor.onMethodCall(GroovyInterceptor.Java:21)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.Java:115)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.Java:103)
at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.Java:149)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.Java:146)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.Java:16)
at WorkflowScript.run(WorkflowScript:93)
at ___cps.transform___(Native Method)
at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.Java:57)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.Java:109)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.Java:82)
at Sun.reflect.GeneratedMethodAccessor501.invoke(Unknown Source)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:498)
at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.Java:72)
at com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.Java:21)
at com.cloudbees.groovy.cps.Next.step(Next.Java:58)
at com.cloudbees.groovy.cps.Continuable.run0(Continuable.Java:154)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.Java:18)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.Java:33)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.Java:30)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.Java:108)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.Java:30)
at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.Java:163)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.Java:328)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.Java:80)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.Java:240)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.Java:228)
at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.Java:63)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:266)
at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.Java:112)
at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.Java:28)
at Java.util.concurrent.Executors$RunnableAdapter.call(Executors.Java:511)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:266)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1142)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:617)
at Java.lang.Thread.run(Thread.Java:745)
Finished: FAILURE
8
wimnat

Ainsi, après avoir examiné de plus près le fichier journal, cela m'a aidé à cerner le problème.

Il est intéressant de noter que cliquer sur l’étape de construction pour afficher les journaux est ce qui m’a jeté - c’est ce que je faisais. Quand je suis effectivement allé à la sortie du journal de la console complète, j'ai vu l'erreur à propos de:

Required context class hudson.FilePath is missing
Perhaps you forgot to surround the code with a step that provides this, such as: node

Sous la section de nœud {} que j'avais, j'avais une instruction pour deploys:

def branch = readFile('branch').trim()
if (branch == master) {
    ...
}

Le problème était que l'instruction readFile était définie en dehors d'un nœud.

La réponse était de placer l’instruction readFile dans une section {} du nœud.

17
wimnat

La commande sh n'est pas fermée avec une citation à la fin.

2
Christopher

Je sais que c'est vieux, mais j'ai rencontré un problème similaire avec un pipeline déclaratif et ai atterri ici. Il s’est avéré que j’essayais d’utiliser sh pour définir une variable environment dans le bloc pipeline, mais ma agent principale était none, c’est-à-dire:

pipeline {
    agent none
    environment {
        VERSION = sh(returnStdout: true, script: 'git describe --tags')
    }
}

Cela a entraîné la même erreur Required context class hudson.FilePath is missing. Le déplacer dans une stage avec une agent a fonctionné comme prévu.

2
Saites

Dans mon cas, cela a soudainement cessé de fonctionner, avec l'erreur suivante:

Required context class hudson.FilePath is missing
Perhaps you forgot to surround the code with a step that provides this, such as: node

La raison était que le nœud était simplement en panne. Il a fallu le redémarrer et relancer son agent (c'était esclave).

0
Reinherd

ma solution pour l'erreur Required context class hudson.FilePath is missing Perhaps you forgot to surround the code with a step that provides this, such as: node

est:

#!/usr/bin/env groovy
import hudson.model.*

node('master') {
    sh("your Shell script")   
}
0
dsaydon