詹金斯(Jenkins)-如果完成新工作,晚上应长期工作?

时间:2019-06-04 21:15:39

标签: jenkins triggers jenkins-pipeline multibranch-pipeline

现在,我有两套基准,短期基准和长期基准。简短的每个分支都在签入中运行。要运行的设置是一个参数-SHORT或LONG。长的文件总是在dev分支上每晚运行。如果今天成功建立分支,我如何触发其他分支来构建和运行长期基准测试?

3 个答案:

答案 0 :(得分:2)

如果您只想在晚上进行长时间的测试-我发现最简单的方法是复制作业并对其进行修改,使其在夜间触发,并在正常作业后添加其他检查,即您提交后的工作只需进行简短测试,每晚触发的工作首先进行简短测试,然后再进行长期测试(如果没有错误)。

我发现,在某些情况下(例如评估一天中的时间以跳过某些测试),链接工作的复杂性要容易得多。

示例1st作业在每次提交后运行

node() {
  stage('Build') {
    // Build
  }
  stage('Short Test') {
    // Short Test
  }
}

第二个每晚触发的工作

node() {
  stage('Build') {
    // Build
  }
  stage('Short Test') {
    // Short Test, fail the build here when not successful
  }
  stage('Long Tests')
    // Long Test, runs only when short test successful
  }
}

编辑

一个解决方案可以将所有工作全部完成,但是它增加了很多复杂性,并使一些后续用例难以集成,例如,集成测试分支的通知不同,构建持续时间的跟踪等。我仍然发现更多可以将其拆分为2个工作。

必须将以下作业配置为由提交后挂钩和一个夜间计时器触发。

时,它将运行长时间测试
  1. 最后一个版本更年轻,然后设置(您不希望它从前一个晚上触发),
  2. 上次运行成功(不想对已损坏的版本进行长时间测试),并且
  3. 是由上述计时器触发的(不想在签入时触发)。
def runLongTestMaxDiffMillis = 20000
def lastRunDiff = (currentBuild.getStartTimeInMillis().toInteger() - currentBuild.getPreviousBuild().getStartTimeInMillis().toInteger())

def lastBuildTooOld = (lastRunDiff > runLongTestMaxDiffMillis)
def isTriggeredByTimer = currentBuild.getBuildCauses('hudson.triggers.TimerTrigger$TimerTriggerCause')
def lastBuildSuccessful = (currentBuild.getPreviousBuild().getResult() == 'SUCCESS')

def runLongTest = (!lastBuildTooOld && isTriggeredByTimer && lastBuildSuccessful)

node() {
    if (runLongTest) {
        println 'Running long test'
    } else {
        println 'Skipping long test'
    }
}

答案 1 :(得分:1)

您可以创建另一个管道,该管道使用LONG参数调用参数化管道,例如:

stage('long benchmark') {
    build job: 'your-benchmark-pipeline', parameters: [string(name: 'type', value: 'LONG')]
}

在配置此新管道时,您可以在Build after other projects are built部分的Build Triggers复选框中打钩,并选择在成功完成测试后应该触发哪些短基准测试(默认行为)。

答案 2 :(得分:0)

短作业成功后,您可以使用Schedule Build Plugin安排长作业的构建。

短作业在每个分支上运行,当某个分支的构建成功时,它将安排带有参数分支的长作业的构建(夜间),因此长作业将在该特定分支上运行。