在詹金斯的工作中,在当前工作空间中使用系统groovy创建文件 [英] In jenkins job, create file using system groovy in current workspace

查看:101
本文介绍了在詹金斯的工作中,在当前工作空间中使用系统groovy创建文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的任务是收集节点详细信息并以certail格式列出它们。我需要将数据写入文件并将其保存为csv文件并将其作为工件附加。
但我无法使用jenkins中的groovy脚本创建一个文件,使用插件Execute System Groovy作为构建步骤

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

EnvVars envVars = build。 getEnvironment(收听);

filename = envVars.get('WORKSPACE')+\\\\
ode_details.txt;
// filename =$ {manager.build.workspace.remote}+\\\\
ode_details.txt
targetFile = new File(filename);
println尝试创建文件:$ targetFile

if(targetFile.createNewFile()){
println成功创建文件$ targetFile
} else {
println无法创建文件$ targetFile
}
print删除$ {targetFile.getAbsolutePath()}:
println targetFile.delete()

获得的输出

 尝试创建文件:/home/jenkins/server-name/workspace/GET_NODE_DETAILS\\\
ode_details.txt
致命错误:没有这样的文件或目录
java.io.IOException:没有这样的文件或目录
在java.io.UnixFileSystem.createFileExclusively(Native方法)$ b $在java.io.File.createNewFile(File.java:947)
在java_io_File $ createNewFile.call(未知来源)
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
在org.codehaus.groo vy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)
在Script1.run(Script1.groovy:13)
在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 $ build.java:$ build.java:
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)

有时候我看到人们使用经理对象,我如何才能访问它?
如何完成任务的任何想法?

解决方案

问题
Groovy系统脚本始终在jenkins主节点中运行,而工作区是jenkins从属节点中的文件路径,它不存在于主节点中。



您可以通过代码进行验证

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

它将返回 false



如果您不使用从属节点,它将返回 true



解决方案因为我们不能使用正常的 File ,所以我们必须使用 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 ); //写入文件
}

然后在两种情况下都能正常工作。


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 ?

解决方案

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.

这篇关于在詹金斯的工作中,在当前工作空间中使用系统groovy创建文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆