Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Jenkins中,Execute Shell如何/何时将构建标记为失败?_Shell_Unix_Jenkins_Build_Hudson - Fatal编程技术网

在Jenkins中,Execute Shell如何/何时将构建标记为失败?

在Jenkins中,Execute Shell如何/何时将构建标记为失败?,shell,unix,jenkins,build,hudson,Shell,Unix,Jenkins,Build,Hudson,我在寻找答案时发现的恐怖故事 好的,我有一个.sh脚本,它几乎完成了Jenkins应该做的所有事情: 从SVN中检出源 建设项目 部署项目 自净 因此,在Jenkins中,我只需要通过在executeshell命令中运行脚本来“构建”项目。 脚本已运行(源代码已下载,项目已生成/部署),但随后它将生成标记为失败: 生成步骤“执行shell”将生成标记为失败 即使脚本已成功运行!我尝试用以下命令关闭脚本: 退出0(仍将其标记为失败) 退出1(按预期将其标记为失败) 完全没有退出命令(将其标记

我在寻找答案时发现的恐怖故事

好的,我有一个.sh脚本,它几乎完成了Jenkins应该做的所有事情:

  • 从SVN中检出源
  • 建设项目
  • 部署项目
  • 自净
因此,在Jenkins中,我只需要通过在executeshell命令中运行脚本来“构建”项目。 脚本已运行(源代码已下载,项目已生成/部署),但随后它将生成标记为失败: 生成步骤“执行shell”将生成标记为失败 即使脚本已成功运行!我尝试用以下命令关闭脚本:

  • 退出0(仍将其标记为失败)
  • 退出1(按预期将其标记为失败)
  • 完全没有退出命令(将其标记为失败)

Execute Shell何时、如何以及为什么将我的构建标记为失败?

首先,将鼠标悬停在下面的灰色区域上。不是答案的一部分,但绝对必须说:

如果您有一个单独执行“签出、构建、部署”的shell脚本,那么为什么要使用Jenkins?你在前面提到了詹金斯的所有特征,这些特征使它成为现在的样子您还可以使用cron或SVN post-commit钩子直接调用脚本。Jenkins执行SVN签出本身是至关重要的。它只允许在发生更改时触发构建(或者在计时器上,或者手动,如果您愿意的话)。它跟踪构建之间的更改。它显示了这些更改,因此您可以看到哪个构建是针对哪个更改集的。当提交者的更改导致构建成功或失败时,它会向提交者发送电子邮件(同样,根据您的喜好进行配置)。当提交人的修复修复了失败的构建时,它将向提交人发送电子邮件。越来越多。Jenkins对工件进行归档还可以使它们在每次构建时直接可用。虽然不像SVN签出那么重要,但这再次成为Jenkins不可或缺的一部分。部署时也是如此。除非只有一个环境,否则部署通常发生在多个环境中。Jenkins可以通过使用升级来跟踪在哪个环境中部署了特定的构建(具有特定的SVN更改集)。你正在放弃这一切。听起来你好像被告知“你必须使用詹金斯”,但你并不是真的想这样做,你这样做只是为了让你的老板远离你,只是为了勾选“是的,我使用过詹金斯”

简而言之,Jenkin的执行Shell构建步骤的last命令的退出代码决定了构建步骤的成功/失败<代码>0-成功,
其他任何操作
-失败。 注意,这决定了构建步骤的成功/失败,而不是整个作业运行。整个作业运行的成功/失败可能进一步受到多个构建步骤、构建后操作和插件的影响

您已经提到了
构建步骤'executeshell'将构建标记为失败
,因此我们将只关注单个构建步骤。如果执行shell构建步骤只有一行调用shell脚本,那么shell脚本的退出代码将决定构建步骤的成功/失败。如果在执行shell脚本后,有更多的行,请仔细检查它们,因为它们可能会导致失败

最后,请阅读这里的内容。这与您的问题没有直接关系,但请注意关于Jenkins启动执行Shell构建步骤的部分,作为带有
/bin/sh-xe的Shell脚本

-e
意味着shell脚本将失败退出,即使只有一个命令失败,如果您对该命令执行错误检查(因为脚本在进行错误检查之前退出)。这与shell脚本的正常执行相反,shell脚本通常打印失败命令的错误消息(或将其重定向到null并通过其他方式处理),然后继续执行

要避免这种情况,请将
set+e
添加到shell脚本的顶部

既然你说你的脚本完成了它应该做的一切,那么失败的命令很可能就在脚本的末尾。也许是最后的回音?或者某个地方的文物复制品?没有看到完整的控制台输出,我们只是猜测

请发布作业运行的控制台输出,最好是shell脚本本身,然后我们可以准确地告诉您哪一行失败。

简单明了:

如果Jenkins看到构建步骤(也是一个脚本)以非零代码退出,则该构建将被标记为红色球(=失败)

具体原因取决于构建脚本

我从另一个角度写了一些类似的东西,但无论如何读一下可能会有所帮助:
对您的问题的简单而简短的回答是

请在“执行shell”构建步骤中添加以下行

#!/bin/sh
现在让我向您解释为什么我们需要这一行来执行“executeshell”构建作业

默认情况下,Jenkins接受
/bin/sh-xe
,这意味着
-x
将打印每个命令。另一个选项是
-e
,当任何命令退出时(当任何命令失败时)退出代码为非零,shell将立即停止运行脚本


因此,通过添加
#/bin/sh
将允许您无需任何选项即可执行。

在我看来,关闭shell的
-e
选项是一个非常糟糕的主意。最终,由于磁盘空间不足或网络错误等暂时情况,脚本中的一个命令将失败。如果没有
-e
,詹金斯不会注意到,并会快乐地继续前进。如果您已设置Jenkins进行部署,则可能会导致推送错误代码
grep foo bar; if [ $? == 0 ]; then ...    -->   if grep foo bar; then ...
grep foo bar || ret=$?
$BUILD_NUMBER or ${BUILD_NUMBER}
set BUILDNO = $BUILD_NUMBER
$BUILDNO