如何在Jenkins multibranch管道中调度具有特定参数的作业

J4N*_*J4N 10 jenkins jenkins-pipeline multibranch-pipeline

我们在Jenkins上有2个FreeStyle项目:

一个用于生成构建(每日构建+手动构建),另一个用于执行测试.

我们正在转向jenkins上的Multibranch管道,所以我的理解是每个存储库有一个项目,我们应该使用选项来实现不同的行为.

所以我可以创建参数,以指示我们是否要运行测试,如果我们想要构建设置,那部分我就可以了.

我的问题是我需要默认情况下,测试不会执行(因为它们需要花费大量时间来生成,而且我不希望开发人员错误地只选中"执行测试"选项.

我需要在夜间执行每日构建时检查此选项.

那2个问题:

  1. 如何安排?
  2. 如何提供此计划使用的参数值?

Vit*_*nko 6

您可以创建一个单独的多分支作业,该作业将按计划运行,并触发覆盖所有必需参数的主作业。它看起来像这样

pipeline {
    agent any
    triggers {
        pollSCM('0 0 * * *')
    }
    stages {
        stage('Triggering the main job') {
            steps {
                build job: "main/${BRANCH_NAME.replace('/', '%2F')}", 
                      parameters: [string(name: 'RUN_TESTS', value: 'true')]
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您应该将此文件与主文件一起放入Jenkinsfile存储库,并配置单独的多分支管道作业以使用此文件。


met*_*ain 5

为了在同一个工作中保持这一点,需要一些常规的编码。由于您使用 MultiBranch 管道,这一切都可以存在于您的Jenkinsfile

首先,像 Vitalii 提到的那样设置你的 cron,这将按计划启动工作。

properties([
    pipelineTriggers([cron('0 0 * * *')])
])
Run Code Online (Sandbox Code Playgroud)

接下来,当此作业被计划触发时,我们要调整其运行的参数。所以首先我们需要检查是什么导致了构建。这可能需要安全脚本批准。

List causes = currentBuild.rawBuild.getCauses().collect { it.getClass().getCanonicalName().tokenize('.').last() }
Run Code Online (Sandbox Code Playgroud)

如果这包含'TimerTriggerCause'那么我们要更新参数。

if (causes.contains('TimerTriggerCause') { 
    setBooleanParam("EXECUTE_TESTS", true)
}
Run Code Online (Sandbox Code Playgroud)

我们为此在共享库中编写了一个函数,如果您愿意,可以将它放在同一个 Jenkinsfile 中(在管道逻辑之外的底部):

/**
 * Change boolean param value during build
 *
 * @param paramName new or existing param name
 * @param paramValue param value
 * @return nothing
 */
Void setBooleanParam(String paramName, Boolean paramValue) {
    List<ParameterValue> newParams = new ArrayList<>();
    newParams.add(new BooleanParameterValue(paramName, paramValue))
    try {
        $build().addOrReplaceAction($build().getAction(ParametersAction.class).createUpdated(newParams))
    } catch (err) {
        $build().addOrReplaceAction(new ParametersAction(newParams))
    }
}
Run Code Online (Sandbox Code Playgroud)

让工作照常进行。当它开始评估 params.EXECUTE_TESTS 时,这现在将是 true(而不是默认的 false)。

注意:可能需要为值导入模型

import hudson.model.BooleanParameterValue
Run Code Online (Sandbox Code Playgroud)

将所有这些放在一起(只需将各个部分快速拼凑起来以获得整体图),您的 jenkinsfile 最终会是这样的

#!groovy
import hudson.model.BooleanParameterValue


List paramsList = [
    choice(name: 'ACCOUNT_NAME', choices: ['account1', 'account2'].join('\n'), description: 'A choice param'),
    string(name: 'PARAM', defaultValue: 'something', description: 'A string param'),
    booleanParam(defaultValue: false, name: 'EXECUTE_TESTS', description: 'Checkbox'),
]

properties([
    buildDiscarder(logRotator(numToKeepStr: '20')),
    pipelineTriggers([cron('0 18 * * *')]), // 4am AEST/5am AEDT
    disableConcurrentBuilds(),
    parameters(paramList)
])


ansiColor {
    timestamps {
        node {
            try {
                causes = currentBuild.rawBuild.getCauses().collect { it.getClass().getCanonicalName().tokenize('.').last() }
                if (causes.contains('TimerTriggerCause') { 
                    setBooleanParam("EXECUTE_TESTS", true)
                }
                stage('Do the thing') {
                    // Normal do the things like build
                }
                stage('Execute tests if selected') {
                    if (params.EXECUTE_TESTS == true) {
                        // execute tests
                    } else {
                        echo('Tests not executed (Option was not selected/False)')
                    }
                }
            } catch (err) {
                throw err
            } finally {
                deleteDir()
            }
        }
    }
}

/**
 * Change boolean param value during build
 *
 * @param paramName new or existing param name
 * @param paramValue param value
 * @return nothing
 */
Void setBooleanParam(String paramName, Boolean paramValue) {
    List<ParameterValue> newParams = new ArrayList<>();
    newParams.add(new BooleanParameterValue(paramName, paramValue))
    try {
        $build().addOrReplaceAction($build().getAction(ParametersAction.class).createUpdated(newParams))
    } catch (err) {
        $build().addOrReplaceAction(new ParametersAction(newParams))
    }
}
Run Code Online (Sandbox Code Playgroud)