【问题标题】:How to load files from resources folder in Shared library without knowing their names (or number)?如何在不知道名称(或编号)的情况下从共享库中的资源文件夹加载文件?
【发布时间】:2018-07-04 09:33:09
【问题描述】:

如您所知,在 Jenkins 的共享库中,可以通过以下方式加载资源(位于资源文件夹中):

libraryResource("script.sh")

现在我的用例是我想在资源下的文件夹中加载多个文件:

+ resources
 + teamA
  + script1.sh
  + script2.sh

我想在做任何事情之前加载所有这些文件: 我在共享库中做了一个方法:

new File(scriptsFolder).eachFile() { file->

 writeFile([file:"${env.workspace}/${file.getName()}",text:libraryResource("$scriptsFolder/${file.getName()}")])
 sh("chmod +x ${env.workspace}/${file.getName()}")
}

在哪里scriptsFolder= "teamA"

我当然会收到java.io.IOException: Is a directory 因为libraryResource必须得到一个文件路径参数。

那么,有没有办法在不知道它们的名称或编号的情况下加载所有这些文件?

【问题讨论】:

  • 可能只是资源文件夹的结帐?如何 ?还有更优雅的方式吗?

标签: jenkins shared-libraries jenkins-pipeline


【解决方案1】:

您可以使用 Groovy @SourceURI 注释获取共享库的绝对路径:

// vars/get_resource_dir.groovy
import groovy.transform.SourceURI
import java.nio.file.Path
import java.nio.file.Paths

class ScriptSourceUri {
    @SourceURI
    static URI uri
}

def call() {
    Path scriptLocation = Paths.get(ScriptSourceUri.uri)
    return scriptLocation.getParent().getParent().resolve('resources').toString()
}

使用路径你可以像往常一样调用你的脚本:

sh "${get_resource_dir()}/com/example/test.sh"

【讨论】:

  • 这看起来是我的问题的理想解决方案...除了这会触发两个安全异常:1)“脚本不允许使用 staticMethod java.net.URI 创建 java.lang.String。” 2)“脚本不允许使用staticMethod java.nio.file.Paths get java.net.URI。”第二个被 Jenkins 标记为“批准此签名可能会引入安全漏洞!建议您拒绝它。”我不能冒这个险:-(
【解决方案2】:

我决定使用 shell 脚本的强大功能。 Jenkins server 和 slaves 都在 Linux 上。

给定:我在一个子目录中,资源文件夹是上一个目录。

String folder = "resources/teamA"
sh(script: "cp -R ../${folder}/. .")

// Verify files
def status = steps.sh(script: "diff ../${folder}/ .", returnStatus : true)

if(status.equals(0)) {
    // do that thing you do
} else {
    error "FAILURE not all files required exist"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-10
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2011-09-23
    相关资源
    最近更新 更多