在 jenkins 作业中,在当前工作空间中使用系统 groovy 创建文件
In jenkins job, create file using system groovy in current workspace
我的任务是收集节点详细信息并以特定格式列出它们。我需要将数据写入文件并将其保存为 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.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)
有时我看到人们使用 "manager" 对象,我怎样才能访问它?
还有关于如何完成任务的任何想法吗?
我怀疑是路径格式导致的错误,你可以试试下面的方法:
改变
filename = envVars.get('WORKSPACE') + "\node_details.txt";
至
filename = envVars.get('WORKSPACE') + "/node_details.txt";
因为当我在我的本地 jenkins 服务器上尝试时,我成功地执行了它。
问题
Groovy系统脚本在jenkins主节点中总是运行,而工作空间是你jenkins从节点中的文件路径,在你的主节点中不存在。
您可以通过验证码验证
theDir = new File(envVars.get('WORKSPACE'))
println theDir.exists()
会returnfalse
如果不使用slave节点,会returntrue
解决方法因为我们不能用普通的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
}
然后它在两种情况下都有效。
@Larry Cai 的回答涵盖了从系统 Groovy 脚本(因为它在主节点上运行)向从节点写入文件的一部分。
我要回答的部分是 "Some time i see people use "manager" 对象,我怎样才能访问它"
这是在 Post 构建 Groovy 脚本中已经可用的对象,用于访问很多东西,例如环境变量、构建状态、构建显示名称等
引自 https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Postbuild+Plugin :
"groovy 脚本可以使用变量管理器,它提供了多种方法来装饰您的构建。
这些方法可以分为白名单方法和非白名单方法。"
要访问它,我们可以直接在post构建groovy脚本中调用它。例如
manager.build.setDescription("custom description")
manager.addShortText("add your message here")
此处记录了管理器对象上可用的所有方法。
根据调用 groovy 的方式,管理器对象不可用。例如在 "execute system groovy script"。
您可以在此处的 jenkins GroovyPostBuild 插件 API 中找到 BadgeManager class:https://javadoc.jenkins.io/plugin/groovy-postbuild/org/jvnet/hudson/plugins/groovypostbuild/GroovyPostbuildRecorder.BadgeManager.html#addShortText-java.lang.String-
答案:导入 GroovyPostBuild 插件并创建一个新的管理器对象。例如这里有一个 "Execute System Groovy Script" 的作业创建一个管理器对象并调用 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")
这个问题给出了一个提示:请参阅此处以获得几乎有效的答案:
org.jvnet.hudson.plugins.groovypostbuild.GroovyPostbuildAction
和 build.getActions().add(GroovyPostbuildAction.createShortText(text, "black", "limegreen", "0px", "white"));
我的任务是收集节点详细信息并以特定格式列出它们。我需要将数据写入文件并将其保存为 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.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)
有时我看到人们使用 "manager" 对象,我怎样才能访问它? 还有关于如何完成任务的任何想法吗?
我怀疑是路径格式导致的错误,你可以试试下面的方法:
改变
filename = envVars.get('WORKSPACE') + "\node_details.txt";
至
filename = envVars.get('WORKSPACE') + "/node_details.txt";
因为当我在我的本地 jenkins 服务器上尝试时,我成功地执行了它。
问题 Groovy系统脚本在jenkins主节点中总是运行,而工作空间是你jenkins从节点中的文件路径,在你的主节点中不存在。
您可以通过验证码验证
theDir = new File(envVars.get('WORKSPACE'))
println theDir.exists()
会returnfalse
如果不使用slave节点,会returntrue
解决方法因为我们不能用普通的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
}
然后它在两种情况下都有效。
@Larry Cai 的回答涵盖了从系统 Groovy 脚本(因为它在主节点上运行)向从节点写入文件的一部分。
我要回答的部分是 "Some time i see people use "manager" 对象,我怎样才能访问它" 这是在 Post 构建 Groovy 脚本中已经可用的对象,用于访问很多东西,例如环境变量、构建状态、构建显示名称等
引自 https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Postbuild+Plugin :
"groovy 脚本可以使用变量管理器,它提供了多种方法来装饰您的构建。 这些方法可以分为白名单方法和非白名单方法。"
要访问它,我们可以直接在post构建groovy脚本中调用它。例如
manager.build.setDescription("custom description") manager.addShortText("add your message here")
此处记录了管理器对象上可用的所有方法。
根据调用 groovy 的方式,管理器对象不可用。例如在 "execute system groovy script"。
您可以在此处的 jenkins GroovyPostBuild 插件 API 中找到 BadgeManager class:https://javadoc.jenkins.io/plugin/groovy-postbuild/org/jvnet/hudson/plugins/groovypostbuild/GroovyPostbuildRecorder.BadgeManager.html#addShortText-java.lang.String-
答案:导入 GroovyPostBuild 插件并创建一个新的管理器对象。例如这里有一个 "Execute System Groovy Script" 的作业创建一个管理器对象并调用 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")
这个问题给出了一个提示:请参阅此处以获得几乎有效的答案:
org.jvnet.hudson.plugins.groovypostbuild.GroovyPostbuildAction
和 build.getActions().add(GroovyPostbuildAction.createShortText(text, "black", "limegreen", "0px", "white"));