it-swarm.com.de

Erstellen Sie im Job jenkins eine Datei, die im aktuellen Arbeitsbereich groovy ist

meine aufgabe ist es, knotendetails zu sammeln und im certail-format aufzulisten. Ich muss Daten in eine Datei schreiben und sie als CSV-Datei speichern und als Artefakte anfügen .. __ Ich kann jedoch keine Datei mit groovigen Skripts in den Jenkins erstellen, indem das Plugin "Execute System Groovy" als Erstellungsschritt verwendet wird

import jenkins.model.Jenkins
import hudson.model.User
import hudson.security.Permission
import hudson.EnvVars

EnvVars envVars = build.getEnvironment(listener);

filename = envVars.get('WORKSPACE') + "\\node_details.txt";
//filename = "${manager.build.workspace.remote}" + "\\node_details.txt"
targetFile = new File(filename);
println "attempting to create file: $targetFile"

if (targetFile.createNewFile()) {
    println "Successfully created file $targetFile"
} else {
    println "Failed to create file $targetFile"
}
print "Deleting ${targetFile.getAbsolutePath()} : "
println targetFile.delete()

Ausgabe erhalten

attempting to create file: /home/jenkins/server-name/workspace/GET_NODE_DETAILS\node_details.txt
FATAL: No such file or directory
Java.io.IOException: No such file or directory
    at Java.io.UnixFileSystem.createFileExclusively(Native Method)
    at Java.io.File.createNewFile(File.Java:947)
    at Java_io_File$createNewFile.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.Java:42)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.Java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.Java:112)
    at Script1.run(Script1.groovy:13)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.Java:682)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.Java:666)
    at hudson.plugins.groovy.SystemGroovy.perform(SystemGroovy.Java:81)
    at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.Java:20)
    at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.Java:772)
    at hudson.model.Build$BuildExecution.build(Build.Java:199)
    at hudson.model.Build$BuildExecution.doRun(Build.Java:160)
    at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.Java:535)
    at hudson.model.Run.execute(Run.Java:1732)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.Java:43)
    at hudson.model.ResourceController.execute(ResourceController.Java:88)
    at hudson.model.Executor.run(Executor.Java:234)

Irgendwann sehe ich, wie die Leute "Manager" -Objekte verwenden, wie kann ich darauf zugreifen? Haben Sie irgendwelche Ideen, wie Sie die Aufgabe erledigen können?

18
bicepjai

Problem Das Groovy-Systemskript wird immer im Jenkins-Master-Knoten ausgeführt, während der Arbeitsbereich der Dateipfad in Ihrem Jenkins-Slave-Knoten ist, der in Ihrem Master-Knoten nicht vorhanden ist.

Sie können durch den Code überprüfen

theDir = new File(envVars.get('WORKSPACE'))
println theDir.exists()

Es wird false zurückgegeben.

Wenn Sie keinen Slave-Knoten verwenden, wird true zurückgegeben.

Solution Da wir normale File nicht verwenden können, müssen wir FilePathhttp://javadoc.jenkins-ci.org/hudson/FilePath.html verwenden.

if(build.workspace.isRemote())
{
    channel = build.workspace.channel;
    fp = new FilePath(channel, build.workspace.toString() + "/node_details.txt")
} else {
    fp = new FilePath(new File(build.workspace.toString() + "/node_details.txt"))
}

if(fp != null)
{
    fp.write("test data", null); //writing to file
} 

Dann funktioniert es in beiden Fällen.

41
Larry Cai

Antwort von @Larry Cai behandelt einen Teil, um eine Datei aus dem System Groovy Script in den Slave-Knoten zu schreiben (wie auf dem Master-Knoten ausgeführt).

Der Teil, den ich beantworte, ist "Irgendwann sehe ich Leute verwenden" Manager "-Objekt, wie kann ich darauf zugreifen" Dieses Objekt ist bereits in Post Build Groovy Script für den Zugriff auf viele Dinge wie Umgebungsvariablen verfügbar. Build-Status, Build-Anzeigename usw. 

Zitiert aus https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Postbuild+Plugin

"Das groovige Skript kann den Variablenmanager verwenden, der verschiedene Methoden zum Dekorieren Ihrer Builds bietet. Diese Methoden können in Whitelist-Methoden und nicht-Whitelist-Methoden klassifiziert werden."

Um darauf zuzugreifen, können wir es direkt im Post-Build-Groovy-Skript aufrufen. z.B

manager.build.setDescription ("benutzerdefinierte Beschreibung") manager.addShortText ("Nachricht hier hinzufügen")

Alle für Managerobjekte verfügbaren Methoden sind hier dokumentiert.

https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Postbuild+Plugin#GroovyPostbuildPlugin-Whitelistedmethods

0
Satish Gupta

Das Managerobjekt ist nicht verfügbar, je nachdem, wie das Groovy aufgerufen wird. z.B. in "Groovy Script ausführen". 

Sie finden die BadgeManager-Klasse in der GroovyPostBuild-Plugin-API von jenkins hier: https://javadoc.jenkins.io/plugin/groovy-postbuild/org/jvnet/hudson/plugins/groovypostbuild/GroovyPostbuildRecorder.BadgeManager.html#addShortTach .lang.String-

ANTWORT: Importieren Sie das GroovyPostBuild-Plugin und erstellen Sie ein neues Managerobjekt. z.B. Hier erstellen Sie einen Job mit "Execute System Groovy Script", erstellen Sie ein Managerobjekt und rufen Sie die addShortText-Methode auf:

// Java.lang.Object
// org.jvnet.hudson.plugins.groovypostbuild.GroovyPostbuildRecorder.BadgeManager
// Constructor and Description
// BadgeManager(hudson.model.Run<?,?> build, hudson.model.TaskListener listener, hudson.model.Result scriptFailureResult) 

import hudson.model.*
import org.jvnet.hudson.plugins.groovypostbuild.GroovyPostbuildAction

def build = Thread.currentThread().executable

manager = new org.jvnet.hudson.plugins.groovypostbuild.GroovyPostbuildRecorder.BadgeManager(build, null, null)
manager.addShortText("MANAGER TEST", "black", "limegreen", "0px", "white")

Diese Frage gibt einen Hinweis: Siehe hier für eine beinahe funktionierende Antwort: Erstellen Sie im jenkins-Job eine Datei mit dem System Groovy im aktuellen Arbeitsbereichorg.jvnet.hudson.plugins.groovypostbuild.GroovyPostbuildAction und build.getActions().add(GroovyPostbuildAction.createShortText(text, "black", "limegreen", "0px", "white"));

0
gaoithe

Ich vermute, der Fehler wurde durch das Pfadformat verursacht. Versuchen Sie es unten:

veränderung 

filename = envVars.get('WORKSPACE') + "\\node_details.txt";

zu

filename = envVars.get('WORKSPACE') + "/node_details.txt";

Denn wenn ich es in meinem lokalen Jenkins-Server versucht habe, bekomme ich es erfolgreich ausgeführt. 

enter image description here

enter image description here

0
mainframer