繁体   English   中英

bash脚本中的grep + Jenkins

[英]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脚本(默认为sh,但这是可配置的)。 该脚本将以工作空间作为当前目录运行。 输入您的shell脚本的内容。 如果您的shell脚本没有像#!/ bin / sh这样的标题行,那么将使用在系统范围内配置的shell,但是您也可以使用标题行以另一种语言编写脚本(例如#!/ bin / perl)。 )或控制shell使用的选项。

默认情况下,将使用“ -ex”选项调用该外壳程序。 因此,所有命令都将在执行前打印出来,如果任何命令以非零退出代码退出,则构建被视为失败。 同样,添加#!/ bin / ...行以更改此行为。

作为最佳实践,请尽量不要在此处放置较长的shell脚本。 相反,可以考虑在SCM中添加shell脚本,然后只需通过jash从Jenkins调用该shell脚本(通过bash -ex myscript.sh或类似方法),以便您可以跟踪shell脚本中的更改。

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

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

@Gonen添加“ ls -l outFile.txt”的评论应该被跟踪,以了解失败的真正原因是什么。

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

在jenkins的if语句内“失败”(不匹配或错误)的grep命令不会导致jenkins脚本停止。 而没有在if中失败的grep命令将导致jenkins停止并失败退出。

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

来自man bash:

如果列表; 然后列出; [elif list; 然后列出; ] ... [else list; ] fi执行if列表。 如果其退出状态为零,则执行then列表。 否则,依次执行每个elif列表,如果其退出状态为零,则执行相应的then列表,命令完成。 否则,将执行else列表(如果存在)。 退出状态是最后执行的命令的退出状态, 如果没有条件测试为true ,则为零

为了说明,请尝试以下操作(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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM