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

Ben*_*Ben 74 git git-submodules jenkins

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

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

Von*_*onC 83

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

git 2.0

作为评论vikramvi:

Advanced sub-modules behavior>" Path of the reference repo to use during submodule update"对这个字段,添加子模块git url.

路径


Owen B 在评论中提到:

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

JENKINS-20941中看到:

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

  • @zavié我认为您应该选择"高级子模块行为",然后选中将出现的"递归更新子模块"复选框,然后单击"保存". (8认同)
  • 如果您使用私有存储库,这不会很有效. (7认同)
  • 但是怎么样?您还可以提供详细步骤,可以选择哪些选项?谢谢. (6认同)
  • 这仅适用于您的repo不需要身份验证来读取您的git子模块的情况.詹金斯虫. (2认同)

slm*_*slm 28

这在Jenkins网站上的Git插件文档的下面是:递归子模块.

摘抄

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

在作业的配置屏幕中,在"源代码管理"部分中,向下拉" 添加"按钮,选择"高级子模块行为".

   S1

                                 S2

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

   S3


sti*_*sti 27

您是否知道您的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
Run Code Online (Sandbox Code Playgroud)

当你这样做时,Jenkins将在构建期间检查子模块的完全相同的修订版本.Jenkins自己决定使用哪个子模块修订版.这是Git子模块和SVN外部组件之间的根本区别.

您可能希望阅读有关子模块的良好参考,例如http://progit.org/book/ch6-6.html.


pot*_*nch 17

最后偶然发现了这样做的方法,这很简单.

问题:

使用凭据的初始克隆工作正常但后续submodule克隆失败并且凭据不正确.

  1. 自动高级子模块克隆Source Code Management >> Additional Behaviours >> Advanced sub-modules behaviours::导致凭证错误.
  2. git submodule update --init在该Execute Shell部分也失败,凭据错误.

解决方案:

我正在使用jenkins-1.574.

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

    git submodule sync
    git submodule update --init --recursive
    
    Run Code Online (Sandbox Code Playgroud)

这是一个截屏在此输入图像描述

  • 再也没有这样的复选框了. (2认同)

Ben*_*Ben 8

看起来我找到了一个解决方案:

我添加了一个构建步骤来执行以下shell命令:

git submodule foreach git checkout master
git submodule foreach git pull
Run Code Online (Sandbox Code Playgroud)

  • 正如@sti在另一个回复中所说的那样,你似乎正在尝试使用像SVN外部的Git子模块.不是将这些命令添加到Jenkins,最好将正确的子模块版本提交到主Git仓库.在构建项目的特定版本时,Jenkins将始终检查相同版本的子模块.可重复的构建是一件好事. (10认同)
  • @ben我遇到了这个命令你可能会觉得更有用,特别是如果你没有在子模块中使用master分支`git submodule update --init --recursive` (4认同)

小智 6

我正在使用带有结账插件的脚本化管道。如果您希望子模块与存储库中的子模块相同,只需关闭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']]])
Run Code Online (Sandbox Code Playgroud)


Ami*_*n Y 5

如果您使用的是Jenkins Git模块,则可以将其设置为"在构建前擦除工作空间",这样它将始终获得正确的子模块.