jenkins-pipeline - 使用 readFile 从文件中读取数据并将其转换为 groovy 中的列表的最佳方法是什么?

标签 jenkins-pipeline jenkins-groovy

我正在尝试从文本文件中读取值并使用以下方法将这些值放入列表中。

def myKeys = []
new File( '/tmp/A.txt' ).eachLine { line ->
    myKeys << line
}

def myValues = []
new File( '/tmp/B.txt' ).eachLine { line ->
    myValues << line
}

问题是,Jenkins 不允许它在从属设备上运行,并且我不确定如何在此处使用 readFile 方法,因为它无法解决目的。我想创建一个列表,这是 readFile 无法做到的。

最佳答案

您可以使用 readFile 步骤获得相同的结果。它从工作区读取给定文件并以字符串形式返回文件内容。然后你可以使用String.eachLine(closure)方法来迭代每一行并将其添加到您期望的列表中。但请记住一件事 - 如果您想使用 String.eachLine() 方法,则需要在 @NonCPS 模式下执行。否则,您最多只能从迭代中获得一个元素。

看一下下面的示例:

pipeline {
    agent any

    stages {
        stage("Read test.txt file") {
            steps {
                script {
                    final String content = readFile(file: "test.txt")
                    final List myKeys = extractLines(content)
                    echo "myKeys = ${myKeys}"
                }
            }
        }
    }
}

@NonCPS
List extractLines(final String content) {
    List myKeys = []
    content.eachLine { line -> 
        myKeys << line
    }
    return myKeys
}

在此示例中,我们使用简单的 test.text 文件,其中包含以下内容:

$ cat test.txt 
123
qwe
asd
zxc

运行此示例管道会产生以下输出:

Running on Jenkins in /home/wololock/.jenkins/workspace/jobA
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Read test.txt file)
[Pipeline] script
[Pipeline] {
[Pipeline] readFile
[Pipeline] echo
myKeys = [123, qwe, asd, zxc]
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

您可以使用类似的方法从两个不同的文件中提取键和值,例如

def myKeys = extractLines(readFile(file:"/tmp/A.txt"))
def myValues = extractLines(readFile(file:"/tmp/B.txt"))

关于jenkins-pipeline - 使用 readFile 从文件中读取数据并将其转换为 groovy 中的列表的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58665154/

相关文章:

jenkins - 如何将排除文件夹的JOB_NAME放入Jenkins中的环境变量中?

jenkins - 如何为 Jenkins 管道获取相同的 Mailer 行为

git - 如何将当前分支中的 GIT 标记读取到变量中?

jenkins - 在 Jenkins 声明式管道中使用构建 block

jenkins - 在 Jenkinsfile 中触发远程构建(例如,从脚本)语法

Jenkins 声明式管道并行构建

jenkins-pipeline - 如何将 Jenkins 共享库中的类导入到管道中

Jenkins 选择参数传递给管道作业

jenkins - 如何在管道的后部分定义变量?

Jenkins 与 Intellij 共享库