Jenkins使用GitSCM checkout时如何仅拉取指定的git submodule?
Jenkins Pipeline 实现方案
方案1:通过GitSCM内置的submoduleCfg参数指定拉取范围
你之前留空的submoduleCfg参数就是用来配置指定子模块的,修改后的配置如下:
checkout([ $class: 'GitSCM', branches: [[name: 'develop']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: true, recursiveSubmodules: false, // 关闭递归拉取所有子模块 reference: '', trackingSubmodules: false] ], submoduleCfg: [['name': 'submodule1']], // 仅拉取指定名称的子模块 userRemoteConfigs: [[url: "git@git.myorg.com/project/repo.git"]] ])
如果需要拉取多个指定子模块,在submoduleCfg数组里追加即可,比如submoduleCfg: [['name': 'submodule1'], ['name': 'submodule3']]
方案2:关闭自动拉取子模块,手动执行命令拉取指定内容
这种方案灵活性更高,适合需要动态选择子模块的场景:
checkout([ $class: 'GitSCM', branches: [[name: 'develop']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'SubmoduleOption', disableSubmodules: true, // 关闭自动拉取所有子模块 parentCredentials: true, recursiveSubmodules: false, reference: '', trackingSubmodules: false] ], submoduleCfg: [], userRemoteConfigs: [[url: "git@git.myorg.com/project/repo.git"]] ]) // 手动拉取指定子模块 sh ''' git submodule init submodule1 git submodule update submodule1 '''
Git 端原生实现方案
如果不修改Jenkins的checkout配置,也可以通过Git自带的子模块配置项禁用不需要拉取的子模块:
# 禁用不需要拉取的子模块 git config submodule.submodule2.update none # 执行子模块更新,已禁用的子模块会自动跳过 git submodule update --init
如果后续需要恢复拉取submodule2,执行git config --unset submodule.submodule2.update即可。
场景优化建议
- 优先选择手动执行Git命令的方案,可配合Jenkins构建参数动态选择要拉取的子模块,适配不同构建场景的需求。
- 你当前示例中的两个子模块配置了完全相同的
path,会导致拉取时互相覆盖,建议调整为不同的存储路径避免冲突。 - 如果子模块体积较大,可配合Git稀疏检出(sparse checkout)使用,进一步减少拉取的文件体积,提升构建效率。
内容的提问来源于stack exchange,提问作者SHC
相关产品推荐
相关产品推荐

