在jenkins作业中,使用当前工作空间中的系统groovy创建文件

时间:2015-06-02 23:46:56

标签: groovy jenkins jenkins-plugins

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

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

获得的输出

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)

有一段时间我看到人们使用“经理”对象,我怎样才能访问它? Alos关于如何完成任务的任何想法?

4 个答案:

答案 0 :(得分:45)

<强>问题 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); //writing to file
} 

然后它适用于两种情况。

答案 1 :(得分:0)

我怀疑错误是由路径格式引起的,您可以在下面尝试:

更改

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

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

因为当我在我的本地jenkins服务器上尝试时,我成功执行了它。

enter image description here

enter image description here

答案 2 :(得分:0)

@Larry Cai的答案涵盖了从System Groovy Script(因为它在主节点上运行)将文件写入从节点的一部分。

我回答的部分是“有时我看到人们使用”经理“对象,我怎样才能访问它” 这是Post Build Groovy Script中已有的对象,用于访问环境变量,构建状态,构建显示名称等许多内容。

引自https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Postbuild+Plugin

“groovy脚本可以使用变量管理器,它提供了各种方法来装饰你的构建。 这些方法可分为白名单方法和非白名单方法。“

要访问它,我们可以在post build groovy脚本中直接调用它。 e.g

manager.build.setDescription(“自定义说明”) manager.addShortText(“在此处添加您的留言”)

此处记录了管理器对象上可用的所有方法。

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

答案 3 :(得分:0)

取决于groovy的调用方式,管理器对象不可用。例如在“执行系统常规脚本”中。

您可以在jenkins GroovyPostBuild插件API中找到BadgeManager类:https://javadoc.jenkins.io/plugin/groovy-postbuild/org/jvnet/hudson/plugins/groovypostbuild/GroovyPostbuildRecorder.BadgeManager.html#addShortText-java.lang.String-

答案:导入GroovyPostBuild插件并创建一个新的管理器对象。例如在此处使用“执行系统Groovy脚本”的作业创建一个管理器对象,并调用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")

这个问题给出了一个提示:请参阅此处获取几乎可行的答案: In jenkins job, create file using system groovy in current workspace org.jvnet.hudson.plugins.groovypostbuild.GroovyPostbuildActionbuild.getActions().add(GroovyPostbuildAction.createShortText(text, "black", "limegreen", "0px", "white"));