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 ?
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.
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.
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.
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"));