jenkinsjenkins-pipeline

Can I augment scm in Jenkinsfile?


It's taken me ages to understand what checkout scm really means in Jenkinsfile (checkout is a function and scm is a default global variable by the way).

Now that I've understood it, I want to augment scm for example to increase the timeout for a particular checkout or to set sparseCheckoutPaths. Is this possible? If so, how?


Solution

  • For Git, checkout scm is basically equivalent to :

    checkout([
         $class: 'GitSCM',
         branches: scm.branches,
         doGenerateSubmoduleConfigurations: scm.doGenerateSubmoduleConfigurations,
         extensions: scm.extensions,
         userRemoteConfigs: scm.userRemoteConfigs
    ])
    

    If you want to add sparse checkout to the existing scm, what you would do is something like:

    checkout([
         $class: 'GitSCM',
         branches: scm.branches,
         doGenerateSubmoduleConfigurations: scm.doGenerateSubmoduleConfigurations,
         extensions: scm.extensions + [$class: 'SparseCheckoutPaths',  sparseCheckoutPaths:[[$class:'SparseCheckoutPath', path:'path/to/file.xml']]],
         userRemoteConfigs: scm.userRemoteConfigs
    ])
    

    Even better, you can define a custom step, sparseCheckout in a shared library.

    def call(scm, files) {
        if (scm.class.simpleName == 'GitSCM') {
            def filesAsPaths = files.collect {
                [path: it]
            }
    
            return checkout([$class                           : 'GitSCM',
                             branches                         : scm.branches,
                             doGenerateSubmoduleConfigurations: scm.doGenerateSubmoduleConfigurations,
                             extensions                       : scm.extensions +
                                     [[$class: 'SparseCheckoutPaths', sparseCheckoutPaths: filesAsPaths]],
                             submoduleCfg                     : scm.submoduleCfg,
                             userRemoteConfigs                : scm.userRemoteConfigs
            ])
        } else {
            // fallback to checkout everything by default
            return checkout(scm)
        }
    }
    

    Then you call it with:

    sparseCheckout(scm, ['path/to/file.xml'])