Каков наилучший способ чтения данных из файла с использованием readFile и преобразования его в список в формате groovy? - PullRequest
1 голос
/ 01 ноября 2019

Я пытаюсь прочитать значения из текстовых файлов и помещаю их в список, используя следующий метод.

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 не смог бы сделать.

1 Ответ

1 голос
/ 05 ноября 2019

Вы можете получить тот же результат, используя шаг 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"))
...