Dans jenkins job, créer un fichier en utilisant system groovy dans l'espace de travail actuel

ma tâche est de collecter les détails des noeuds et de les lister au format certail. J'ai besoin d'écrire des données dans un fichier et l'enregistrer en tant que fichier csv et l'attacher comme des artefacts. Mais je ne suis pas capable de créer un fichier en utilisant des scripts groovy dans jenkins en utilisant le plugin "Execute System Groovy" comme étape de construction

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()

résultat obtenu

attempting to create file: /home/jenkins/server-name/workspace/GET_NODE_DETAILSnode_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.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)

une fois que je vois des gens utiliser l'objet" manager", Comment puis-je y accéder ? Alos aucune idée sur la façon d'accomplir la tâche ?

18
demandé sur bicepjai 2015-06-03 02:46:56

4 réponses

Problème Le script système Groovy est toujours exécuté dans le noeud maître de jenkins, tandis que l'espace de travail est le chemin du fichier dans votre noeud esclave de jenkins, qui n'existe pas dans votre noeud maître.

Vous pouvez vérifier par le code

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

Il sera de retour false

Si vous n'utilisez pas de nœud esclave, il sera de retour true

Solution comme nous ne pouvons pas utiliser normal File, il faut utiliser FilePath http://javadoc.jenkins-ci.org/hudson/FilePath.html

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
} 

alors cela fonctionne dans les deux cas.

40
répondu Larry Cai 2015-09-11 02:32:52

réponse de @Larry Cai couvre une partie pour écrire un fichier au noeud esclave à partir du Script Groovy du système (comme il tourne sur le noeud maître).

la partie à laquelle je réponds est "un jour je vois des gens utiliser l'objet" manager", Comment puis-je y accéder " C'est l'objet déjà disponible dans le Script de Groovy Post Build pour accéder à beaucoup de choses comme les variables d'environnement, le statut de construction, le nom D'affichage de construction, etc.

Cité de https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Postbuild+Plugin:

" le script groovy peut utiliser le gestionnaire de variables, qui fournit diverses méthodes pour décorer vos constructions. Ces méthodes peuvent être classées en deux catégories: les méthodes à liste blanche et les méthodes sans liste blanche."

pour y accéder, Nous pouvons l'appeler directement dans le script de groovy post build. e.g

gestionnaire.construire.setDescription("description personnalisée") gestionnaire.addShortText ("add votre message ici")

toutes les méthodes disponibles sur les objets manager sont documentées ici.

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

0
répondu Satish Gupta 2015-11-17 18:13:03

je soupçonne que l'erreur a été causée par le format de chemin, pouvez-vous essayer ci-dessous:

modifier

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

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

parce que quand j'ai essayé dans mon serveur jenkins local, j'ai réussi à l'exécuter.

enter image description here

enter image description here

0
répondu mainframer 2016-10-18 08:58:36

l'objet manager n'est pas disponible en fonction de la façon dont le groovy est invoqué. par exemple, dans "exécuter le système de script groovy".

vous pouvez trouver la classe BadgeManager dans l'API de plugin de jenkins GroovyPostBuild ici: https://javadoc.jenkins.io/plugin/groovy-postbuild/org/jvnet/hudson/plugins/groovypostbuild/GroovyPostbuildRecorder.BadgeManager.html#addShortText-java.lang.String-

réponse: importez le plugin GroovyPostBuild et créez un nouvel objet manager. par exemple ici une tâche avec "Execute System Groovy Script" crée un objet manager et appelle la méthode addShortText:

// 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")

cette question donne un indice: voir ici pour une réponse presque efficace: dans jenkins job, créer un fichier en utilisant system groovy dans l'espace de travail actuel org.jvnet.hudson.plugins.groovypostbuild.GroovyPostbuildAction et build.getActions().add(GroovyPostbuildAction.createShortText(text, "black", "limegreen", "0px", "white"));

0
répondu gaoithe 2018-08-27 14:38:31