【问题标题】:jenkins can't finish build script that executes a "while true" loopjenkins 无法完成执行“while true”循环的构建脚本
【发布时间】:2015-05-29 08:16:17
【问题描述】:

我们正在使用自制的构建服务器(基于 Ubuntu 12.04)来构建嵌入式 linux 项目。通过 ssh 登录并执行构建脚本来执行必要的构建内容,我们已经成功地使用该服务器一段时间了。

我们希望使用 jenkins 自动化构建。我们实际上认为这应该很容易,因为 jenkins 作业只需​​调用构建脚本来完成这项工作。

但是,它会在构建脚本中的某个 while 循环中失败并永远挂起。 while 循环看起来像这样(它用于接受来自 make config 的默认建议)

文件:create.sh

#!/bin/sh
[... other stuff]
echo Configure project sources ...
(while true ; do echo ; done
) | make config_config >> $WORKDIR/project.log 2>&1
echo Debug output to see that this line is reached ...
[... other stuff]

create.sh 是从其他脚本(build.sh)调用的,而该脚本又是从其他脚本(如 simple-build.sh)调用的。这是因为 create.sh 使用了一些由 build.sh 为特定构建环境设置的环境变量,而 simple-build.sh 调用 build.sh 脚本为构建服务器设置环境。因此,构建者可以简单地登录并调用“simple-build.sh”,一切都完成了,无需任何进一步的设置。

如果脚本是从 jenkins 调用的,控制台输出如下:

jenkins 控制台输出

[... other stuff]
Configure project sources ...

然后...它永远挂起并且直到在jenkins中手动中止该过程才完成。如果删除了 while 循环,例如换成一定量的睡眠和回声进入return,就可以了。但是,最好不要更改构建脚本(在脚本中多次使用相同的 while 循环方法..)

知道为什么这个while循环会造成麻烦吗?甚至是while循环还是我们在这里错过了其他东西?

【问题讨论】:

  • 它是否适用于yes ''|
  • 是的,yes 有效:D (yes '' | make config_config) >> $WORKDIR/project.log 2>&1 确实有效。感谢那。但是,为什么 while 不起作用?
  • 我不知道,但我猜while 很难被杀死。 yes 是为此任务编写的,因此它可能只是表现得更好(在其 STDOUT 关闭时退出?)。但如果我是你,我会研究一种没有任何一种的方法,例如为make config_config 设置一个变量以非交互方式运行。
  • 你正在运行无限的while循环,这真的是你想要的吗?
  • 老实说,当我在这段(遗留)代码中偶然发现这个无限循环时,我也想知道它。但是,我认为 while 循环和 yes 都会在它从第二个命令 (make) 接收到“损坏的管道”时立即终止,这将在 make 按预期终止时发生。

标签: linux bash shell ubuntu jenkins


【解决方案1】:

因为是在你的脚本中尝试“echo y”。我认为您的品牌期待 y,而您什么也没有传递。

(while true ; do echo y; done
) | make config_config >> $WORKDIR/project.log 2>&1

谢谢

【讨论】:

  • 谢谢你,但我的 make 配置实际上接受只输入一个新行,因为它将使用建议的默认设置。只有yes不行,必须是yes ''
猜你喜欢
  • 2019-04-09
  • 2013-10-30
  • 2012-07-13
  • 2023-01-14
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
相关资源
最近更新 更多