Jenkins-Version = 2.19 Jenkins-Multibranch-Pipeline-Plug-In-Version = 2.92
Ich habe eine Jenkins-Datei mit einigen bedingten Stufen, die auf der Branche basieren.
Hier ist eine aus Gründen der Kürze modifizierte Version meiner 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'
}
}
}
Ich benutze das Plug-In für die Mehrsparten-Pipeline.
Es erkennt und baut alle meine Niederlassungen erfolgreich auf.
Das Problem, das ich habe, ist, dass alle Builds als fehlgeschlagen gemeldet werden, auch wenn ich bei jedem Schritt den Status "Erfolg" meldet.
Ich habe ein Bild angehängt, das einen Zweig der Funktion zeigt, in dem die beiden von mir gewünschten Stufen ausgeführt und mit Erfolg abgeschlossen wurden. Sie können jedoch sehen, dass der Build tatsächlich als fehlgeschlagen gemeldet wurde.
Das gleiche Ergebnis erhalte ich auch für den Entwicklungszweig - er führt die Docker-Phase erfolgreich aus, aber die Build-Berichte sind fehlgeschlagen.
Ich gehe davon aus, dass jede Niederlassung Erfolg vermelden wird, da alle Stufen dieser Niederlassung bestanden haben.
BEARBEITEN 1
Hier ist das Ende des Build-Logs (ich hoffe, dass dies ausreicht, da ich nicht alle privaten Informationen auswählen wollte, aber lass es mich wissen, wenn nötig)
[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
Nachdem ich mir die Protokolldatei genauer angesehen hatte, half es mir, das Problem aufzuspüren.
Es ist erwähnenswert, dass ich auf die Build-Phase geklickt habe, um die Protokolle anzuzeigen. Dies war es, was ich getan hatte. Als ich tatsächlich zur vollständigen Konsolenprotokollausgabe ging, sah ich den Fehler über:
Required context class hudson.FilePath is missing
Perhaps you forgot to surround the code with a step that provides this, such as: node
Unter dem Knoten {}, den ich hatte, hatte ich eine Anweisung für die Bereitstellung:
def branch = readFile('branch').trim()
if (branch == master) {
...
}
Das Problem war, dass die readFile-Anweisung außerhalb eines Knotens definiert wurde.
Die Antwort bestand darin, die readFile-Anweisung in einen Abschnitt {} eines Knotens zu setzen.
Der Befehl sh
wird am Ende nicht mit einem Anführungszeichen abgeschlossen.
Ich weiß, das ist alt, aber ich bin mit einer deklarativen Pipeline auf ein ähnliches Problem gestoßen und hier gelandet. Wie sich herausstellte, habe ich versucht, eine sh
zu verwenden, um eine environment
-Variable innerhalb des pipeline
-Blocks festzulegen, aber mein Haupt agent
war none
, d.h.
pipeline {
agent none
environment {
VERSION = sh(returnStdout: true, script: 'git describe --tags')
}
}
Dies führte zu demselben Fehler Required context class hudson.FilePath is missing
. Das Verschieben nach stage
mit agent
funktionierte wie erwartet.
In meinem Fall hörte es plötzlich auf zu arbeiten, mit dem Fehler:
Required context class hudson.FilePath is missing
Perhaps you forgot to surround the code with a step that provides this, such as: node
Der Grund war, dass der Knoten einfach ausgefallen war. Musste es neu starten und seinen Agenten neu starten (es war Slave).
Ich hatte diesen Fehler:
Fehler beim Ausführen immer nach Bedingung: org.jenkinsci.plugins.workflow.steps.MissingContextVariableException: Erforderliche Kontextklasse hudson.FilePath fehlt
Vielleicht haben Sie vergessen, den Code mit einem Schritt zu umgeben, der dies ermöglicht, z. B .: node
Es wurde durch mehrdeutige Interpolation verursacht:
environment {
FILE = "some-$BRANCH.yml"
}
Der richtige Ausdruck wäre in diesem Fall:
"some-${BRANCH}.yml"
meine Lösung für den Fehler Required context class hudson.FilePath is missing
Perhaps you forgot to surround the code with a step that provides this, such as: node
ist:
#!/usr/bin/env groovy
import hudson.model.*
node('master') {
sh("your Shell script")
}