如何为特定的 Jenkins 作业设置 `killSoftly`?

11

我的Jenkins构建在构建和后构建步骤之间卡住了。

控制台输出显示有6分钟的等待时间(但我曾经看到过长达1小时的等待时间):

10:53:26 BUILD FAILED in 1m 7s
10:53:26 4 actionable tasks: 4 executed
10:53:26 Build step 'Invoke Gradle script' changed build result to FAILURE
10:53:26 Build step 'Invoke Gradle script' marked build as failure
11:09:29 [CucumberReport] Using Cucumber Reports version 4.9.0

我发现这个这个问题类似,它们说解决方法是在jenkins.xml中设置-DSoftKillWaitSeconds=0

然而,我需要一种仅针对特定作业设置选项的方法,而不会影响全局Jenkins设置(我不想干扰其他项目)。

编辑:

当我手动中止作业时,在[CucumberReport]步骤之前,Cucumber报告仍将生成。

我还在“构建环境”选项中勾选了如果卡住则中止构建复选框,超时策略设置为无活动(超时秒数=2)。

当我使用这些设置构建项目时,构建将失败,并显示“0秒后中止”在“构建历史记录”中显示,但控制台输出将保持不变。 (没有改变,Cucumber报告将在一定的超时时间后生成)。


你想通过参数实现什么目标?也许有更简单的解决方案。 - Michael Kemmerzell
我想缩短构建阶段后的等待时间。从控制台输出可以看出,在构建和后构建步骤之间有6分钟的等待时间。 - Mate Mrše
你能提供一些你的流程的部分吗?我怀疑 Jenkins 不仅仅是卡住了——这里一定发生了什么事情。 - Michael Kemmerzell
你能更具体地说明哪些流程部分是感兴趣的吗?这样我就可以编辑和分享一些内容,因为我无法分享实际的代码。 - Mate Mrše
你能不能在你的管道中设置一个timeout选项?你应该发布一个简化版本的管道。很难"猜测"可能出了什么问题。此外,这个问题可能更适合发布在 https://devops.stackexchange.com/ 上。 - tftd
@tftd 我是 Jenkins 的新手,正在使用自由风格项目,所以不太确定你所说的“pipe”具体指什么。 - Mate Mrše
2个回答

4

无法为SoftKillWaitSeconds选择特定于工作的值(该值是从Jenkins核心派生的,在那里作业名称未知的)。

我的建议是在您的作业本身中修复中止处理,使其不依赖于“软终止超时”。 如果您正在运行Unix-ish系统,则可以通过在新进程组中运行作业(bash中的set -m)并设置适当的退出陷阱来确保此操作。


由于我对Jenkins还不熟悉,您能详细解释一下“在新进程组中运行作业(在bash中设置-m)并(例如)设置适当的退出陷阱”吗? - Mate Mrše
这与Jenkins本身无关。如果您的工作涉及“执行Shell”构建步骤(或者您可以更改它以便进行此操作),则可以使用此方法。然后使用“set -m”创建一个新的进程组,并使用像这里所示的陷阱来确保组中的所有进程都将被杀死。 - Alex O

3
我们正在使用Build-timeout插件,将超时策略设置为无活动绝对时间,以杀死卡住的任务。对于自由风格项目,这对我来说是一个不错的方法。 你的构建被“0秒后中止”的原因很可能是存在未完成的子进程。 来自文档: 因为Java只允许在线程的一组固定位置中断,取决于构建挂起的方式,终止操作可能会失败。例如,
  • 如果Jenkins正在等待子进程完成,则可以立即终止。
  • 如果Jenkins陷入无限循环中,则永远无法终止。
  • 如果Jenkins在Java VM内执行网络或文件I / O(例如漫长的文件复制或SVN更新),则无法终止。

您可以尝试绝对时间策略。您可以定义一个全局变量,以便不需要在作业中重复超时值:

  1. 转到“管理Jenkins”>“配置系统”。
  2. 在“全局属性”中勾选“环境变量”。
  3. 添加环境变量name="GLOBAL_TIMEOUT_MINUTES" value="20"。
  4. 转到项目的配置页面。
  5. 在“构建环境”中勾选“如果卡住,则终止构建”。
  6. 为“超时策略”选择“绝对时间”。
  7. 当然,其他策略也适用。
  8. 设置“超时时间”为"${GLOBAL_TIMEOUT_MINUTES}"。
  9. 设置超时操作“终止构建”。

如果这不起作用,您可以尝试查看日志https://your-jenkins-server/log或线程转储。 挂起可能是由插件的新/旧版本引起的。尝试找出未完成的子进程。逐个禁用后构建操作,以找出可能导致问题的操作。 你可以看看https://superuser.com/questions/1401879/debugging-what-happens-when-a-jenkins-build-unexpectedly-pauses-or-hangs


赞同有用的信息,但是它并没有解决我的问题。我已经尝试了构建超时插件,但是没有成功。 - Mate Mrše

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接