Linux 当/if/etc有错误时,如何使bash脚本失败?
我与Groovy一起运行Jenkins管道作业。Groovy为每个步骤调用bash脚本 如果有什么事情出了差错,我希望整个工作都失败 对于Groovy,我使用Linux 当/if/etc有错误时,如何使bash脚本失败?,linux,bash,shell,jenkins,groovy,Linux,Bash,Shell,Jenkins,Groovy,我与Groovy一起运行Jenkins管道作业。Groovy为每个步骤调用bash脚本 如果有什么事情出了差错,我希望整个工作都失败 对于Groovy,我使用returnStatus:true 对于Bash,我使用set-e 但是,如果例如while语句有错误,则带有set-e的bash脚本不会退出。根据“set”的Linux手册页面,这就是实际应该发生的事情。 我想知道在这种情况下如何立即退出 剧本: 詹金斯-user@jenkins~]$cat script.sh #!/bin/bash s
returnStatus:true
对于Bash,我使用set-e
但是,如果例如while
语句有错误,则带有set-e
的bash脚本不会退出。根据“set”的Linux手册页面,这就是实际应该发生的事情。
我想知道在这种情况下如何立即退出
剧本:
詹金斯-user@jenkins~]$cat script.sh
#!/bin/bash
set-xe
FILE=commands.txt
echo“在while之前回音”
#运行命令文件中的命令
whileread命令
做
$COMMAND
完成<$FILE
回声$?
echo“故障后的echos while”
假设“commands.txt”不存在。
运行脚本:
詹金斯-user@jenkins~]$sh script.sh
回荡
script.sh:第13行:commands.txt:没有这样的文件或目录
1.
故障后回声
[詹金斯-user@jenkins~]$echo$?
0
尽管while
语句返回退出代码1,但脚本继续并成功结束,正如后面检查的那样,使用echo$?
这就是我在使用bash/python/etc命令/脚本执行步骤后强制Groovy失败的方式,该命令/脚本返回一个none-zero退出代码:
pipeline {
agent any
stages {
stage("A") {
steps {
script {
def rc = sh(script: "sh A.sh", returnStatus: true)
if (rc != 0) {
error "Failed, exiting now..."
}
}
}
}
}
}
第一个问题,当while/if/etc语句有错误时,如何使SHELL脚本失败?我知道我可以使用command | | exit 1
,但如果脚本中有几十条这样的语句,那就显得不优雅了
第二个问题,我的Groovy错误处理正确吗?有谁能推荐一个更好的活动方式吗?或者也许有一个Jenkins插件/官方的方法可以做到这一点?为什么不在退出代码并返回代码时使用
?(请参阅脚本的此修改版本,最后一行)
詹金斯-user@jenkins~]$cat script.sh
#!/bin/bash
set-xe
FILE=commands.txt
echo“在while之前回音”
#运行命令文件中的命令
whileread命令
做
$COMMAND
完成<$FILE
状态=$?
echo“故障后的echos while”
退出$status
第一个问题此链接可能会有所帮助
第二个问题:您可以使用try-and-catch进行异常处理来改进错误处理
try{
def rc = sh(script: "sh A.sh", returnStatus: true)
if (rc != 0) {
error "Failed, exiting now..."
}
}
catch (Exception er){
errorMessage = er.getMessage();
}
关于Bash脚本
您的问题是,尽管使用了set-e
,但失败重定向不会中止bash脚本。我自己也很惊讶。但这是我对<代码> SET-E/COD>的第一次失望,所以现在我认为不信任它,我滥用诸如“代码> $命令出口1”/代码>…/P>
在这里,您可以执行以下操作:
set -xe -o pipefail
cat $FILE | while read command; do $command ; done
但整个循环应简化为:
bash $FILE
你能解释一下为什么要在顶部添加try/catch吗?不要在stage块中添加try/catch。Try/catch有助于将错误处理与常规代码区分开来。我认为海报的要点是,它不应该在出现错误后到达
echo,而“
行,因为它们的顶部有一个set-xe
;当while循环失败时,它应该退出。
[jenkins-user@jenkins ~]$ cat script.sh
#!/bin/bash
set -xe
FILE=commands.txt
echo "echos before while"
# Run the commands in the commands file
while read COMMAND
do
$COMMAND
done < $FILE
echo $?
exit 1
set -xe -o pipefail
cat $FILE | while read command; do $command ; done
bash $FILE