詹金斯:只有在其他工作干净的情况下才能运行

时间:2017-10-20 19:36:46

标签: jenkins

我有一整套单元测试我想在Jenkins每天一夜之间运行,但前提是我的应用程序在另一个工作中正确构建。我不希望单元测试在一天中触发,因为提交已添加到应用程序中。

我该如何配置?重申:有两个Jenkins工作:

A和B:

A运行每个签到,除非B正在运行,在这种情况下它等待B。

B在午夜运行,IFF A处于良好状态。如果A正在运行,则B等待A。

我已将A设置为“A运行每次检查。”

4 个答案:

答案 0 :(得分:3)

我假设您正在使用Jenkins管道。可能有很多方法,但我会通过在 JOB B 中添加一个新阶段来解决这个问题,该阶段会检查 JOB A <的状态/ strong>和用于检查状态的实用程序功能。

stage('check Job A status'){

        // If A is running, B waits for A.

        if(checkStatus() == "RUNNING" ){
            timeout(time: 60, unit: 'MINUTES') {
            waitUntil {
                 def status = checkStatus()
                 return  (status == "SUCCESS" || status == "FAILURE" || status == "UNSTABLE" || status == "ABORTED")
          }
        }
        }

        // Proceed with B, only when A is in a good state

        if( checkStatus() != "SUCCESS" ){
            error('Stopping Job B becuase job A is not successful.')
        }
}


def checkStatus() {
        def statusUrl = httpRequest "https://jenkins.example.com/job/${job-A-Name}/lastBuild/api/json"
        def statusJson = new JsonSlurper().parseText(statusUrl.getContent())

        return statusJson['result']       

}

答案 1 :(得分:2)

我的回答在这里晚了一点(抱歉:-7),但是一个有用的问题却没有正确回答(抱歉,不是您的错,我/我们花了几年时间才找到最好的不同方法这样的操作(最初我有一些构建后的groovy和其他脚本来执行一些有趣的事情,例如触发其他工作))。实际上,詹金斯对于需要相互交互的工作有相当灵活的方法选择。

有一个内置的“构建后动作:构建其他项目”,并且可以使用几个插件。 “构建后操作:构建其他项目”可能是最合适的。而且“可锁定资源插件”可用于使作业互斥。

*最简单的答案:*

  1. 安装可锁定资源插件并添加可锁定资源“ build_or_test”,并将作业A和B配置为锁定该资源。

  2. 配置构建作业A,添加构建后操作:构建其他项目 如果作业A稳定,则构建作业B。

*有用的内置和插件列表:*

使用FSTrigger插件也很有用,构建作业或其他作业可能会生成日志或图像文件或测试报告。这些文件或目录出现或更新时,可以触发作业运行。使用此方法,可以使用远程jenkins或jenkins外部的作业来触发作业。

  1. 内置于构建后操作中: 建立其他项目

    * Trigger only if build is stable   
    * Trigger even if the build is unstable 
    * Trigger even if the build fails   
    
  2. BuildResultTrigger Plug-in- 该插件可以监视其他作业的构建结果。 类似于“构建后操作:构建其他项目”,仅在作业配置顶部作为cron计划的触发器。

  3. Filesystem Trigger Plug-in- 该插件使监视文件夹中的一个文件或一组文件的更改成为可能。

  4. Parameterized Trigger Plug-in(添加了构建后操作: 触发其他项目上的参数化构建) 类似于“构建后操作:构建其他项目,但例如在parameters.ini样式文件或布尔值或其他参数中将构建信息从一个作业传递到另一个作业很方便。

  5. Lockable Resources Plug-in 该插件允许定义可被构件锁定的外部资源(例如打印机,电话,计算机)。如果构建需要已锁定的外部资源,它将等待该资源释放。

答案 2 :(得分:1)

在我的头顶,我想不出一种方法可以完全按照自己的意愿行事。但那可能是因为它可能不是处理它的最佳方式。

在作业A中,除非构建成功,否则您可能不应该将工件部署/传递到B将要查找的位置。然后B将始终与A的成功构建运行。

但是如果不了解整个设置或环境,我就无法评论什么是“正确”。但也许你需要重新思考这个问题?

答案 3 :(得分:1)

您可以在作业A完成时发布“状态”。在源代码仓库中,甚至在DB中说出属性文件。 该值可以是布尔值。如果作业A正在运行,则值将为false,直到作业A成功构建。 现在,当Job B被触发时,首先检查上述值是否为真。

似乎没有插件可以支持这一点。一旦作业A完成,大多数插件将触发作业B(即它将监视作业A的状态)。