每当我的Jenkins作业的构建完成时,我都会使用Editable Email Notification
插件(a.k.a。Email-ext
插件)发送包含结果的电子邮件。
此外,如果系统中存在某个文件,我将修改消息的默认内容以通知该文件的存在。
为此,我使用了该插件的Pre-send Script
字段。
LOG="log.txt"
#!/bin/bash
touch ${WORKSPACE}/${LOG}
echo "this is just a log" >> ${WORKSPACE}/${LOG}
File log = new File("${WORKSPACE}/${LOG}");
logger.println(log.text);
执行构建时,Jenkins
将在${WORKSPACE}
中创建文件并填充它(我能够从Jenkins从站中的终端打印内容)。
但是当尝试从Email
插件访问它时,会引发异常java.io.FileNotFoundException
:
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
抱怨丢失的文件而感到茫然,而如果我用
logger.println(log.getPath());
它会成功打印出来。
注意:
logger
中的Pre-send Script
变量由通知插件提供,可直接访问构建日志。
答案 0 :(得分:10)
在Jenkins管道中,File log = new File("${WORKSPACE}/${LOG}");
无效。
您可以使用readFile代替
例如
def log = readFile“$ {WORKSPACE} / $ {LOG}”
答案 1 :(得分:4)
java.io.File
方法将引用运行Jenkins的主服务器上的文件,因此不会引用从机上的当前工作空间中的文件。
要引用从机上的文件,您应该使用readFile
方法
def log = readFile("${WORKSPACE}/${LOG}");
答案 2 :(得分:2)
post构建操作有可能在master上运行。你可以测试它 - 打印你的groovy脚本中的路径和文件夹中的文件列表。然后添加到该文件夹2个文件mast.txt为主服务器,slave.txt为从服务器。
再次触发工作,您将得到答案