Как использовать переменную среды jenkins в заявлении if Jenkinsfile

Я пытаюсь использовать оператор if в моем файле Jenkins для проекта с несколькими ветвями. Для ответа на этот вопрос предположим, что в моем текущем каталоге есть текстовый файл с именем scan.txt. Текстовый файл создается с помощью команды bash

echo "False" > scan.txt

Таким образом, единственным содержимым является строка "False".

Я установил произвольную переменную среды в моем файле Jenkins для содержимого scan.txt следующим образом:

script {
    env.TEXT = readFile 'scan.txt'
}

If I do

echo "${env.TEXT}" 

вне блока сценария консоль jenkins показывает False для этого шага, как и ожидалось.

Однако все мои попытки проверить, равно ли оно «Ложь», потерпели неудачу. Я пробовал следующее сразу после блока скрипта:

if (env.TEXT.equals("False")) {
    //do something
}

if (env.TEXT.matches("False")) {
    //do something
}


if (env.TEXT == "False") {
    //do something
}

и ни один из них не работает. Все эти условия являются логическим ложным. В документации для этапа конвейера чтения файла указано, что он возвращает строку содержимого файла https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-readfile-code-read.-file-from-workspace Так что я не уверен, что здесь происходит. У кого-нибудь есть идеи?

Спасибо


person Dalton Sweeney    schedule 01.03.2017    source источник


Ответы (3)


Проблема в том, что когда вы выполняете echo "False" > scan.txt echo, в конце файла останется разрыв строки, вы можете указать это, если вы echo env.TEXT в своем сценарии конвейера.

Итак, что вам нужно сделать, это использовать String.trim(), прежде чем проверять, равно ли оно False, обрезка удалит все пробелы в начале и в конце. Кроме того, лучший способ проверить, содержит ли строка - использовать Boolean.parseBoolean(), он сделает всю тяжелую работу за вас.

Попробуем это:

node {
    sh 'echo "False" > output.txt'
    def val = readFile 'output.txt'
    echo "${val}"
    echo "${val.trim()}"
    if (val.equals("False")) { // This will print No
        echo "Yes"
    } else {
        echo "No"
    }
    if (val.trim().equals("False")) { // This will print Yes
        echo "Yes"
    } else {
        echo "No"
    }
    if (!Boolean.parseBoolean(val)) { // This will print Yes
        echo "Yes"
    } else {
        echo "No"
    }
}

И на выходе получаем:

Started by user jon
[Pipeline] node
Running on master in /var/lib/jenkins/workspace/pl
[Pipeline] {
[Pipeline] sh
[pl] Running shell script
+ echo False
[Pipeline] readFile
[Pipeline] echo
False

[Pipeline] echo
False
[Pipeline] echo
No
[Pipeline] echo
Yes
[Pipeline] echo
Yes
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

Как вы можете видеть, у нас есть дополнительный разрыв строки, когда мы выполняем первый шаг эха. Также обратите внимание, что Boolean.parseBoolean() обрабатывает строку без обрезки.

person Jon S    schedule 02.03.2017

вот несколько случаев, надеюсь, это сэкономит время некоторым людям:

node {

sh 'echo "False" > output.txt'
def val = readFile 'output.txt'
echo "${val}"
echo "${val.trim()}"
if ( "${val.trim()}" ==~ /False/ ) {
    echo "Match Yes trim"
} else {
    echo "Match No trim"
}

if ( "${val}" ==~ /(?ms)False/ ) {
    echo "Match Yes (?ms)"
} else {
    echo "Match No (?ms)"
}

if ( "${val}" ==~ /(?ms)False.*/ ) {
    echo "Match Yes (?ms).*"
} else {
    echo "Match No (?ms).*"
}

if ( "${val}" =~ /False/ ) {
    echo "Match Yes 1="
} else {
    echo "Match No 1="
}

}

Выход:

[Pipeline] sh
+ echo False
[Pipeline] readFile
[Pipeline] echo
False

[Pipeline] echo
False
[Pipeline] echo
Match Yes trim
[Pipeline] echo
Match No (?ms)
[Pipeline] echo
Match Yes (?ms).*
[Pipeline] echo
Match Yes 1=

Где (? Ms) означает многострочность, а s для точки, соответствующей новой строке в регулярном выражении.

Обратите внимание, что echo "False" > добавит в файл новую строку. Его нужно либо обрезать, либо echo -n использовать.

person Arunas Bartisius    schedule 03.04.2019

Получается, если я использую условие

env.TEXT.contains("False")

тогда это работает! Должно быть, в строке readFile содержится больше, чем просто «False».

person Dalton Sweeney    schedule 01.03.2017
comment
Это взлом, настоящее решение было предложено Джоном С. - person Pom12; 02.03.2017