对不同的全局超时选项使用相同的jenkinsfile

nfg76nw0  于 2023-08-03  发布在  Jenkins
关注(0)|答案(1)|浏览(110)

我有一个情况,我必须运行相同的管道(一套阶段)每天和每周。但问题是超时选项。

  • 对于夜间构建,我们有严格的4小时超时
  • 对于每周构建,我们有48小时的超时(因为多次重试管道中的某些阶段)
  • 我们可以使用BUILD_TAGS来区分构建,但坚持使用全局超时选项。
  • 不想去与阶段超时选项,因为它计算甚至等待节点的时间。
pipeline {
    agent any
    options {
        // Timeout counter starts AFTER agent is allocated
        timeout(time: 4, unit: 'HOURS')
    }
    stages {
        stage('Build') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Test') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

字符串
有人试过类似的场景吗?任何指导都将不胜感激。

yrdbyhpb

yrdbyhpb1#

一旦您能够弄清楚您的作业为什么在运行--也就是说,它是每周运行还是每晚运行(或者都不是)--这就变得相当容易了。
此解决方案包括ParameterizedCron插件,用于将原因作为参数传递:

pipeline {
    agent any
    parameters {
        booleanParam(name: 'IS_NIGHTLY', defaultValue: false)
        booleanParam(name: 'IS_WEEKLY', defaultValue: false)
    }
    triggers {
        parameterizedCron("H 1 * * 1-7 % IS_NIGHTLY=true")
        parameterizedCron("H 1 * * 6 % IS_WEEKLY=true")
    }
    options {
        // Once you have indication of why your build is running:
        timeout(time: IS_NIGHTLY ? 4 : (IS_WEEKLY ? 48 : 1), unit: 'HOURS')
    }
    stages {
        stage('Build') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Test') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

字符串
另一种解决方案是在pipeline开始挖掘BuildCauses之前运行一段代码:

import groovy.transform.Field
@Field
TIMEOUT = 4
try {
    if (currentBuild.getBuildCauses()[0].shortDescription.contains("timer")) {
        TIMEOUT = 48 // deciphering between nightly and weekly left as excercise
    }
} catch (error) {
    echo error.getMessage()
}

pipeline {
    agent any
    options {
        // Timeout counter starts AFTER agent is allocated
        timeout(time: TIMEOUT, unit: 'HOURS')
// etc.

相关问题