相关疑难解决方法(0)

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

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

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

测试作业配置:

为运行准备一个环境

属性内容

LOG="log.txt"
Run Code Online (Sandbox Code Playgroud)

建立阶段

执行shell

#!/bin/bash

touch ${WORKSPACE}/${LOG}
echo "this is just a log" >> ${WORKSPACE}/${LOG}
Run Code Online (Sandbox Code Playgroud)

后期制作行动

可编辑的电子邮件通知

预发送脚本

File log = new File("${WORKSPACE}/${LOG}");
logger.println(log.text);
Run Code Online (Sandbox Code Playgroud)

执行构建时,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) …
Run Code Online (Sandbox Code Playgroud)

file-io groovy jenkins jenkins-plugins

8
推荐指数
2
解决办法
1万
查看次数

获取Jenkinsfile(Groovy)中给定文件夹中的文件名列表

我无法在脚本化的Jenkins管道中的给定目录中创建简单的文件名列表.我尝试在SO和其他论坛上发布了许多Groovy Script示例,但要么功能被阻止,要么我找不到方法.

这似乎是最简单的

def DOCKER_FILES_DIR = './dockerfiles'
// ...
def dir = new File(DOCKER_FILES_DIR);
def dockerfiles = [];
dir.traverse(type: FILES, maxDepth: 0) {
    dockerfiles.add(it)
}
Run Code Online (Sandbox Code Playgroud)

但这会错误地解决相对路径,所以我收到此错误:

java.io.FileNotFoundException: /./dockerfiles
Run Code Online (Sandbox Code Playgroud)

我也尝试用以下内容包装dir:

def DOCKER_FILES_DIR = './dockerfiles'
// ...
def dockerfiles = [];
dir("${env.WORKSPACE}"){
    def dir = new File(DOCKER_FILES_DIR);
    dir.traverse(type: FILES, maxDepth: 0) {
        dockerfiles.add(it)
    }
}
Run Code Online (Sandbox Code Playgroud)

但得到了同样的错误:

java.io.FileNotFoundException: /./dockerfiles
Run Code Online (Sandbox Code Playgroud)

这不会产生错误,但只会向列表中添加一个文件:

def DOCKER_FILES_DIR = './dockerfiles'
// ...
def dockerfiles = [];
def dir = new File("${env.WORKSPACE}/${DOCKER_FILES_DIR}");
dir.traverse(type: FILES, maxDepth: 0) {
    dockerfiles.add(it.getName()) …
Run Code Online (Sandbox Code Playgroud)

groovy jenkins jenkins-pipeline

6
推荐指数
1
解决办法
2万
查看次数