我在Jenkins的项目中有一个子模块。我已启用高级设置以递归方式更新子模块。
当我运行构建时,我看到工作区有子模块中的文件。问题是,它似乎是子模块的第一次修订。当我推送更改(在GitHub上托管的存储库)时,Jenkins似乎不更新子模块以获得正确的更改。有没有人见过这个?
答案 0 :(得分:78)
请注意,Jenkins Git plugin 2.0将具有“提前子模块行为”,这应该确保子模块的正确更新:
Advanced sub-modules behavior
>对此字段“Path of the reference repo to use during submodule update
”,添加子模块git url。
对于身份验证问题,现在有一个“使用来自父存储库的默认远程的凭据”选项
答案 1 :(得分:26)
Jenkins网站上的Git插件文档在Recursive submodules部分中介绍了这一点。
摘录GIT插件支持具有子模块的存储库,子模块本身又具有子模块。必须打开它:在作业配置 - >中部分源代码管理, Git - > 高级按钮(在要构建的分支下) - > 递归更新子模块。
在作业的配置屏幕上,在“源代码管理”部分中,按添加按钮选择“高级子模块行为”。
然后选择“递归更新子模块”:
答案 2 :(得分:25)
您是否知道您的Git存储库始终引用子模块的特定修订版? Jenkins不会自动更改修订版。
如果您想要使用更新的子模块,您必须在本地Git存储库中执行此操作:
cd submoduledir
git pull
cd ..
git add submoduledir
git commit -m 'Updated to latest revision of submoduledir'
git push # Go and watch Jenkins build with the new revision of the submodule
当你这样做时,Jenkins将在构建期间检查子模块的完全相同的修订版本。 Jenkins自己决定使用哪个子模块修订版。这是Git子模块和SVN外部的基本区别。
您可能希望阅读有关子模块的详细参考资料,例如: http://progit.org/book/ch6-6.html
答案 3 :(得分:17)
最后偶然发现了这样做的方法,而且很简单。
使用凭据的初始克隆运行正常,但后续submodule
克隆因凭据不正确而失败。
Source Code Management >> Additional Behaviours >> Advanced sub-modules behaviours
:导致凭据错误。 git submodule update --init
部分中的Execute Shell
也因凭据错误而失败。我正在使用jenkins-1.574
。
Build Environment >> SSH Agent
框。 Source Code Management
部分更新Execute Shell
部分
git submodule sync
git submodule update --init --recursive
这是一个屏幕截图
答案 4 :(得分:6)
看起来我找到了一个解决方案:
我添加了一个构建步骤来执行以下shell命令:
git submodule foreach git checkout master
git submodule foreach git pull
答案 5 :(得分:5)
如果您使用的是Jenkins Git模块,您可以将其设置为“在构建前擦除工作空间”,这样它将始终获得正确的子模块。
答案 6 :(得分:2)
我正在将脚本流水线与checkout插件一起使用。如果您希望子模块与您的存储库中的子模块相同,只需关闭跟踪子模块选项,如下所示:
checkout([$class: 'GitSCM', branches: [[name: '*/develop']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: true, recursiveSubmodules: false, reference: '', trackingSubmodules: false]], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '[myCredentials]', url: 'https://git.myRepo.git']]])