web-dev-qa-db-fra.com

Dans le travail Jenkins, créer un fichier en utilisant groovy système dans l'espace de travail actuel

ma tâche est de collecter les détails des nœuds et de les lister au format certail. J'ai besoin d'écrire des données dans un fichier et de l'enregistrer en tant que fichier csv et de le joindre sous forme d'artefacts . Mais je ne suis pas en mesure de créer un fichier à l'aide de scripts groovy dans les jenkins à l'aide du plug-in "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()

Sortie obtenue

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)

Quelque temps je vois des gens utiliser un objet "manager", comment puis-je y avoir accès? Avez-vous des idées sur la manière d'accomplir cette tâche?

18
bicepjai

Problème Le script système Groovy est toujours exécuté dans le nœud maître jenkins, tandis que l'espace de travail correspond au chemin d'accès au fichier dans votre nœud esclave jenkins, qui n'existe pas dans votre nœud maître.

Vous pouvez vérifier par le code

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

Il retournera false

Si vous n'utilisez pas de noeud esclave, il retournera true

Solution Comme nous ne pouvons pas utiliser File normal, nous devons utiliser FilePathhttp://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
} 

Ensuite, cela fonctionne dans les deux cas.

41
Larry Cai

Réponse de @Larry Cai couvre une partie pour écrire un fichier sur le nœud esclave à partir de System Groovy Script (car il s'exécute sur le nœud principal).

La partie à laquelle je réponds est "Certaines fois, je vois des gens utiliser un objet" manager ". Comment puis-je y accéder" .__ Etat de la construction, nom d'affichage de la 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 méthodes de liste blanche et en méthodes non de liste blanche."

Pour y accéder, on peut l'appeler directement dans le script groovy post-build. par exemple

manager.build.setDescription ("description personnalisée") manager.addShortText ("ajoutez votre message ici")

Toutes les méthodes disponibles sur les objets de gestionnaire sont documentées ici.

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

0
Satish Gupta

L'objet de gestionnaire n'est pas disponible selon la façon dont le groovy est appelé. par exemple. dans "exécuter le script groovy du système". 

Vous pouvez trouver la classe BadgeManager dans l'API du plugin jenkins GroovyPostBuild à l'adresse suivante: https://javadoc.jenkins.io/plugin/groovy-postbuild/org/jvnet/hudson/plugins/groovypostbuild/GroovyPostbuildBroge_Recorder .lang.String-

REPONSE: Importez le plugin GroovyPostBuild et créez un nouvel objet manager. par exemple. Ici, un travail 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 opérationnelle: Dans le travail jenkins, créer un fichier en utilisant le système groovy dans l’espace de travail actuelorg.jvnet.hudson.plugins.groovypostbuild.GroovyPostbuildAction et build.getActions().add(GroovyPostbuildAction.createShortText(text, "black", "limegreen", "0px", "white"));

0
gaoithe

Je soupçonne que l'erreur a été causée par le format du chemin, pourriez-vous essayer ci-dessous:

changement 

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

à

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

Parce que quand j'ai essayé sur mon serveur local Jenkins, je le fais exécuter avec succès. 

enter image description here

enter image description here

0
mainframer