如何在 Jenkinsfile if 语句中使用 jenkins 环境变量
How to use jenkins environment variable in Jenkinsfile if statement
我正在尝试在我的 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
}
和 none 他们的工作。所有这些条件都是布尔值 false。读取文件管道步骤的文档说明它 returns 文件内容的字符串
https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-readfile-code-read-file-from-workspace
所以我不确定这里发生了什么。有没有人有任何见解?
谢谢
所以如果我使用条件
env.TEXT.contains("False")
然后就可以了!一定是 readFile 在其字符串中包含的不仅仅是 "False"。
问题是,当您执行 echo "False" > scan.txt
回显时,会在文件末尾留下一个换行符,如果您在管道脚本中回显 env.TEXT
,则可以看到这个。
所以你需要做的是在检查它是否等于False
之前使用String.trim()
,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
如您所见,我们在执行第一个 echo 步骤时有一个额外的换行符。另请注意 Boolean.parseBoolean()
处理字符串时没有任何 trimming.
这里是一些案例,希望能为一些人节省时间:
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
。
我正在尝试在我的 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
}
和 none 他们的工作。所有这些条件都是布尔值 false。读取文件管道步骤的文档说明它 returns 文件内容的字符串 https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-readfile-code-read-file-from-workspace 所以我不确定这里发生了什么。有没有人有任何见解?
谢谢
所以如果我使用条件
env.TEXT.contains("False")
然后就可以了!一定是 readFile 在其字符串中包含的不仅仅是 "False"。
问题是,当您执行 echo "False" > scan.txt
回显时,会在文件末尾留下一个换行符,如果您在管道脚本中回显 env.TEXT
,则可以看到这个。
所以你需要做的是在检查它是否等于False
之前使用String.trim()
,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
如您所见,我们在执行第一个 echo 步骤时有一个额外的换行符。另请注意 Boolean.parseBoolean()
处理字符串时没有任何 trimming.
这里是一些案例,希望能为一些人节省时间:
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
。