Git子模块在Jenkins构建中没有更新

时间:2012-03-31 05:34:00

标签: git jenkins git-submodules

我在Jenkins的项目中有一个子模块。我已启用高级设置以递归方式更新子模块。

当我运行构建时,我看到工作区有子模块中的文件。问题是,它似乎是子模块的第一次修订。当我推送更改(在GitHub上托管的存储库)时,Jenkins似乎不更新子模块以获得正确的更改。有没有人见过这个?

7 个答案:

答案 0 :(得分:78)

请注意,Jenkins Git plugin 2.0将具有“提前子模块行为”,这应该确保子模块的正确更新:

git 2.0

commented作为vikramvi

  

Advanced sub-modules behavior>对此字段“Path of the reference repo to use during submodule update”,添加子模块git url。

Path


Owen B提及in the comments

  

对于身份验证问题,现在有一个“使用来自父存储库的默认远程的凭据”选项

JENKINS-20941

https://issues.jenkins-ci.org/secure/attachment/33245/Screen%20Shot%202016-07-08%20at%2010.09.17.png

答案 1 :(得分:26)

Jenkins网站上的Git插件文档在Recursive submodules部分中介绍了这一点。

摘录
  

GIT插件支持具有子模块的存储库,子模块本身又具有子模块。必须打开它:在作业配置 - >中部分源代码管理 Git - > 高级按钮(在要构建的分支下) - > 递归更新子模块

实施例

在作业的配置屏幕上,在“源代码管理”部分中,按添加按钮选择“高级子模块行为”。

s1

s2

然后选择“递归更新子模块”:

s3

答案 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克隆因凭据不正确而失败。

  1. 自动高级子模块克隆:Source Code Management >> Additional Behaviours >> Advanced sub-modules behaviours:导致凭据错误。
  2. git submodule update --init部分中的
  3. Execute Shell也因凭据错误而失败。
  4. 解决方案:

    我正在使用jenkins-1.574

    1. 选中Build Environment >> SSH Agent框。
    2. 选择正确的凭据(可能与Source Code Management部分
    3. 中选择的凭据相同)
    4. 更新Execute Shell部分

      中的子模块
      git submodule sync
      git submodule update --init --recursive
      
    5. 这是一个屏幕截图enter image description here

答案 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']]])