我在詹金斯的一个项目中有一个子模块。我已启用高级设置以递归方式更新子模块。
当运行构建时,我看到工作空间中包含子模块中的文件。问题是,这似乎是子模块的第一个修订版。当我推送更改(托管在GitHub上的存储库)时,Jenkins似乎没有更新子模块以获取正确的更改。有人看过吗?
Answers:
请注意,Jenkins Git插件2.0将具有“高级子模块行为”,这应确保子模块的正确更新:
Advanced sub-modules behavior
>“Path of the reference repo to use during submodule update
”针对此字段,添加子模块git url。
对于身份验证问题,现在有一个“使用来自父存储库的默认远程的凭据”选项
在JENKINS-20941中看到这里:
这在Jenkins站点上的Git插件文档中的“递归子模块”部分下进行了介绍。
摘抄GIT插件支持带有子模块的存储库,而子模块本身又具有子模块。但是,必须打开它:在Job Configuration(工作配置) -> Section Source Code Management(源代码管理)中,Git- > Advanced Button(高级按钮)(在要构建的分支下)->递归更新子模块。
在作业的配置屏幕上的“源代码管理”部分中,下拉“添加”按钮,选择“高级子模块行为”。
然后选择“递归更新子模块”:
您是否知道您的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。
最终偶然发现了一种方法,它很简单。
带有凭据的初始克隆工作正常,但随后的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
这是一个屏幕截图
看来我找到了解决方案:
我添加了一个构建步骤来执行以下shell命令:
git submodule foreach git checkout master
git submodule foreach git pull
git submodule update --init --recursive
我在checkout插件中使用脚本化流水线。如果您希望子模块与存储库中的子模块相同,则只需关闭trackingSubmodules选项,如下所示:
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']]])