当前位置: 首页 > 面试题库 >

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

林君博
2023-03-14
问题内容

我的任务是收集节点详细信息并以详细格式列出。我需要将数据写入文件并将其保存为csv文件,并将其附加为工件。但是我无法使用插件“ Execute System
Groovy”作为构建步骤,在詹金斯中使用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)

有时我看到人们使用“管理器”对象,我该如何访问它?关于如何完成任务有任何想法吗?


问题答案:

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

您可以通过代码验证

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

它将返回 false

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

解决方案 由于我们不能使用normal 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
}

然后它在两种情况下都有效。



 类似资料:
  • 我有两个管道作业作业作业A和作业B。我需要通过作业A的工作空间url(比如 /var/lib/jenkins/workspace/JobA)被作业B使用。主要的想法是我试图复制由于maven构建而生成的目标文件夹的内容,但我不想使用复制工件插件或存档工件插件来实现同样的目的。 我尝试过使用“此作业已参数化”选项,其中作业A是作业B的上游,但我无法使用该选项。 有人能帮助实现同样的目标吗?

  • 问题内容: 我需要并行执行作业,并且遇到了这个名为Jenkins的名为MultiJob插件的插件。 浏览完文档后,我创建了阶段并给出了工作名称。但是我基本上在哪里创建作业。我的意思是作业“ TaskToExecute1”和“ TasktoExecute2”的脚本,构建步骤和构建后步骤。 谢谢,VVP 问题答案: 您需要创建从“作业名称”引用的作业。 因此,在您的示例中,创建一个单独的作业/项目(例

  • 问题内容: 我是Jenkins / Hudson的新手,正在尝试从buildbot迁移基于C make的项目。由于遗留原因,构建系统被硬编码以在版本控制的源代码树(git)之外(在上面的一个目录中)在单独的目录中进行构建。例如: 除了最终在工作空间之外创建目录这一事实外,Jenkins不会识别上面build /目录中的项目以将其归档为工件。 如何使这种构建系统与Hudson一起使用?在源代码树中构

  • 问题内容: 我正在尝试创建一个WCF REST客户端,该客户端将与Jenkins通信并从XML文件创建作业,然后构建该作业。我的理解是,您可以使用Jenkins做到这一点。 有人可以提供一些命令,您可以在浏览器的地址栏上键入这些命令来创建和构建作业吗?即:沿着这些思路。 问题答案: 请参阅Jenkins API Wiki页面(包括末尾的注释)。您可以使用Jenkins本身提供的文档来填补空白。例如

  • 问题内容: 我正在尝试创建一个将在每个圣诞节执行特定程序的工作。这是我走了多远: 但是我似乎找不到一种简单的方法来将时间间隔更改为每年一次,并且总体上对如何解决这个问题感到很困惑,任何帮助都非常感谢 问题答案: 你想要类似的东西 该作业将在2012年圣诞节的午夜首次运行,此后每12个月运行一次。

  • 问题内容: 我正在使用Groovy脚本控制台在Jenkins上创建和更新作业。使用此处记录的API http://javadoc.jenkins-ci.org/ 我发现了如何通过使用创建工作 但是,如果作业已经存在,则此方法将失败。如何使用新的xml更新现有作业? 更新资料 基于@ogondza的答案,我使用了以下内容来创建然后更新作业 问题答案: 使用AbstractItem#updateByX