Jenkinsfile流水线中的SparseCheckout

12
在Jenkinsfile中,我通过 SparseCheckoutPaths 指定了要检出的文件夹名称,但我得到的是整个分支的检出。
   checkout([$class: 'GitSCM', 
       branches: [[name: '*/branchName']],
       extensions: [[$class: 'SparseCheckoutPaths', path: 'FolderName']],
       userRemoteConfigs: [[credentialsId: 'someID',
       url: 'git@link.git']]])
3个回答

21

这里是我自己提出问题的答案。为了解释它的工作原理,Git客户端有一个名为sparsecheckout的标志/配置,它负责这种类型的checkout,此外还需要一个名为sparse-checkout的文件。想要了解更多信息,请查看这里

我的问题在于Jenkinsfile的语法,正确的语法如下:

checkout([$class: 'GitSCM', 
    branches: [[name: '*/branchName']],
    doGenerateSubmoduleConfigurations: false,
    extensions: [
        [$class: 'SparseCheckoutPaths',  sparseCheckoutPaths:[[$class:'SparseCheckoutPath', path:'folderName/']]]
                ],
    submoduleCfg: [],
    userRemoteConfigs: [[credentialsId: 'someID',
    url: 'git@link.git']]])

了解更多信息,请点击Github链接


1
谢谢@HAr,这非常有帮助。您是否知道是否可以同时进行稀疏检出并排除子目录? - Bernie Lenz
假设我在仓库中有一个文件夹结构 - src/pub/java/app/,而在我的工作区中,我只需要app/的内容。但是我在我的工作区中得到了整个路径。如何在不需要在管道中添加dir(src/pub/java/app)的情况下直接将app/的内容获取到我的Jenkins工作区? - srikar kulkarni
至少对我来说,这仍然首先会获取完整的存储库,然后在新克隆的存储库中设置稀疏检出设置。 - sinned

4

您可以在共享库中定义一个自定义步骤sparseCheckout,该步骤添加到现有的checkout scm之上。

vars/sparseCheckout.groovy:

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)
    }
}

然后你可以这样调用它:

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

1
你的语法看起来不错,但是如 "jenkinsci/plugins/gitclient/CliGitAPIImpl.java" 所示,你是否指定了正确的配置?
private void sparseCheckout(@NonNull List<String> paths) throws GitException, InterruptedException {

    boolean coreSparseCheckoutConfigEnable;
    try {
        coreSparseCheckoutConfigEnable = launchCommand("config", "core.sparsecheckout").contains("true");
    } catch (GitException ge) {
        coreSparseCheckoutConfigEnable = false;
    }

换句话说,在你要检出的仓库中,git config core.sparsecheckout是否等于true

感谢您的回复。由于结帐将在 Jenkins 的一个从节点上完成,所以我不确定如何设置此配置标志。据我所记得,git 配置标志只能在本地定义,我们无法将这样的信息推送到仓库。 - HAr
@HAr 是的,我在考虑Git插件,它在其附加行为选项中具有稀疏检出(如https://issues.jenkins-ci.org/browse/JENKINS-29278中所示)。不确定它是否与管道兼容。 - VonC
@HAr 请参考 https://dev59.com/U1sV5IYBdhLWcg3wug3h:您可以在流水线的第一步中添加 git config core.sparsecheckout true - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接