Groovy报告文件在系统中确实存在时不存在 [英] Groovy reports that a file doesn't exists when it really is present in the system
问题描述
每当完成Jenkins作业的构建时,我都会使用Editable Email Notification
插件(也称为Email-ext
插件)发送包含结果的电子邮件.
另外,如果系统中存在某个文件,则我正在修改消息的默认内容,以通知该文件的存在.
Whenever a build of my Jenkins job finishes, I'm sending an email with the results using the Editable Email Notification
plugin (a.k.a. Email-ext
plugin).
Also, if a certain file is present in the system, I'm modifying the default content of the message to notify of the existence of that file.
为此,我正在使用插件的Pre-send Script
字段.
For that end, I'm using the Pre-send Script
field of the plugin.
为运行准备环境
属性内容
Prepare an environment for the run
Properties Content
LOG="log.txt"
构建阶段
#!/bin/bash
touch ${WORKSPACE}/${LOG}
echo "this is just a log" >> ${WORKSPACE}/${LOG}
构建后操作
可编辑的电子邮件通知
预发送脚本
Post-build Actions
Editable Email Notification
Pre-send Script
File log = new File("${WORKSPACE}/${LOG}");
logger.println(log.text);
执行构建时,Jenkins
将在${WORKSPACE}
中创建文件并将其填充(我能够从Jenkins从站中的终端打印内容).
When executing the build, Jenkins
will create the file in the ${WORKSPACE}
and fill it (I'm able to print the contents from the terminal in the Jenkins slave).
但是当尝试从Email
插件访问它时,会引发异常java.io.FileNotFoundException
:
But when trying to access it from the Email
plugin, the exception java.io.FileNotFoundException
is raised:
java.io.FileNotFoundException: /home/jenkins/workspace/testJob/log.txt (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:146)
at groovy.util.CharsetToolkit.<init>(CharsetToolkit.java:69)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.newReader(DefaultGroovyMethods.java:16958)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.getText(DefaultGroovyMethods.java:16006)
at org.codehaus.groovy.runtime.dgm$381.doMethodInvoke(Unknown Source)
at org.codehaus.groovy.reflection.GeneratedMetaMethod$Proxy.doMethodInvoke(GeneratedMetaMethod.java:70)
at groovy.lang.MetaClassImpl$GetBeanMethodMetaProperty.getProperty(MetaClassImpl.java:3500)
at org.codehaus.groovy.runtime.callsite.GetEffectivePojoPropertySite.getProperty(GetEffectivePojoPropertySite.java:61)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:227)
at Script1.run(Script1.groovy:59)
at groovy.lang.GroovyShell.evaluate(GroovyShell.java:580)
at groovy.lang.GroovyShell.evaluate(GroovyShell.java:618)
at groovy.lang.GroovyShell.evaluate(GroovyShell.java:589)
at hudson.plugins.emailext.ExtendedEmailPublisher.executePresendScript(ExtendedEmailPublisher.java:450)
at hudson.plugins.emailext.ExtendedEmailPublisher.sendMail(ExtendedEmailPublisher.java:311)
at hudson.plugins.emailext.ExtendedEmailPublisher._perform(ExtendedEmailPublisher.java:297)
at hudson.plugins.emailext.ExtendedEmailPublisher.perform(ExtendedEmailPublisher.java:244)
at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:782)
at hudson.model.AbstractBuild$AbstractBuildExecution.performAllBuildSteps(AbstractBuild.java:723)
at hudson.model.Build$BuildExecution.cleanUp(Build.java:195)
at hudson.model.Run.execute(Run.java:1785)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
at hudson.model.ResourceController.execute(ResourceController.java:98)
at hudson.model.Executor.run(Executor.java:410)
我不知所措,为什么Groovy
抱怨缺少文件,而如果我改为使用
I'm at a loss as why Groovy
is complaining about the missing file, whereas if I instead print the path with
logger.println(log.getPath());
它将成功打印.
注意:
通知插件提供了Pre-send Script
中的logger
变量,以直接访问构建日志.
NOTE:
The logger
variable in the Pre-send Script
is provided by the notification plugin to access directly the build log.
推荐答案
java.io.File
方法将引用运行Jenkins的主服务器上的文件,而不是从属计算机上当前的工作空间中的文件.
java.io.File
methods will refer to files on the master where Jenkins is running, so not in the current workspace on the slave machine.
要引用从属计算机上的文件,应使用readFile
方法
To refer to files on the slave machine, you should use the readFile
method
def log = readFile("${WORKSPACE}/${LOG}");
这篇关于Groovy报告文件在系统中确实存在时不存在的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!