如何在不知道名称(或编号)的情况下从共享库中的资源文件夹加载文件?

cod*_*ass 7 shared-libraries jenkins jenkins-pipeline

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

libraryResource("script.sh")
Run Code Online (Sandbox Code Playgroud)

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

+ resources
 + teamA
  + script1.sh
  + script2.sh
Run Code Online (Sandbox Code Playgroud)

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

+ resources
 + teamA
  + script1.sh
  + script2.sh
Run Code Online (Sandbox Code Playgroud)

在哪里 scriptsFolder= "teamA"

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

那么,有没有一种方法可以在不知道名称或编号的情况下加载所有这些文件?

小智 8

您可以使用 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()
}
Run Code Online (Sandbox Code Playgroud)

使用路径,您可以像往常一样调用脚本:

sh "${get_resource_dir()}/com/example/test.sh"
Run Code Online (Sandbox Code Playgroud)


小智 0

我决定利用 shell 脚本的力量。Jenkins 服务器和从站都在 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"
}
Run Code Online (Sandbox Code Playgroud)