【问题标题】:Timeout on a Build Step of JenkinsJenkins 构建步骤超时
【发布时间】:2012-08-27 09:14:08
【问题描述】:

在 Jenkins 中,有没有办法为每个或选定的构建步骤提供不同的超时时间?
构建时插件在整个项目中提供了超时功能“如果它被卡住则中止构建”,我需要为每个步骤提供不同的超时。这样我可以让我的流程更有效率。

【问题讨论】:

    标签: jenkins build-process build-automation jenkins-plugins


    【解决方案1】:

    如果您使用 Jenkins 流水线,并且使用较新的声明式样式(具有顶级 pipeline { 元素),则有一个 timeout option 可用于整体工作或单个阶段:

    pipeline {
        agent any
    
        options {
            timeout(time: 1, unit: 'HOURS')   // timeout on whole pipeline job
        }
    
        stages {
            stage('Example') {
              options {
                  timeout(time: 1, unit: 'HOURS')   // timeout on this stage
              }
              steps {
                  echo 'Hello World'
              }
            }
        }
    }
    

    文档:https://jenkins.io/doc/book/pipeline/syntax/#options

    【讨论】:

      【解决方案2】:

      在当前版本的 Jenkins 中,可以做到这一点。点击“配置”,然后选择“构建环境”选项卡,然后设置超时。

      这是一个屏幕截图:

      【讨论】:

      • 这个功能是在哪个版本的 Jenkins 上引入的?
      • 对不起;由于我已经对我的 Jenkins 进行了更新,因此目前还不确定详细信息。但是,Jenkins (issues.jenkins-ci.org/browse/…) 中的这个已关闭问题表明 Build-timeout-plugin 在 2014 年 5 月处于活动状态。HTH。
      • 你需要安装它的插件:plugins.jenkins.io/build-timeout
      【解决方案3】:

      在管道作业中,您可以使用timeout 包装您的步骤,如下所示:

      timeout(time: 5, unit: 'MINUTES') {
         // steps to execute
      }
      

      【讨论】:

      • 超时让管道失败,还是会继续下一步?也许一个完整的例子会有所帮助。
      • 一旦超时但仍在执行任何步骤,随后的一切都将被取消,整个作业以 FAILED 状态结束。以下是它在管道脚本中的使用方式:pipeline { agent { label 'xxx' } options { timestamps(); timeout(time: 2, unit: 'HOURS') } stages { stage('Stage-One') { steps { /* one or more steps here */ } } } }
      • 如何让管道在一步超时后仍然成功?
      • 如果您需要在超时后继续执行其他步骤,您可以用 try/catch 将其包围并正常继续执行。但请记住,这只能在一个步骤内应用。示例:``` steps { try { timeout(time: 5, unit: 'MINUTES') { // 在这 5 分钟内执行的步骤 } } catch (Exception e) { // 在这里做任何你想做的事情 } // 继续在这里执行其他步骤}```
      【解决方案4】:

      这个问题最初是在 Jenkins 流水线存在之前提出的。尽管您可以继续通过 GUI 使用和配置 Jenkins,但目前建议将您的项目过渡到管道。使用流水线可以跟踪对流水线的更改,并将其存储为代码,以便在需要移动 Jenkins 服务器时轻松在任何机器上重新创建构建。

      使用管道,为构建的特定部分添加超时是微不足道的。管道语法简单易用。

      timeout(time:5, unit:'DAYS') {
          input message:'Approve deployment?', submitter: 'it-ops'
      }
      

      相关问题:How to add a timeout step to Jenkins Pipeline

      示例无耻取自:CloudBees Top 10 Best Practices for Jenkins Pipeline Plugin

      【讨论】:

        【解决方案5】:

        构建超时插件不适用于管道。参考wiki

        对于管道超时,请尝试以下操作:

        timeout(time: 30, unit: 'MINUTES') {
          node {
            sh 'foo'
          }
        }
        

        另一个帖子的类似回答: How to add a timeout step to Jenkins Pipeline

        【讨论】:

          【解决方案6】:

          据我所知,没有这样的功能。 JENKINS-8900 请求它。

          【讨论】:

            【解决方案7】:

            请为您的 Jenkins 安装 Build Timeout 插件。

            Jenkins> 管理 Jenkins> 管理插件

            在可用选项卡中搜索构建超时.. 安装它。 您会在构建环境中找到它作为“如果它被卡住则中止构建”。 设置超时策略和时间。 绝对 最后期限 松紧带 可能卡住了 没有活动

            在我的情况下,我使用了 No Activity。

            希望对你有帮助。

            【讨论】:

              【解决方案8】:

              我认为timeout command from GNU coreutils 可能是您想要的。这是假设您的构建步骤是脚本。

              【讨论】:

                【解决方案9】:

                最简单的方法(我就是这样做的)实际上是让不同的项目相互依赖并连续构建它们。它并不完美,但另一种选择是使用不同的工具/构建行为监视不同插件的执行。

                不过,这种方法还是会奏效的,尽管它确实很糟糕......

                顺便说一句,有一个不错的插件可以帮助您使用一组项目 - Build Pipeline plugin。我现在正在使用它来可视化和验证我创建的管道。真的很方便……

                【讨论】:

                  【解决方案10】:

                  如果您不想使用 Jenkins 插件并且想要使脚本或任何命令超时,那么您可以使用 Linux 内置实用程序“超时”。

                  timeout -s KILL 1m ./test
                  

                  上述命令将运行test 可执行文件1 分钟,如果它在超时后继续执行,则该命令将超时并由KILL 实用程序终止进程。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-10-21
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-01-20
                    • 2012-02-16
                    • 2011-08-26
                    相关资源
                    最近更新 更多