我在 Jenkins 的项目中有一个子模块。我已启用高级设置以递归更新子模块。
当我运行构建时,我看到工作区包含子模块中的文件。问题是,它似乎是子模块的第一个修订版。当我推送更改(托管在 GitHub 上的存储库)时,Jenkins 似乎没有更新子模块以获得正确的更改。有人见过这个吗?
请注意,Jenkins Git 插件 2.0 将具有“高级子模块行为”,这应确保子模块的正确更新:
评论:
> “Advanced sub-modules behavior
”针对此字段,添加子模块 git url。Path of the reference repo to use during submodule update
Owen B在评论中提到:
对于身份验证问题,现在有一个“使用父存储库的默认远程凭据”选项
在JENKINS-20941中看到:
Jenkins 站点上的 Git 插件文档中的以下部分对此进行了介绍:递归子模块。
摘录GIT 插件支持带有子模块的存储库,而子模块本身又具有子模块。不过,必须打开此功能:在作业配置 - >部分源代码管理,Git - >高级按钮(在要构建的分支下) - >递归更新子模块。
在作业的配置屏幕的“源代码管理”部分中,下拉“添加”按钮,选择“高级子模块行为”。
然后选择“递归更新子模块”:
如果您想使用子模块的较新版本,则必须在本地 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
.
使用凭据的初始克隆工作正常,但后续
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
这是屏幕截图
看来我找到了解决方案:
git submodule foreach git checkout master
git submodule foreach git pull
如果您使用 Jenkins Git 模块,您可以将其设置为“在构建之前清除工作区”,这样它将始终获得正确的子模块。
我正在使用带有结帐插件的脚本化管道。如果您希望子模块与存储库中的相同,只需关闭跟踪子模块选项,如下所示:
在“高级子模块行为”上,选中“将跟踪子模块更新到分支尖端”
git
调用时失败:
/usr/bin/git config --get submodule..url”返回状态代码1:
所以我丑陋的黑客解决方案是手动初始化子模块:
scmGit ... sh 'git submodule add --force "<sub-path>" "<sub-name>"'