管道参数和jenkins GUI参数如何协同工作?

55ooxyrt  于 2023-05-28  发布在  Jenkins
关注(0)|答案(3)|浏览(208)

我正在使用jenkinsfile中的管道,我不确定如何正确链接Jenkins中的作业和管道。
我在我的jenkinsfile中定义了参数(一些有默认值,一些没有),并从jenkins gui的参数中初始化了它们。问题是我的管道中的参数覆盖了我的作业参数,即使管道中没有指定默认值这意味着管道覆盖了我在jenkins中的作业设置。
例如,我的一个作业被设置为使用一些特定值(所有NON-EMPTY)运行管道,如果我触发该作业,管道似乎将字段b和c的属性重置为''。
如何让管道不触及我的Jenkins作业定义?
例如,流水线中的参数:

properties([
      parameters([
        string(name: 'a',   defaultValue: 'Default A value', description: '', ),
        string(name: 'b',   description: '', ),
        string(name: 'c',   description: '', ),
       ])
])

我在www.example.com的文档中找不到任何帮助https://jenkins.io/doc/book/pipeline/syntax/#parameters-example

llew8vvj

llew8vvj1#

啊,是的,我第一次也是这样。
第一次运行管道时,jenkinsFile DSL作业定义几乎覆盖了您通过GUI输入的整个作业定义。这尤其会影响参数。
因此,请确保您在Jenkinsfile中准确地定义了参数,然后运行一次作业,GUI将具有相同的参数配置,因此当您再次运行时,它将要求参数并使用您在DSL中指定的默认值。没什么了。
是的,每次修改DSL中的参数都要运行两次,这很烦人。但是如果你考虑到这个作业必须执行才能评估DSL,那么这是有意义的,但是首先它需要请求参数,如果你通过UI定义了一些参数,在它检查和评估DSL之前……

dgtucam1

dgtucam12#

这个问题可以通过添加一个特殊的参数来解决,以避免默认值被覆盖。下面是示例代码。

if (!params.__INIT__) { // this value will be true once parameters get initialized
    properties([ parameters([
            string(name: 'SOURCE_URL', trim: true),
            string(name: 'TARGET_URL', trim: true),

            string(name: 'DEPLOY_URL', trim: true),
            credentials(name: 'DEPLOY_KEY', required: true ),

            string(name: 'BUILD_NODE', trim: true),

            booleanParam(name: '__INIT__', defaultValue: true, description: "Uncheck this field in configuration page and run this job once if you want to re init parameter."),
    ]) ])
    return // exit 
}

// Your task stars from here

通过这种方式,参数将不会再次初始化,因为__INIT__已被设置为true。另一方面,如果更新脚本并更改某些参数,则只需取消选中__INIT__字段即可运行作业。

hjqgdpho

hjqgdpho3#

老问题了,现在可能有一些更好的解决方案,但我没有找到它们,所以无论如何都要发布这个,以防它有帮助。
@link69的回答真的很好,让我想到了一些更高级的东西,
这允许选择用户提供的值是否被存储为默认值。
在我这边,有一些参数我希望是“一次性的”,例如“调试构建”,而我希望能够从UI设置一些持久的参数(例如要使用的git分支)。
主要缺点是管道不知道参数是从项目的“配置”页面还是在“使用参数构建”中修改的,并且在两种情况下都将值保存为“默认值”。我也不喜欢为parameters块中的每个参数重复两次参数名。

// Update parameters[paramName] with defaultValue if paramName key is not present,
// Return the default value
def <T> T updateMapReturnDefault(Map parameters, String paramName, T defaultValue)
{
    if (!parameters.containsKey(paramName))
        parameters[paramName] = defaultValue

    return defaultValue
}

// Update parameters[paramName] with defaultValue if paramName key is not present,
// Return the value read from the map if present, the default value otherwise
def <T> T updateMapReturnValue(Map parameters, String paramName, T defaultValue)
{
    if (!parameters.containsKey(paramName))
        parameters[paramName] = defaultValue

    return parameters[paramName]
}

def call(Map config) {
    node {
        // Copy params map to allow modifying it
        userParams = new HashMap(params)

        properties([
            parameters([
                // Value will be stored as default on each build
                string(name: "GIT_BRANCH", defaultValue: updateMapReturnValue(userParams, "GIT_BRANCH", "main")),
                // Value will be reset on each build
                booleanParam(name: "DEBUG_BUILD", defaultValue: updateMapReturnDefault(userParams, "DEBUG_BUILD", false)),
                // Set JUST_UPDATE_PARAMETERS to true to update the parameters list and exit
                // True by default so that the first build just updates the parameters
                booleanParam(name: "JUST_UPDATE_PARAMETERS", defaultValue: updateMapReturnValue(userParams, "JUST_UPDATE_PARAMETERS", true)),
            ])
        ])

        if (userParams.JUST_UPDATE_PARAMETERS) {
            stage("Update pipeline parameters") {
                println("JUST_UPDATE_PARAMETERS is set, not building")
                currentBuild.displayName = "parameters update"
                return
            }
        }

        stage("build") {
            println("Build started, branch ${userParams.GIT_BRANCH}, debug_build: ${userParams.DEBUG_BUILD}")
        }
    }
}

相关问题