6

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

echo "False" > scan.txt

所以唯一的内容是字符串“False”

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

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

如果我做

echo "${env.TEXT}" 

在脚本块之外,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-工作区 ,所以我不确定这里发生了什么。有没有人有任何见解?

谢谢

4

3 回答 3

16

问题是当您执行echo "False" > scan.txtecho 时会在文件末尾留下一个换行符,如果您env.TEXT在管道脚本中回显,您可以设置它。

所以你需要做的是String.trim()在检查它是否等于之前使用False,trim 将删除开头和结尾的所有空格。此外,测试字符串是否包含的最佳方法是使用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()处理字符串时无需任何修剪。

于 2017-03-02T06:02:42.827 回答
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使用。

于 2019-04-03T07:44:42.107 回答
-1

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

env.TEXT.contains("False")

那么它的工作原理!必须是 readFile 在其字符串中包含的不仅仅是“False”。

于 2017-03-01T23:20:35.580 回答