grep in bash script + Jenkins



我有一个在bash脚本中工作的grep命令:

if grep 'stackoverflow' outFile.txt; then
 exit 1
fi

这在我的主机上运行时很好。然而,当我从Jenkins构建步骤调用它时,它每次都退出0,没有看到'stackoverflow'。出了什么问题?

添加以下行作为您的" Execute shell ";命令

#!/bin/sh

grep命令在没有找到匹配项时以非零代码退出,这导致Jenkins将作业标记为失败。见下文.

在"执行shell"的帮助部分

运行用于构建项目的shell脚本(默认为sh,但这是可配置的)。脚本将以工作空间作为当前目录运行。输入shell脚本的内容。如果您的shell脚本没有像#!/bin/sh -,那么将使用配置在系统范围内的shell,但是您也可以使用头行来用另一种语言编写脚本(如#!/bin/perl)或控制shell使用的选项。

默认情况下,shell将使用"-ex"选择。因此,在执行之前打印所有命令,如果任何命令以非零退出代码退出,则构建被认为是失败的。再次添加#!/bin/…行来更改此行为。

作为最佳实践,尽量不要在这里放置长shell脚本。相反,考虑在SCM中添加shell脚本,并简单地从Jenkins调用该shell脚本(通过bash -ex myscript.sh或类似的东西),这样您就可以跟踪shell脚本中的更改。

我对这个问题的答案有点困惑!对不起,这个问题的答案不正确。这个问题很好/有趣,因为如果grep不成功(这可能是意外的),脚本中的普通grep确实会导致脚本失败退出,而if中的grep不会导致失败退出。

对于问题中显示的示例,如果grep命令成功运行(文件存在)并且如果在文件中找到字符串,则exit 1将完成。 (grep命令返回0退出码)。

@Gonen关于添加'ls -l outFile.txt'的评论应该被跟进,看看失败的真正原因是什么。

TLDR;if捕获if子句中命令的退出代码:

如果grep命令在jenkins的if语句中"失败"(没有匹配或错误),则不会导致jenkins脚本停止。然而,如果grep命令不在if中失败,则会导致jenkins停止并以fail退出。

在shell中,if语句中的命令的退出/返回代码处理是不同的。If捕获返回代码,无论命令是成功还是失败,If都会将成功返回到$0(在If之后)(并在If或else中执行操作)。

如果列表;然后列出;[elif list;然后列出;)……[else list;) fi执行if列表。如果退出状态为0,则执行then列表。否则,将依次执行每个elif列表,并且如果它的退出状态为零,则执行相应的then列表命令完成。否则,执行else列表,if礼物。退出状态为最后一条命令的退出状态

为了说明这一点,请尝试以下操作(在bash或sh中得到相同的结果):
$ if grep foo bar ; then echo got it; fi; echo $?
grep: bar: No such file or directory
0
$ touch bar
$ if grep foo bar ; then echo got it; fi; echo $?
0
$ echo foo >bar
$ if grep foo bar ; then echo got it; fi; echo $?
foo
got it 
0
$ if grep foo bar ; then echo gotit; grep gah mah; fi; echo $?
foo
gotit
grep: mah: No such file or directory
2

我认为你的脚本有错误。你必须在'if'块后面加上'fi':

if grep 'stackoverflow' outFile.txt; then
 exit 1
fi

如果两者完全相同,它应该工作。您当前的目录或用户在这两个环境中是否不同?您可能无法读取文件

最新更新