Jenkins script块中If-Else语句不执行问题排查
问题根因
- Shebang声明失效:你脚本中
#!/bin/bash前带有空格,shebang必须处于脚本最开头的前两个字符位置才能生效,因此Jenkins默认使用/bin/sh执行该脚本,而POSIX标准的sh不支持[[ ]]这种Bash专属语法,if判断逻辑直接因语法错误被跳过。 - 管道退出码取错:Bash中未开启
pipefail选项时,管道命令的整体退出码等于最后一个命令的退出码,你当前取的$?实际是最后一个grep -v 'Time elapsed'的执行结果,不是你要判断的第一个grep 'Tests run:'的退出码,判断逻辑完全不符合预期。
修复后代码
script { unit_test_result = sh ( script: '''#!/bin/bash # 捕获第一个grep的执行结果和退出码,避免后续管道干扰 test_line=$(mvn clean test | grep 'Tests run:') grep_exit=$? if [[ $grep_exit -eq 1 ]]; then echo "No Unit tests to run!" else echo "$test_line" | grep -v 'Time elapsed' fi ''', returnStdout: true ).trim() }
修复说明
- 去掉了shebang前的空格,确保使用Bash执行脚本,支持
[[ ]]语法 - 拆分原有管道逻辑,单独存储第一个
grep 'Tests run:'的退出码作为判断依据,不会被后续过滤逻辑干扰 - 拆分后的逻辑更清晰,不会出现判断对象错误的问题
内容的提问来源于stack exchange,提问作者user630702
相关产品推荐
相关产品推荐

