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

Dal*_*ney 5 groovy jenkins jenkins-pipeline multibranch-pipeline

我试图在我的Jenkins文件中使用if语句进行多分支管道项目.为了这个问题,我假设我当前目录中有一个名为'scan.txt'的文本文件.使用bash命令生成文本文件

echo "False" > scan.txt
Run Code Online (Sandbox Code Playgroud)

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

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

script {
    env.TEXT = readFile 'scan.txt'
}
Run Code Online (Sandbox Code Playgroud)

如果我做

echo "${env.TEXT}" 
Run Code Online (Sandbox Code Playgroud)

在脚本块之外,jenkins控制台会按预期显示该步骤的False.

但是,我检查它是否等于"False"的所有尝试都失败了.我在脚本块后立即尝试了以下内容:

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

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


if (env.TEXT == "False") {
    //do something
}
Run Code Online (Sandbox Code Playgroud)

并且它们都不起作用.所有这些条件都是布尔值false.读取文件管道步骤的文档声明它返回文件内容的字符串 https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-readfile-code-read-file-from-工作区 所以我不确定这里发生了什么.有没有人有任何见解?

谢谢

Jon*_*n S 14

问题是当你做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"
    }
}
Run Code Online (Sandbox Code Playgroud)

在输出上我们得到:

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
Run Code Online (Sandbox Code Playgroud)

你可以这样做,当我们做第一个回声步骤时,我们有一个额外的换行符.另请注意,Boolean.parseBoolean()处理字符串时不进行任何修剪.