Jenkins - 运行 如果新工作完成,每晚工作时间长吗?

Jenkins - run long job nightly if new work done?

现在,我有两套基准测试,一套短,一套长。每个分支机构签到时的简短 运行 秒。其中设置为 运行 的是一个参数——SHORT 或 LONG。长的总是 运行 每晚在 dev 分支上。如果今天分支构建成功,如何触发其他分支构建和运行长基准?

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

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

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

如果你想 运行 那些只在晚上进行的长时间测试 - 我发现最简单的方法是复制作业并修改它,让它在晚上触发,并在正常作业之后添加额外的检查, IE。您的 post-commit 作业只做短测试,每晚触发的先做短测试,然后(如果没有错误)做长测试。

我发现这比在某些情况下链接作业增加的复杂性更容易处理,例如评估一天中的时间以跳过某些测试。

示例第一个作业在每次提交后 运行s

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 个工作更易于管理。

必须将以下作业配置为由 post 提交挂钩 夜间计时器触发。它 运行 是

的长期测试
  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'
    }
}

您可以使用 Schedule Build Plugin 来安排在短作业成功时构建长作业。

每个分支上的短作业运行s,当某个分支的构建成功时,它会安排一个带有参数的分支的长作业(在晚上)的构建,所以长作业将 运行 在这个特定的分支上。