Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In jenkins job, create file using system groovy in current workspace

Tags:

my task is to collect node details and list them in certail format. I need to write data to a file and save it as csv file and attach it as artifacts. But i am not able to create a file using groovy scripts in the jenkins using plugin "Execute System Groovy" as build step

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

Output obtained

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) 

Some time i see people use "manager" object, how can i get access to it ? Alos any ideas on how to accomplish the task ?

like image 521
bicepjai Avatar asked Jun 02 '15 23:06

bicepjai


People also ask

How do I create a Groovy script in Jenkins?

To create Groovy-based project, add new free-style project and select "Execute Groovy script" in the Build section, select previously configured Groovy installation and then type your command, or specify your script file name. In the second case path taken is relatively from the project workspace directory.

Are Jenkins files written in Groovy?

Within a Pipeline Project (read plugin), Jenkins introduces a domain-specific language (DSL) based on 'Groovy', which can be used to define a new pipeline as a script. The flow that would typically require many “standard” Jenkins jobs chained together, can be expressed as a single script.


1 Answers

Problem Groovy system script is always run in jenkins master node, while the workspace is the file path in your jenkins slave node, which doesn't exist in your master node.

You can verify by the code

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

It will return false

If you don't use slave node, it will return true

Solution As we can't use normal File, we have to use 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 }  

Then it works in both case.

like image 185
Larry Cai Avatar answered Oct 24 '22 20:10

Larry Cai