当前位置:  开发笔记 > 编程语言 > 正文

Groovy报告文件在系统中确实存在时不存在

如何解决《Groovy报告文件在系统中确实存在时不存在》经验,为你挑选了2个好方法。

每当我的Jenkins作业的构建完成,我就会使用Editable Email Notification插件(又名Email-ext插件)发送一封包含结果的电子邮件.此外,如果系统中存在某个文件,我正在修改消息的默认内容以通知该文件的存在.

为此,我正在使用Pre-send Script插件的字段.

测试作业配置:

为运行准备一个环境

属性内容

LOG="log.txt"

建立阶段

执行shell

#!/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.(FileInputStream.java:146)
    at groovy.util.CharsetToolkit.(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可直接访问构建日志.



1> Joseph Rajee..:

在Jenkins管道中,File log = new File("${WORKSPACE}/${LOG}");不起作用.
您可以使用READFILE而不是

高清登录= READFILE "$ {WORKSPACE}/$ {} LOG"


是的,这是Jenkins的预期行为:https://issues.jenkins-ci.org/browse/JENKINS-37577

2> Pieter Meire..:

java.io.File 方法将引用运行Jenkins的主服务器上的文件,而不是从属计算机上当前的工作空间中的文件。

要引用从属计算机上的文件,应使用以下readFile方法

def log = readFile("${WORKSPACE}/${LOG}");

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有