如何在Jenkinsfile的if语句中使用Jenkins环境变量

7

我正在尝试在我的Jenkinsfile中使用if语句来处理多分支管道项目。为了回答这个问题,假设我在当前目录下有一个名为'scan.txt'的文本文件。该文本文件是通过bash命令生成的。

echo "False" > scan.txt

因此,唯一的内容是字符串"False"

我在Jenkinsfile中将任意环境变量设置为scan.txt的内容,如下所示:

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

如果我执行:
echo "${env.TEXT}" 

如果脚本块之外的内容是False,那么Jenkins控制台会显示False,这是预期的结果。
然而,我尝试过多种方式来检查它是否等于“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,所以我不确定出了什么问题。请问有人能提供任何见解吗?
谢谢。
3个回答

17
问题在于,当您执行echo "False" > scan.txt时,echo会在文件末尾留下一个换行符,如果您在流水线脚本中echo env.TEXT,您可以看到这一点。
因此,您需要在检查字符串是否等于False之前使用String.trim(),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

正如您所看到的,当我们进行第一个 echo 步骤时,会有一个额外的换行符。此外,请注意 Boolean.parseBoolean() 处理字符串而无需任何修剪。


2

这里有一些案例,希望能为一些人节省时间:

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命令。


-1

事实证明,如果我使用条件

env.TEXT.contains("False")

然后它就能工作了!这一定是因为readFile字符串中包含的不仅仅是"False"。


3
这是一种黑客方式,真正的解决方案已由Jon S.提供。 - Pom12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接