从作业管道中的 jenkins-library 调用闭包

Calling a Closure from jenkins-library inside job's pipeline

我有 jenkins_library 和 handleCheckout.groovy 处理结帐:

def handleCheckout = {
    if (env.gitlabMergeRequestId) {
        sh "echo 'Merge request detected. Merging...'"
        checkout([
                $class           : 'GitSCM',
                branches         : [[name: "${env.gitlabSourceNamespace}/${env.gitlabSourceBranch}"]],
                extensions       : [
                        [$class: 'PruneStaleBranch'],
                        [$class: 'CleanCheckout'],
                        [
                                $class : 'PreBuildMerge',
                                options: [
                                        fastForwardMode: 'NO_FF',
                                        mergeRemote    : env.gitlabTargetNamespace,
                                        mergeTarget    : env.gitlabTargetBranch
                                ]
                        ]
                ],
                userRemoteConfigs: [
                        [
                                credentialsId: env.CREDENTIALS_ID,
                                name         : env.gitlabTargetNamespace,
                                url          : env.gitlabTargetRepoSshURL
                        ],
                        [
                                credentialsId: env.CREDENTIALS_ID,
                                name         : env.gitlabSourceNamespace,
                                url          : env.gitlabSourceRepoSshURL
                        ]
                ]
        ])

    } else {
        sh "echo 'No merge request detected. Checking out current branch'"
        checkout([
                $class           : 'GitSCM',
                branches         : [[name: "${env.sourceBranch}"]],
                extensions       : [
                        [$class: 'PruneStaleBranch'],
                        [$class: 'CleanCheckout']
                ],
                userRemoteConfigs: [[credentialsId: env.CREDENTIALS_ID, url: env.GIT_URL]]
        ])
    }
}

我试图在导入 jenkins-library 之后从管道调用它:

@Library('jenkins-util-lib') _

 stage('prepare') {
            sh "env | sort"
            handleCheckout()

以错误结束:

No signature of method: handleCheckout.call() is applicable for argument types: () values: []
Possible solutions: wait(), any(), wait(long), main([Ljava.lang.String;), any(groovy.lang.Closure), each(groovy.lang.Closure)

在管道内声明和调用方法时效果很好。

请问你的设置好吗

1) handleCheckout.groovy 必须位于 vars 文件夹中(必须检查) 2)handleCheckout.groovy必须有def call(你得改) 3) 在你的管道中,你必须 运行 Jenkinsfilename(),在你的情况下 handleCheckout

以防万一文档 - https://jenkins.io/doc/book/pipeline/shared-libraries/

因此您必须将过程名称更改为 def call 并检查 Jenkins 文件位置(必须在共享库内的 vars 文件夹中)